提纲
是什么(Android App Bundles简介)
为什么使用(aab的四个新功能及实用性)
怎么使用(怎么进行aab的改造)
怎么测试(可以通过google市场测试 而本文主要介绍aab本地测试工具 Bundletool)
简介
Android App Bundles(以下简称AAB)是2018年Google I/O大会带来的一款全新动态化框架,与Instant App不同,AAB是借助Split Apk完成动态加载。AAB的技术特点如下:
1. 不同于传统的App以整个Apk为单位,一个App被分割成了一个base Apk和多个split Apk。
2. Apk在安装后,可以按需请求下发或者更新模块Apk。
3. split Apk可以根据配置进行更细的划分,并根据当前运行的设备特征来请求特定的Apk。
4. 请求与安装过程必须通过Google Play商店进行,Google进一步统一标准和巩固自身生态。
5. split Apk功能只在Android 5.0(API 21)及以上机型使用,针对Android 4.4及以下机型Google Play商店仍会下发完整的Apk,以此来向下兼容。
以下是AAB运行时动态加载Apk与传统方式下发Apk的对比示意图:
AAB是一个动态化框架,它是利用Android Framework提供的split apks功能完成。所有安装split apk工作均是通过IPC交由google play完成。
好处
- Size 更小(最高可以减少 50% 应用体积)
- 安装更快 ( base.apk + split apks)
- Android App Bundle 是单一工件,因此无需构建、签名或管理多个 APK
- 支持动态发布 (为特定用户添加动态功能,而无需增加安装时的应用体积)
- 官方提供的系统级插件化方案
限制和成本
- 仅限于通过 Google Play 发布的应用,(Google 进一步巩固自身生态)
- 需要加入到 Google 的 beta program
- 最低支持版本 Android 5.0 (API level 21)
- 低于 Android 5.0 (API level 21) 的版本 GooglePlay 会优化 Size,但不支持动态交付。
- 需要升级到 Android Studio 3.2 以上,修改工程结构以便支持 App Bundle 格式
集成 Play Core Library
已知问题
- 不支持动态修改 resource tables
- 在 dynamic feature 模块的清单文件里,不能引用不在 base 模块里的资源
- 在 AS 中,更改 base 模块的 build variant,并不会自动更改依赖 base 的其他模块,所以构建时可能会报错
- 不同模块 build configuration 不同,可能会有冲突,导致构建或运行时出错,比如 buildTypes.release.debuggable = true
- 由于 AAB 可能包含多个 apk 文件,所以在把 apk 发送到设备时可能会因找不到资源,导致运行时异常,比如 adb刷机( sideloading )
- 动态下载模块需要安装最新的 Play Store app,所以有很小概率下载 app 时会回滚为下载一个 multi-APK(为 Android 4.4以下设备提供)
通过appbundle 很多应用都减少了较多的体积,平均减少体积为11%
aab的四个新功能
1. 应用内更新:即时or灵活
两种更新方式
即时更新,在应用内直接触发模块更新,用户停留在更新流程中直到更新完成。确认更新-更新下载,下载完成,安装(google管理流程)-继续使用
灵活更新:提示用户有新的更新-用户确认更新-google管理进行下载,下载的时候用户正常使用app-下载完成以后google提示重启,使用新的app
2. 按条件分发 根据国家,版本,机型是否有什么功能的维度,在安装时将模块发给用户
指定国家,版本,是否有ar功能等
指定参数,版本,功能
指定国家
3. 按需分发 根据场景,需要用到功能时,才分发相应模块给用户安装
定制应用的哪个功能,在什么时候,发给什么用户。如对于有上传需求的用户,需要上传时,才分发上传的功能模块
示例1:在app内提示下载相关模块和进行安装
示例2:安装时有新手模块,运行后续卸载新手模块
按需请求模块关键代码
按需删除模块(模块卸载不会立即发生。也就是说,设备会根据需要在后台卸载它们,以节省存储空间)
Play Feature Delivery 概览 使用功能模块实现自定义分发
https://developer.android.google.cn/guide/app-bundle/play-feature-delivery
处理请求错误
https://developer.android.google.cn/guide/playcore/play-feature-delivery#handle_request_errors
4.游戏资源分发 :根据设备分发
游戏可以大到1gb,或者分更多的资源包
为什么比cdn分发好
怎么进行aab的改造
Codelab
按需模块,可帮助您打造按需下载和安装功能的应用。(官方的手把手教学)
https://developer.android.com/codelabs/on-demand-dynamic-delivery
在您的项目中添加 Play Core 库
https://developer.android.google.cn/guide/playcore/play-feature-delivery#include_playcore
Play Feature Delivery 概览 使用功能模块实现自定义分发
https://developer.android.google.cn/guide/app-bundle/play-feature-delivery
测试工具 Bundletool 介绍
aab可以上传google市场进行测试(需要开发者账号),本地测试可以用这个工具来进行
Bundletool是一个用于处理 Android App Bundle 的命令行工具。使用 bundletool,您可以构建 AAB,提取连接的设备配置,生成 APK Set 文件 (.apks),从 APK Set 文件中提取或安装 APK,以及验证 App Bundle。由于 AAB 仅是一种发布格式,因此 bundletool 用于生成和测试 APK。
构建aab
用 Bundletool 工具测试 AAB
1. 下载 bundletool:下载地址https://github.com/google/bundletool/releases/tag/1.6.0
2. 切换到 aab 所在文件夹,生成 apks 文件
bundletool build-apks --bunlde=[bundle_name].aab --output=./[bundle_name].apks
3. 如果要 build 签名的 apks 文件,则需要加上 keystore 设置
bundletool build-apks --bundle=.aab --output=.apks --ks=[your_keystorename].jks/.keystore --ks-pass=pass: [your_keystore_pass] --ks-key-alias=[your_keystore_alias] --key-pass=pass:[your_keystore_pass]
4. 将 apks 安装在当前连接的设备上
bundletool install-apks --apks=[bundle_name].apks
可以看到只有对应的几个apk安装到设备中
另外介绍几个有用的功能:
输出当前设备对应的设备信息
bundletool get-device-spec --output=tcl.json --adb=/Library/Android_sdk/platform-tools/adb
生成当前设备对应的 apks
bundletool build-apks --connected-device --bundle=app.aab --output=./app1.apks --adb=/Library/Android_sdk/platform-tools/adb
根据aab文件生成一个全量apk
bundletool-all-0.10.3.jar build-apks --bundle=app.aab --output=all.apks --mode=universal
更多命令集合
https://blog.csdn.net/javaniceyou/article/details/107714732
https://developer.android.google.cn/guide/app-bundle/test/testing-fakesplitinstallmanager
参考
Android App Bundle探索
Android App Bundle解析
https://zhuanlan.zhihu.com/p/86995941
Android新特性——App Bundles
https://blog.csdn.net/kdsde/article/details/104002500
视频介绍地址
https://www.bilibili.com/video/BV1nJ411w7p3?from=search&seid=9721899851768761615