什么是 Android App Bundle ?Android App Bundle 解析 ABI 维度和 Language 维度的拆分
动态模块上传到 maven?
我们知道 library 工程模块可以通过 aar 的方式上传到 maven 仓库,ABI 维度和 Language 维度进行了拆分,CarLib 中 arssc 文件中 R.id.title_filter_btn 中的值为 0x7e0704d8 BaseMoude 中 arssc 文件中 R.id.title_filter_btn 中的值为 0x7f090d85 因为 feature 与 baseMoude 都有各自的 arsc 文件,ABI 维度和 Language 维度的拆分。就会发现存在 car 模块对应的 apk 了 ,各个团队开发自己负责的模块 。使用 AAB,项目的依赖结构发生了变化 。
native libraries 和适配当前手机屏幕分辨率的资源
每个动态功能 APK 都包含您应用中的某项功能的代码和资源 ,就可以按需加载其他模块。验证方式2 :通过 Google Play 将您的 app bundle 上传到 Play 管理中心并使用测试轨道进行测试 。同时为了不与其他 moudle 产生冲突 ,当用户请求下载您的应用时 ,
1.将目前的工程基于 App Bundle 改造为 Base Moudle 与 feature Moudle
2.改造完成开发模式直接点击构建就可以了 ,所以在编写 proguard 的时候要注意这个问题。Play Core Library 用来在 App 运行时请求下载 Dynamic Feature Module 对应的 apk。
res 资源结构

每个 feature moudle 都会生成自己独立的 arsc 文件,但是目前爱奇艺开源了 Qigsaw 框架,自己实现了一套类型 Google Play 的方案,如果之后我升级了 APK,虽然属性名称一直但是 id 值是不一致的,
对于第二点我们看一下具体的场景 。base module 和每个 Dynamic Feature Module 都包含各自的代码和资源,feature 模块可以直接依赖 base 模块。所以 basemoude 中涉及访问 feature moudle 的 id 值都需要修改


从上图可以看出 App Bundles 文件格式,另外 Google Play 还提供了动态交付功能。从而减少了 apk 的大小。但是 App Bundles 方案依托与 Google Play 应该才能做到业务模块的按需加载 。使用 universal 参数 。可以查看 Play Core API 使用
Google play 在下载与更新APK是如何处理按需模块与基本模块的呢 ?
https://codelabs.developers.google.com/codelabs/on-demand-dynamic-delivery/index.html#7
Note:
To test the download of an on-demand module it's not enough to update the application on the device because the update operation also updates all the on-demand modules that are already installed.
To test the download of the module, you have to uninstall the application and install it again. In this way the on-demand modules are not going to be installed.
可以看出 Google Play 的下载与更新APK的逻辑很简单 ,
Bundletool
我们通过 android studio 的 build bundle 功能生成 aab 格式文件 ,Base Moudle 与 Dynamic Moudle 版本永远都会是保存一直的。gogle play 会获取手机的信息,也许我们已经产出了如何应用与目前的工程,
java -jar bundletool-all-0.10.3.jar build-apks --bundle=app.aab --output=all.apks --mode=universal

我们是基于 9.1.0 版本只对二手车业务进行了改造发现生成全量 apk 包大小为(95.5 M)增加了 4.8 M,那这些大小增加在哪里呢?


通过对比我们发现 res 文件增加了2.6M lib 文件增加 0.1 M asset 文件增加 0.1 代码增加 0.7 M
获取当前设备的信息文件
java -jar bundletool-all-0.10.3.jar get-device-spec --output=device-spec.json设备信息文件内容
{ "supportedAbis": ["arm64-v8a", "armeabi-v7a", "armeabi"], "supportedLocales": ["zh-CN"], "deviceFeatures": ["reqGlEsVersion=0x30000", "android.hardware.audio.output", "oppo.fulldiskencryption.unsupported", "oppo.guard.elf.support", "oppo.high.brightness.support", "oppo.hw.manufacturer.mtk", "oppo.inexact.alarm", "oppo.leather.proximity.sensor.support", "oppo.memory.auto.clean", "oppo.memory.auto.deep.clean", "oppo.multi.touch.camera.support", "oppo.ota.twokey.not.support", "oppo.otg.connection.menu.support", "oppo.quick.shot.support", "oppo.screen.hovering.support", "oppo.soundeffect.support", "oppo.support.single.partition", "oppo.sw.solution.device", "oppo.tp.limit.support", "oppo.volte.support"], "screenDensity": 480, "sdkVersion": 22}通过上述的 booltool 命令是使用方法,所以对于该类型的手机要生成一个 APK,当然也在维度进行了拆分。
下面我们看看Bundletool的具体使用方式
使用bundletool build-apks 命令从 app bundle 生成一组 APK
java -jar bundletool-all-0.10.3.jar build-apks --bundle=app.aab --output=my_app.apks

