新姿势来啦 - Android App Bundle

新姿势来啦 - Android App Bundle

啥是 Android App Bundle

很好理解:Google 官方的插件化呗。Android App Bundle = Apk 动态打包,动态组件化的技术,与 Instant App 不同,AAB 是借助 Split Apk 完成动态加载,使用AAB动态下发方式,可以大幅度减少应用体积,总结下特性,就是2个:

  • 资源选择性加载
  • 动态下发 lib

资源选择性加载

怎么理解这个 资源选择性加载 呢,大家先个图:



image

android 因为要适配各种不同硬件和配置,我们有不同 dp 密度的图片文件,语言文件,不同指令集的 so 等,现在 Android App Bundle 来了可以优化这个问题,当然只限于 GooglePlay,在 google 市场我们下载 apk 时,市场先会检测我们手机的特性,然后选择最合适的资源打成 apk 再发给我们,比如我的手机只需要 arm-v7 的 so,hdpi 的图片,剩下的不会下发我们,这样可以大幅度减少 apk 的体积,尤其是对于 so 来说,一个高德地图,不同的 so 包加起来有小 10M 了,这比我们之前自己干的 apk 优化压缩可强多了,不愧是Google 大大,一出手就是神器,可惜啊,Google 服务国内用不了,不知道后续国内会不会跟进

动态下发库

这个可就是太 N 了,插件化实现的目标不就是解决动态性的问题吗,之前看 ios,google 封杀国内的插件化和热修复我还悲观了一阵,但是看到 Android App Bundle 后我们还是有些窃喜的,国内的也努力不是白费的,Google 这不就承认了国人的努力嘛

App Bundles 将一个 apk 拆分成多个 apk,我们的 apk 一般会被拆分为如下几个部分:

  • Base Apk:首次安装的apk,公共代码和资源,所以其他的模块都基于Base Apk;
  • Configuration APKs:native libraries 和适配当前手机屏幕分辨率的资源;
  • Dynamic feature APKs:不需要在首次安装就加载的模块。



image



image

当然啊注意 AAB 并不是一个插件化框架,它利用的是 Android Framework 提供的 split apks 技术来完成的,而所有安装 split apk 工作均是通过 IPC 交由 google play 完成,而不是国内插件化技术的反射代理 hook, 想了解更多关于split apks的内容,请看 官方文档

另外一点 Android App Bundle 很像阿里的动态化容器框架 Quinox,Quinox 里每个动态部署的库也叫 Bundle,不说这块是不是有什么 PY 交易在里面呢,Quinox 目前没有开源,应该是阿里插件化 Atlas 的进化,详情请看: 支付宝客户端架构解析:Android 容器化框架初探

需要 Android Studio 升级为 3.2 及其以上版本,以添加对 Dynamic Delivery 的支持,会把 base app 构建出构建成 .aab 文件



image



image

Android App Bundle 与 APK 不同,App Bundle 纯粹是为了上传文件而设计的,用户无法直接安装和使用它,.aab 只是一个 zip 文件,Google Play 从中生成优化的 APK 并将其提供给设备进行安装。可以考哪考哪 .abb 中的内容:



image

然后新的可动态部署的库会以 apk 的形式添加进来,具体请看 google 官方号: 如何获得更小的应用文件尺寸?来了解下 Android App Bundle

如何使用App Bundle

1.将你的Android Studio升级为3.2及其以上版本

2.添加对Dynamic Delivery的支持

其实就是一些基础apk需要东西,比如签名,MAIN入口等,详细请阅读:

developer.android.google.cn

3.构建App Bundle

当你是3.2以上的studio时候,就可以选择build bundle,来构建app bundle的文件

构建出来就是一个.aab文件

4.通过bundletool工具来测试你的.aab文件

下载地址: github.com/google/bundl
解压出来就是一个jar包,以bundletool-all-0.6.0.jar为例子
bundletool-all-0.6.0.jar build-apks --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks

这个命令构建出来的是没有签名的文件,要有签名的,需要如下:

bundletool 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

这些参数的说明详见如下:



image.png



无疑就是一些打包的签名,密码等,还有一些特殊的属性,详细大家可以看英文介绍,使用命令后,出来的是app.apks文件,我们可以解压缩一下,出来就是如下的内容:



image

从打包出来的东西,更印证了我们前面所说的原理

5.app的签名上传google play
6.将你的包上传到google console

兼容性问题

Api < 21的手机无法进行模块化 ,Google Play会对其进行Multiple Apks操作来进行下发操作。

Enable on-demand: 是否启用按需下载 ,如果不启用,会直接打进Apk

Fusing: 熔断操作,是否安装到不支持按需下载的设备中

Module title: 模块标题
对于动态组件的一些使用场景

关于动态模块的一些注意事项

当打开on-demand(按需加载)时,必须开启Fusing(熔断操作)才能正常的让Api21以下的手机使用module

一般情况下,动态模块下发之后需要重启App才能加载成功,但是如果你使用SplitCompat library,就可以立即生效,Access code and resources from downloaded modules

如果下载的模块太大,需要用户确认,GP要求大于10MB需要用户确认

国际上可以使用Google Play的Play Core Lib直接从gp后台下载我们上传好的dynamic module.

module中的AndroidManifest中定义的Activity不能有exported:true因为别的app不知道你何时安装好模块从而会引发问题

proguard文件在生效的时候会merge base module和所有的dynamic module中的文件,所以在编写proguard的时候要注意这个问题。

作者:前行的乌龟
链接: jianshu.com/p/0c551eaa2

来源:简书

编辑于 2020-09-16 08:09