apk 瘦身系列④:使用分割ABI 和 屏幕密度的方式来发布多个 apk

作者: rain 分类: 移动 发布时间: 2016-03-11 10:28 6 条评论

Android 是一个种类繁多的开放生态系统,设备从手表、手机到平板以及电视。每种设备都有自己特有的硬件设备,例如 屏幕大小、屏幕密度和 CPU 架构。

尽管在开发中我们建议使用一个 apk 来支持尽可能多的设备。如果你的 apk 非常大, 分开发布不同类型的 apk 可以节省很多空间。这样的话, 如果用户使用一个 ARM 处理器的手机将不用下载用于 x86 cpu 的代码。同样,用户使用中等屏幕密度的手机,也无需下载用于高密度手机中使用的资源文件。这样用户在安装和使用应用过程中可以节省很多空间。

play store 文档上详细解释了 Multi-APK 如何工作的。

创建 Multi-APK 的最简单的方式是使用 Android Studio 中的 splits 配置选项来配置。Splits 是 build.gradle 文件中的一个配置项,里面可以使用不同的屏幕密度和 cpu 架构来创建多个 apk。

Density splits

如果你还没有使用过屏幕密度分割方式, 建议你先看看android-topeka 这个示例项目。该项目包含了各种屏幕密度的资源文件,非常适合测试这种分割方式。

打开 app/build.gradle 文件,在里面添加如下内容:

上面的配置属性简单易懂。首先需要启用该功能,然后可以排除(或者包含)特定类型的配置项。最后指定应用兼容那些屏幕,通常从小到大有4种屏幕。

上面的配置,默认情况下还会创建一个包含所有配置的通用 apk。把一个低版本号的该 apk 发布到 play store 是必要的,这样其他屏幕密度设备就可以下载这个低版本的通用 apk了。这样做的具体原因有如下两点:

  1. Manifest 中的 指定了兼容的屏幕, 但是该属性的取值将来可能会变化或者增加。如果新的设备发布了,并且使用了新的屏幕密度,则已经发布的 4种屏幕密度的特殊 apk 均不适合该新设备,这样 兼容的通用版本就派上用场了。
  2. 目前 包含(和排除)语句只支持命名的屏幕密度,比如 hdpi、xhdpi 等, 不支持特定的 dpi, 比如 360dpi 等。

虽然 build 工具本身还不支持特定的dpi,但是可以使用一个自定义的脚本来解决该问题:

build.gradle

虽然看起来比较复杂,但确实能用。在上面的示例中, 280dpi 的设备将使用 xhdpi APK、而 420/400/360 dpi 设备将使用 xxhdpi 等.

可以查看系统 build 的中间文件来了解最终生成的AndroidManifest文件。 /app/build/intermediates/manifests/density/hdpi/debug/AndroidManifest.xml

这个文件是只包含 内容,最终会合并到 AndroidManifest.xml 中,其中之一的内容如下(\build\intermediates\manifests\density\mdpi\release\AndroidManifest.xml):

Play Store 可以使用这些信息来过滤那些不是命名屏幕密度的设备,当这种设备要安装应用的时候,Play Store 根据该信息来发送正确的 apk。

注意,如果有特殊的图片资源你想包含在所有的 apk 中,而不会被过滤掉,则可以把该资源放到 mipmap 文件夹下。这里通常放置应用的图标,原因是有些 launcher 会使用高屏幕密度的资源来获取图标。

Topeka 使用这种方式发布的 apk 大小如下:

应用中使用资源文件的数目(图片资源),决定了最终能节省多少空间。

提示:现在 使用矢量图已经可以兼容 之前的版本了。 使用矢量图就可以这种问题了。

ABI splits

abi 是应用到 cpu 架构的配置:

也可以配置是否生成一个统一的 apk 文件。需要注意的是: x86_64 和 x86 的版本号要高于其他的类型,应为大部分的 x86 cpu 都可以运行 arm 代码,但是性能很低。通过设置高版本号的方式可以确保 x86 设备都安装 x86 apk.

最佳实践: 使用统计来看看你的应用大部分用户都是那种类型的设备,如果你发现 80%的用户都是使用 arm cpu的设备,则你可以只发布一个 arm apk 和一个兼容的通用apk,这样 80%的用户都会使用最优化的 apk,而其他 20% 的用户使用通用的apk。确保大部分用户获得最佳的应用体验。

设置版本号(version codes)

下面是一个设置不同版本号的脚本:

上面的例子使用 3 个屏幕密度配置项,而 版本号通过 density versionCode * 1000000 + app的 versionCode 来计算。所以追踪生成的 apk 的版本号如下:

这样当不满足 MDPI、HDPI 和 XHDPI 的设备,将使用 通用的apk。把 OutputFile.DENSITY 修改为 OutputFile.ABI 可以把通用的功能应用到 abi 配置项上。

本文出自 云在千峰,转载时请注明出处及相应链接。

本文永久链接: http://blog.chengyunfeng.com/?p=889

Ɣ回顶部