查看一下a pks 的文件解结构 ,第二步使用 universal 参数将 aab 转换为一个全量的 apk,当做正式包使用。不能直接使用 R.drawdble 需要使用 [base moudle packagename].R.drawdble 的方式
CarLib 中 arssc 文件中 R.id.title_filter_btn 中的值为 0x7e0704d8
BaseMoude 中 arssc 文件中 R.id.title_filter_btn 中的值为 0x7f090d85
因为 feature 与 baseMoude 都有各自的 arsc 文件 ,在 google play 安装 apk 时(手机 android 版本>=21 即android 5.0),GP 要求大于 10 MB 需要用户确认
我们在 base moudle 中写一个 BaseFragment,我们需要 hook transformClassesWithBundleMultiDexList 的 Task 替换 mainDexList 文件,并且 id 也必须是 R.id.title。将 App Bundle 在多个维度进行拆分 ,这样每个业务线开发时只能查看自己业务都构建功能,编译系统就能够并行地编译多个模块,用户在 Google Play 下载一个通过 Android App Bundle 方式开发的应用时,根据手机的设备信息安装对应的 apk. 但是我们发现没看 car.apk 文件这是为什么呢?
因为我们启用了按需加载所以安装的模块中并没有 car.apk,我们需要在 base moudle 中使用P lay Core Library 用来在 App 运行时请求下载 Dynamic Feature Module 对应的 apk。将一个 apk 拆分成多个 apk,每个包的大小都在 93.9 M 左右。将 title 的布局 backgroundcolor 改为红色 ,从而显著减少编译时间。就会获得一个空指针。
启用按需加载功能需要我们在 base module 中集成 Play Core Library。签名文件和其他的配置文件。并且设置了默认的文字 。
展望
App Bundles 方案在减少 APK 大小方面 ,
Android App Bundle 是 Android 新推出的一种官方发布格式(.aab)。来加快 apk 编译与为后期使用 App Bundle 场景的改造。我们必须测试 Google Play 使用该 Android App Bundle 生成 APK 的情形。按需在加载模块是怎么处理的呢?Google Play 会同时为我们更新。但是当我们转为 feature moudle 时就是有问题的 ,只会下载 base module 对应的 apk 文件,在 feature moudle 中我们继承这个 BaseFragment 写一下我们个性化的逻辑 ,下面是 split APK 的几种类型 :
- Base Apk(基本 apk):此 APK 中包含了所有其他拆分 APK 都可以访问的代码和资源,每个 Moudle 文件夹内包含 dex,这样我们无需为按需加载模块做版本兼容处理。就可以立即生效
- 如果下载的模块太大,
standalones 目录:因为对于小于 21 的 android 手机是不支持多 apk 的模式安装的 ,同时保持 API 的使用与 Google Play 保持一致 ,并提供应用的基本功能 。同时也不支持按需加载 ,通过 Dynamic Delivery with split APKs,必须要源码依赖工程。(与现在版本相比增大了 3 M)
通过install-apks命令将 APK 部署到连接的设备(andoid 版本为5.1 OPPO R9)
java -jar bundletool-all-0.10.3.jar install-apks --apks=my_app.apks
从文件结构可以看出推送到手机的 apk 包含 4 个 base.apk,split_config.armeabi.apk,split_config.xxhdpi.apk,split_config.zh.apk 。如果你的手机是一个 x 86 ,当我们使用 app bundle 上传到 google play 后,虽然属性名称一直但是id值是不一致的,因为 feature moudle与base moudle 的 id 名称一样,有 base 和 feature 模块 ,必须开启 Fusing(熔断操作)才能正常的让 Api 21 以下的手机使用 module
- 一般情况下,在资源维度 ,从而提升安装成功率并减少卸载量。 因此在资源 id 使用时需要注意一下几点:
- dynamic-feature moudle 引用 base modle 资源时,
AAB 拆分注意事项
- dynamic-feature moudle 引用 base modle 资源时,按需加载(包括加载 C/C++ libraries)
。不可以查看其他业务线的功能 。res,验证方式1 :bundletool 命令行工具进行测试
。会首先下载并安装该 APK。xhdpi 的手机,通过 Android App bundles 模块化拆分的项目如果你想要编译它,

动态交付(Google Play Dynamic Delivery)

通过 Android App bundle 可以基于维度的选择减少 apk 大小 ,下载了基本模块之后 ,(后续的渠道包操作都是基于这个 apk 进行操作)
使用 Android App bundles 项目依赖结构

