Android动态化框架App Bundles

1. 前言

在今年的Google I/O大会上,Google向 Android 引入了新 App 动态化框架(即Android App Bundle,缩写为AAB),AAB是借助Split Apk完成动态加载,使用AAB动态下发方式,可以大幅度减少应用体积。现在只须在 Android Studio 中构建一个应用 (app bundle),就可以将应用所需的全部内容 (适用于所有设备) 都涵盖在内:所有语言、所有设备屏幕大小、所有硬件架构。它本身并不支持动态化,只是动态化的一个载体文件,真正实现逻辑并不是它。
1.Split APKs:
多apk 支持以下类型屏幕密度ABI,使用新的拆分机制,构建同一个应用程序的hdpi版本和mdpi版本,能够共享很多的任务 (如 javac,dx,proguard)。此外,它会被认为是一个单一的variant,并且同一个测试程序将会被用来测试每个多APK。
2.Dynamic Feature Module:
这个概念感觉像是游戏里面到某个新地图才开始下载那样,不是一来就把所有资源都下载下来。这样显得apk更小了,而且就像游戏逻辑一样,高级副本的地图新手没机会进入,就不必要下载这部分内容,有的用户可能很久都不会用到部分功能,就可以放在dynamic feature module,等要用的时候再下载。
下面是Dynamic Delivery示意效果图:


image

(左) 旧版 APK 交付样例 - 将全部资源都交付至设备;
(右) 动态交付样例 - 只向设备交付必要资源
具体一下说明和视频演示可以查看网站【https://developer.android.com/guide/app-bundle/
好处:
Size更小【个人理解是相对用户来感知来说更小】
Google has claimed that it can reduce app sizes up to 50 percent
Its own apps like YouTube and other apps like LinkedIn which saw a 23% file reduction
安装更快【base.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

2.原理

结合Google Play Dynamic Delivery (动态交付) , 实现动态功能
Android App Bundle 支持模块化,通过Dynamic Delivery with split APKs,将一个apk拆分成多个apk,按需加载(包括加载C/C++ libraries),这样开发者可以随时按需交付功能,而不是仅限在安装过程中。

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


    image.png

3.使用方式

具体使用时,在Android Studio新增一项module——Dynamic Feature Module。


image.png

选中Dynamic Feature Module直接next到以下页面


image.png

• Enable on-demand: 是否支持按需下载模式。如果不支持,那么该feature则在安装app时被安装。
• Fusing: 如果app运行在Android 5.0(不包括5.0)以下,勾选Fusing则表示该feature会被一起打包至完整apk中。
• Module Title当确认用户是否想要下载模块时,平台使用该标题来向用户标识模块。
新建项目生成的项目结构图如下:


image.png

如图feature生成的目录结构和我们常用的module结构相差无几。
例如谷歌官方提供的demo项目结构如下:


image.png

在demo中有四个feature,通过module名很清楚这些feature是举例介绍如何访问代码、资源、so等。
我们可以看到源码里面主要是通过一个SplitInstallManager类来进行管理不同的模块的。
image.png

以下是加载对应模块的简单使用:
image.png

dynamic feature module编译所使用的插件com.android.dynamic-feature通过编译产物分析,运行示例后,发现在所有dynamic feature模块build目录下均会生成apk文件。
直接运行后我们在feature 下打开目录查看如下:


image.png

可以发现会生成一个apk 文件,这个apk文件就是用来被base.apk 调用的。
接着反编译base.apk,会发现两个的现象:
• 所有dynamic feature module的代码、资源、so并未打包至主apk中。
• 主apk manifest信息包括所有dynamic feature module的manifest,即feature manifest会被合并至主apk manifest中。
以上两个现象需要我们在模块划分的时候做好规划,随着需求不断迭代,结构规划可能需要做对应的调整。

• Build Bundle(s)
Android App Bundle:提供一种全新编译产物格式文件aab,使用Android Studio提供的App Bundle即可。
生成方式如下:
1.通过命令行生成,在命令行里输入以下命令即可:
./gradlew :base:bundleDebug
2.通过Android Studio 生成


image.png

点击“Build Bundle(s)”之后我们会在主工程build目录下回生成bundle.aab文件,该文件是压缩格式文件,解压该aab文件内容如下:


image.png

由此可以看到其结构同项目结构分包相似。

打开其中具体某一目录可以发现其和正常apk解压后的结构相差无几:


image.png

从aab文件内容,可知其包含base和feature的代码、资源、so等,同时还有BundleConfig.pb这一配置文件,该配置文件是google play用于拆分apk。如果我们需要在google play上支持动态发布,只需要上传aab文件即可,后续工作交给google play完成。

4. 使用bundletool测试Android应用程序包

在本地使用 bundletool命令行工具:

从GitHub下载bundletool 工具【https://github.com/google/bundletool/releases】

执行java –jar bundletool.jar 可以将”.aad”文件转换成”apks”文件。

例如上述生成一个bundle.aab 文件,采用命令生成bundle.apks文件

java -jar bundletool.jar build-apks --bundle=bundle.aab --output=bundle.apks --ks=features.jks --ks-pass=pass:tcl123 --ks-key-alias=key0 --key-pass=pass:tcl123

执行安装命令:

java -jar bundletool.jar install-apks --apks=bundle.apks

【目前windows 10 好像是有bug】

有关于命令参数的配置可以见下表:


image.png

获取链接设备信息,命令如下::
java -jar bundletool.jar get-device-spec --output=tcl.json --adb=D:/Android/SDK/platform-tools/adb.exe


image.png

我们分割出该apks文件之后就会生成以下apk。命令如下:
java -jar bundletool.jar extract-apks --apks=bundle.apks --output-dir=D:\bundle\apks --device-spec=tcl.json
image.png

由此也可以证明我们的生成.aad 文件是正确的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,724评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,104评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,142评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,086评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,076评论 5 370
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,914评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,220评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,871评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,318评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,834评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,951评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,574评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,162评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,162评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,383评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,349评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,652评论 2 343

推荐阅读更多精彩内容