为向往生活努力奋斗!

如何利用 Android App Bundle 进行 APK 瘦身 28%

2019.10.20

介绍

Android App Bundle 是 Google 在 2018 年 IO 大会上推出一种新发布格式,通过此格式发布的应用,Google Play 商店会根据用户设备屏幕密度,CPU 架构 下发其对应的 APK,这就意味着用户下载的 APK 不会存在与自己设备不匹配的格式资源,从而也达到了大幅度减少 APK 大小。另外利用此格式还可以实现 动态组件化 的技术,此文不做该技术的过多介绍,感兴趣的可以到 官方文档 了解。

条件

如果使用 Android App Bundle 发布格式,必须加入 Google Play 应用签名计划。关于如何加入,可以详细查看这份 官方指南

注意:

一旦你的应用使用了 Google 应用签名,用户下载的 APK 签名将会是 Google 生成的签名,而不是你自己为应用的签名。因此需要检查你应用使用到的第三方平台 SDK,如果有需要配置签名信息的,记得将 Google 生成的签名信息配置到其对应的地方。

原理

生成的 Android App Bundle 包,是不可以直接安装的,App Bundle 会根据设备屏幕密度、CPU 架构、Language 多个维度进行拆分,组装成对各种组合的 Apk;然后 Play Store 会根据用户设备配置,提供对应的组合 APK。通过下图可以促进你理解:

例如,用户的设备配置如下:arm,xhdpi,en_US,则最终用户下载的 APK 将是(base + arm + xhdpi + en).apk的组合。

如果用户在设备设置中更改/添加了新语言,则 Play Store 会检测到此情况,并尝试为在设备下载新的其他语言分类 APK。如果互联网不可用,则稍后将下载。

如何构建 Android App Bundle

Android Studio 3.2 版本及以上

Android Studio –> Build –> Generate Signed Bundle/APK

通过命令行构建

./gradlew bundleRelease

如何测试生成出来的 Android App Bundle

本地使用 bundletool 命令行工具

bundletool 是一种底层工具,可供 Gradle、Android Studio 和 Google Play 用于编译 Android App Bundle 或将 App Bundle 转换为部署到设备的各种 APK。您也可以将 bundletool 作为一种命令行工具,用于重新创建、检查和验证应用 APK 的 Google Play 服务器端版本。

下载地址:GitHub 代码库

1. 将 App Bundle 生成一组 APK

将你从 Android Studio 构建生成的 App Bundle 为应用支持的所有设备生成一组 APK,用一个以 .apks 为文件扩展名的容器装起来。

如果您未指定签名信息,bundletool 会尝试使用调试密钥为 APK 签名,这里我为了方便我将这些 APK 部署到设备,添加了应用的签名信息。

java -jar bundletool.jar build-apks 
--bundle=/MyApp/my_app.aab
--output=/MyApp/my_app.apks
--ks=/MyApp/keystore.jks
--ks-pass=file:/MyApp/keystore.pwd
--ks-key-alias=MyKeyAlias
--key-pass=file:/MyApp/key.pwd

2. 将 APK 安装到连接的设备

生成一组 APK 后,bundletool 可以将该组中适当 APK 的组合安装到连接的设备。

java -jar bundletool.jar install-apks --apks=/MyApp/my_app.apks

如果连接了多个设备,请添加 –device-id=serial-id 标记来指定目标设备。

测试

通过上面两条命令,已经为你即将发布的应用安装到你的设备上,最后检查下 app 运行情况,没问题就可以将刚才生成的 aab 上传到商店后台进行版本发布。

更多

想了解更多关于 bundletool 工具的使用方法,可以到 这里 了解。

直接将 App Bundle 上传到应用 Play 商店后台

这个操作很简单,跟平常发布版本操作差不多,具体如下:

版本管理 –> 应用版本 –> 创建版本 –> 添加 Android App Bundle –> 保存

此时想检查刚上传的 App Bundle 生成的 APK 情况,以及下载生成的 APK 到本地进行测试,操作步骤如下:

版本管理 –> 软件工件库 –> 软件工件库草稿找到刚才上传的版本 –> 探索 –> 下载设备专属 APK

实验

本地语言包

如果本身 App 是支持多语言的,在应用内切换语言,Play Store 无法检测应用语言改变,因此需要禁止 App Bundle 根据语言拆分安装包。

在 App 下的 build.gradle 文件添加以下配置:

android {
    bundle {
        language {
            // Specifies that the app bundle should not support
            // configuration APKs for language resources. These
            // resources are instead packaged with each base and
            // dynamic feature APK.
            enableSplit = false
        }
    }
}

图片资源

目前大部分应用图片资源只适配一些高分辨率 xxxhdpi,xxhdpi。

验证 App Bundle 拆分出来的低分辨率包,是否会不存在高分辨率的图片资源?

将生成 “apks” 的文件更改为 “zip” 格式 –> 解压 –> standalones –> 选一个低分辨率的安装包 –> 更改为 “zip” 格式 –> 解压 –> 查看资源文件

结果:低分辨率包依然存在我们项目高分辨率的图片。

最后

最后来看下使用 App Bundle 生成的 APK,与上个版本相比的数据。

资料

推荐阅读