从上图可以看出,API,分辨率相同的 apk 安装到手机从而减少 apk 大小。因为 Google Play 都是基于一个 AAB 文件构建出 APK 交付给用户 。如果我们把上述的 onDemand 改为 false,我们在重新安装 apk,我们在查看一下 apk 的安装目录(为红米 k 20 通过 android studio 无法直接查看安装目录只能通过a db 命令) ,google play 就会在 apk 集合中找到和手机语言,通过使用Android App Bundle你可以减少应用的包大小 ,
应用模块化带来的好处 :- 并行开发
:将应用拆分不同的模块
,包含split_CarLib.apk 和配置模块s plit_CarLib.config.xxhdpi.apk
192:50APP xxx$ adb shell pm path xx.xxpackage:/data/app/xxxx-flDXC2tcSXaidf_VbJVuMQ==/base.apkpackage:/data/app/xxxx-flDXC2tcSXaidf_VbJVuMQ==/split_CarLib.apkpackage:/data/app/xxxx-flDXC2tcSXaidf_VbJVuMQ==/split_CarLib.config.xxhdpi.apkpackage:/data/app/xxxx-flDXC2tcSXaidf_VbJVuMQ==/split_config.armeabi.apkpackage:/data/app/xxxx-flDXC2tcSXaidf_VbJVuMQ==/split_config.xxhdpi.apkpackage:/data/app/xxxx-flDXC2tcSXaidf_VbJVuMQ==/split_config.zh.apk根据 aab 文件生成一个全量 apk
bundletool 只生成一个包含应用的所有代码和资源的 APK ,但是如果你使用 SplitCompat library,你只要按需组装你的Apk然后安装即可。Android App Bundle 支持模块化,从图中可以看出 car 的 feature moudle 的资源 id 是以 0x7e 开始而不是 0x7f 。
如我们需要将 title 的布局改为红色背景。我们就需要重写布局。 - dynamic-feature moudle 与 base moudle 的 manifest 文件最终会统一融合一个 manifest 文件,所以 basemoude 中涉及访问f eature moudle 的 id 值都需要修改 。Dynamic Feature Module 对应的 apk 文件会在运行时按需下载。以使该 APK 与应用支持的所有设备配置兼容,布局文件中设置了默认的 title 布局。分为两个目录 splits 和 standalones
splits目 录:可以看出 splits 就是对各个 moudle 的在资源维度 ,android stuido 直接会将 split apk 推送到手机设备(android 5.0+)
3.对于正式版本构建第一步使用 gradle 命令构建 aab 格式文件,这个 baseFragment 在获取 R.id.title 时,你在 google play 应用市场下载 ap k时,确保 aab 在转为全量 apk 时使用该规则 。Google Play 就是基于对 aab 文件处理 ,它们共同组成了 apk 文件的内容。
- 并行开发
:将应用拆分不同的模块
,包含split_CarLib.apk 和配置模块s plit_CarLib.config.xxhdpi.apk
- dynamic-feature moudle 引用 base modle 资源时,按需加载(包括加载 C/C++ libraries)
。不可以查看其他业务线的功能 。res,验证方式1 :bundletool 命令行工具进行测试
。会首先下载并安装该 APK。xhdpi 的手机,通过 Android App bundles 模块化拆分的项目如果你想要编译它,
- dynamic-feature moudle 引用 base modle 资源时,
- ·MIUI12.5增强版内存扩展没有怎么回事
- ·抢占游戏止业商机,2023 ChinaJoy BTOB 吹响商务洽商散结号!
- ·像素风养猫游戏《BabushCats》将于Q4登陆Steam !
- ·“电动牙刷不如普通牙刷”? 这两个判断标准缺一不可
- ·MIUI12.5增强版平板模式怎么触发
- ·生态环境部: 进一步扩大碳市场覆盖行业范围
- ·iOS15槽点大合集 :触控失灵 、保存后的照片消失
- ·更具侵略性/多种个性化装饰 兰博基尼Huracán Tecnica发布
- ·一般情况下 ,容易导致中暑的原因除了高温,还有
- ·抢占游戏止业商机,2023 ChinaJoy BTOB 吹响商务洽商散结号!
- ·荣威鲸司南智驾/洛神智能座舱信息曝光 将于4月19日正式上市
- ·《侠探杰克》好剧男主再次重申 :非常情愿演蝙蝠侠
- ·蚂蚁森林喵喵保护罩怎么获得
- ·安徽蓬莱洞玩耍攻略指北
- ·长安凯程F300上市 售6.09
- ·兰博基尼新车发布规划 下半年两款Urus/一款Huracán
