暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

AppBundle构建踩坑

拖地先生 2019-11-08
3082

在《七招优化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)
vivox23916.1MB16.85MB-56.89MB11.88MB-45.46MB
华为HRY-AL00Ta9.116.1MB39.31MB34.35MB
华为 PRA-AL008.016.1MB42.12MB39.86MB
MI PAD4.4.416.1MB29.83MB27.27MB
GalaxyC88.1.016.1MB38.13MB35.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)
红米69.0.016.1MB15.99MB--62.38MB18.71MB-- 53.84MB
vivox239.0.016.1MB15.99MB--41.85MB18.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




拖地先生,从事互联网技术工作,在这里每周两篇文章,一起聊聊日常的技术点滴和管理心得。

如果对你有帮助,让大家也看看呗~

文章转载自拖地先生,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论