在《七招优化Android包体减少30%》中提到谷歌应用商店提供的Bundle功能,是对包体的一项尝试,上周完成了完整的验证,在安装测试上遇到了一些坑,整理如下。
一、初次配置
生成aab的包
必要条件
Android Studio 3.2+
classpath 'com.android.tools.build:gradle:3.5+'
可选的配置
在app build,gradle
android{
bundle {
language {
enableSplit = false
}
density {
enableSplit = true
}
abi {
enableSplit = true
}
}
}
true为开启,false为不开启
Build Bundle
Build-->Build Bundle(s)/Apk(s)-->Build Bundle(s)
即可查看生成的.aab包
二、日常使用
工具集存放位置:E:\AppBundle工具集\AppBundleExc
按照以下工作流执行即可
1.打包
通过 Build --> Generate signed Bundle/APK --> Android app Bundle,填写秘钥与选择类型(debug /release)打出aab包
填写选项:
2.测试aab包(多机型)
测试aab在不同架构下生成包的正确性,大小,与安装后是否异常的问题
写了一些脚本工具化:
使用app.abb包生成基准的apks
生成当前连接到PC的设备,对应的apks,解压查看内部结构
安装对应的apks到当前连接设备,验证APK实际安装大小与app是否异常
上传aab包到google play时,需要一个jks的pem文件
三、App Bundle介绍
APK 拆分
上传一个 app bundle,Google Play 就会生成正确的 APK 拆分,然后选择要投放到每个设备的正确的 APKs。
aab与apks说明
这里以我们的包为例,只对架构做拆分
1.aab包
一级目录:
二级目录:
可以看到,二级目录和我们普通的apk是有区别的,多了root、和几个.pb的文件,
manifest
就像在 APKs 中找到的那样,每个 app bundle 都有一个清单文件。然而,与 APK 不同,它们不以二进制格式存储 - 它被编译成协议缓冲区格式,这使得工具在需要时更容易转换。
resources.pb
类似于可以在我们当前的 APK 文件中找到的 resource.arac 文件,resources.pb 文件是一个资源表,其中描述了我们的应用程序内部存在的资源和目标的细节。.pb 扩展名是由协议缓冲区格式生成的,该格式用于在将 app bundle 转换为 APK 中使用的二进制格式之前对其进行转换。
assets.pb
这相当于应用程序 assets 的资源表,只有在应用程序中使用 assets 时才会出现。
native.pb
这相当于 native libraries 的资源表,只有在应用程序中使用 native libraries 时才会出现。
2.生成基准的apks
结构如下:
splits打开后:
standalones
可以看到,总的apks中包含了我们设置的架构包,standalones中为独立的包:在5.0以下设备,会自动选用这里的包安装;大于5.0,则会在splits中通过master与架构包组合安装一个apk.
3.对应设备的apks
在一个arm64结构的连接设备上生成apks,解压如下
可以看到,将次apks安装到设备上,是有一个master包和对应架构包组合生成apk的。
四、项目应用app bundle的情况
1. 安装包大小变化
修改为app_bundle后测试
机型 | 版本 | 包大小 | 普通安装后(MB) | app bundle安装后(MB) |
---|---|---|---|---|
vivox23 | 9 | 16.1MB | 16.85MB-56.89MB | 11.88MB-45.46MB |
华为HRY-AL00Ta | 9.1 | 16.1MB | 39.31MB | 34.35MB |
华为 PRA-AL00 | 8.0 | 16.1MB | 42.12MB | 39.86MB |
MI PAD | 4.4.4 | 16.1MB | 29.83MB | 27.27MB |
GalaxyC8 | 8.1.0 | 16.1MB | 38.13MB | 35.57MB |
2.尝试错误解决方案
错误描述:找不到.so库。经过各种尝试,结论为系统合成安装包时出现错误。
1.升级fresco 升级至1.12.0 无效
2.更改build.tool版本 3.2.0 版本不对应 无效
3.添加单独的SoLoader
implementation 'com.facebook.soloader:soloader:0.8.0'
configurations.all {
resolutionStrategy {
force "com.facebook.soloader:soloader:0.8.0"
}
}
4.添加
implementation 'com.facebook.fresco:imagepipeline-okhttp3:1.13.0'
5.升级到2.0.0 ,排除soloader,单独引入0.8.0最新版
3.对崩溃有效的解决方案
此方案有效解决崩溃,但是在部分机型,如vivo上无法使用APP。查阅app bundle的库issue,在部分机型上,只能通过google play安装验证
通过在build.gradle中引入google play支持库
implementation 'com.google.android.play:core:1.6.3'
在App初始化时判断App是否缺少了拆分包,如果缺少则无法使用。会提示用户跳转到google play重新下载APP。
https://github.com/google/bundletool/issues/98
if (MissingSplitsManagerFactory.create(this).disableAppIfMissingRequiredSplits()) {
// Skip app initialization.
return;
}
google play应用商店验证下载通过,方案通过
Google Play 下载对比
机型 | 版本 | 包大小 | 普通安装后(MB) | google play安装后(MB) |
---|---|---|---|---|
红米6 | 9.0.0 | 16.1MB | 15.99MB--62.38MB | 18.71MB-- 53.84MB |
vivox23 | 9.0.0 | 16.1MB | 15.99MB--41.85MB | 18.71MB-- 35.48MB |
4.使用到的命令
1.查看当前安装的包是否有拆分包:
adb shell dumpsys package com.dailyyoga.inc
ps:目前vivo手机只显示 base.apk,没有架构包
2.通过adb安装多个包
adb install-multiple base-master2.apk base-arm64v8a_2.apk
ps:测试无法使用APP
5.总结
一、经过研究与实践,总结app bundle流程如下:
打包--> 生成.aab文件--> app bundle本地打包工具安装到设备测试--> 上传.aab包到Goole Play (开启内部应用分享全面测试)--> 测试应用稳定性--->上传发布
二、经工具测试,app bundle方式安装的包,在手机导出时,只有master包,不包含lib下的so库文件, 经测试,直接安装master包,会出现无法安装和崩溃的异常。在一定程度上有安全性保障,可以防止不法分子直接改造我们的包,在不同渠道上传。
问题链接与参考
app bundle https://github.com/google/bundletool/issues/98
fresco https://github.com/facebook/fresco/issues/2253
工具使用:https://blog.csdn.net/qq_33404903/article/details/88052867
拖地先生,从事互联网技术工作,在这里每周两篇文章,一起聊聊日常的技术点滴和管理心得。
如果对你有帮助,让大家也看看呗~