1. 前言
在今年的Google I/O大會(huì)上病蛉,Google向 Android 引入了新 App 動(dòng)態(tài)化框架(即Android App Bundle淹禾,縮寫為AAB),AAB是借助Split Apk完成動(dòng)態(tài)加載碌更,使用AAB動(dòng)態(tài)下發(fā)方式瓶籽,可以大幅度減少應(yīng)用體積∈研現(xiàn)在只須在 Android Studio 中構(gòu)建一個(gè)應(yīng)用 (app bundle)崖媚,就可以將應(yīng)用所需的全部?jī)?nèi)容 (適用于所有設(shè)備) 都涵蓋在內(nèi):所有語(yǔ)言、所有設(shè)備屏幕大小恤浪、所有硬件架構(gòu)畅哑。它本身并不支持動(dòng)態(tài)化,只是動(dòng)態(tài)化的一個(gè)載體文件水由,真正實(shí)現(xiàn)邏輯并不是它荠呐。
1.Split APKs:
多apk 支持以下類型屏幕密度ABI,使用新的拆分機(jī)制砂客,構(gòu)建同一個(gè)應(yīng)用程序的hdpi版本和mdpi版本泥张,能夠共享很多的任務(wù) (如 javac,dx鞠值,proguard)媚创。此外,它會(huì)被認(rèn)為是一個(gè)單一的variant齿诉,并且同一個(gè)測(cè)試程序?qū)?huì)被用來(lái)測(cè)試每個(gè)多APK筝野。
2.Dynamic Feature Module:
這個(gè)概念感覺(jué)像是游戲里面到某個(gè)新地圖才開始下載那樣晌姚,不是一來(lái)就把所有資源都下載下來(lái)粤剧。這樣顯得apk更小了,而且就像游戲邏輯一樣挥唠,高級(jí)副本的地圖新手沒(méi)機(jī)會(huì)進(jìn)入抵恋,就不必要下載這部分內(nèi)容,有的用戶可能很久都不會(huì)用到部分功能宝磨,就可以放在dynamic feature module弧关,等要用的時(shí)候再下載盅安。
下面是Dynamic Delivery示意效果圖:
(左) 舊版 APK 交付樣例 - 將全部資源都交付至設(shè)備;
(右) 動(dòng)態(tài)交付樣例 - 只向設(shè)備交付必要資源
具體一下說(shuō)明和視頻演示可以查看網(wǎng)站【https://developer.android.com/guide/app-bundle/】
好處:
Size更小【個(gè)人理解是相對(duì)用戶來(lái)感知來(lái)說(shuō)更小】
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被優(yōu)化相對(duì)來(lái)說(shuō)安裝會(huì)更快】
支持動(dòng)態(tài)發(fā)布
限制
僅限于通過(guò) Google Play 發(fā)布的應(yīng)用世囊,(Google進(jìn)一步鞏固自身生態(tài))
需要加入到 Google 的 beta program
最低支持版本Android 5.0 (API level 21)
低于Android 5.0 (API level 21) 的版本GooglePlay會(huì)優(yōu)化Size别瞭,但不支持動(dòng)態(tài)交付。
成本
需要升級(jí)到Android Studio 3.2修改工程以便支持App Bundle格式
集成Play Core Library
2.原理
結(jié)合Google Play Dynamic Delivery (動(dòng)態(tài)交付) 株憾, 實(shí)現(xiàn)動(dòng)態(tài)功能
Android App Bundle 支持模塊化蝙寨,通過(guò)Dynamic Delivery with split APKs,將一個(gè)apk拆分成多個(gè)apk嗤瞎,按需加載(包括加載C/C++ libraries)墙歪,這樣開發(fā)者可以隨時(shí)按需交付功能,而不是僅限在安裝過(guò)程中贝奇。
- Base Apk
首次安裝的apk虹菲,公共代碼和資源,所以其他的模塊都基于Base Apk - Configuration APKs
native libraries 和適配當(dāng)前手機(jī)屏幕分辨率的資源 -
Dynamic feature APKs
不需要在首次安裝就加載的模塊
具體的結(jié)構(gòu)如下:
3.使用方式
具體使用時(shí)掉瞳,在Android Studio新增一項(xiàng)module——Dynamic Feature Module毕源。
選中Dynamic Feature Module直接next到以下頁(yè)面
? Enable on-demand: 是否支持按需下載模式。如果不支持菠赚,那么該feature則在安裝app時(shí)被安裝脑豹。
? Fusing: 如果app運(yùn)行在Android 5.0(不包括5.0)以下,勾選Fusing則表示該feature會(huì)被一起打包至完整apk中衡查。
? Module Title當(dāng)確認(rèn)用戶是否想要下載模塊時(shí)瘩欺,平臺(tái)使用該標(biāo)題來(lái)向用戶標(biāo)識(shí)模塊。
新建項(xiàng)目生成的項(xiàng)目結(jié)構(gòu)圖如下:
如圖feature生成的目錄結(jié)構(gòu)和我們常用的module結(jié)構(gòu)相差無(wú)幾拌牲。
例如谷歌官方提供的demo項(xiàng)目結(jié)構(gòu)如下:
在demo中有四個(gè)feature俱饿,通過(guò)module名很清楚這些feature是舉例介紹如何訪問(wèn)代碼、資源塌忽、so等拍埠。
我們可以看到源碼里面主要是通過(guò)一個(gè)SplitInstallManager類來(lái)進(jìn)行管理不同的模塊的。
以下是加載對(duì)應(yīng)模塊的簡(jiǎn)單使用:
dynamic feature module編譯所使用的插件com.android.dynamic-feature通過(guò)編譯產(chǎn)物分析土居,運(yùn)行示例后枣购,發(fā)現(xiàn)在所有dynamic feature模塊build目錄下均會(huì)生成apk文件。
直接運(yùn)行后我們?cè)趂eature 下打開目錄查看如下:
可以發(fā)現(xiàn)會(huì)生成一個(gè)apk 文件擦耀,這個(gè)apk文件就是用來(lái)被base.apk 調(diào)用的棉圈。
接著反編譯base.apk,會(huì)發(fā)現(xiàn)兩個(gè)的現(xiàn)象:
? 所有dynamic feature module的代碼眷蜓、資源分瘾、so并未打包至主apk中。
? 主apk manifest信息包括所有dynamic feature module的manifest吁系,即feature manifest會(huì)被合并至主apk manifest中德召。
以上兩個(gè)現(xiàn)象需要我們?cè)谀K劃分的時(shí)候做好規(guī)劃,隨著需求不斷迭代白魂,結(jié)構(gòu)規(guī)劃可能需要做對(duì)應(yīng)的調(diào)整。
? Build Bundle(s)
Android App Bundle:提供一種全新編譯產(chǎn)物格式文件aab上岗,使用Android Studio提供的App Bundle即可福荸。
生成方式如下:
1.通過(guò)命令行生成,在命令行里輸入以下命令即可:
./gradlew :base:bundleDebug
2.通過(guò)Android Studio 生成
點(diǎn)擊“Build Bundle(s)”之后我們會(huì)在主工程build目錄下回生成bundle.aab文件肴掷,該文件是壓縮格式文件逞姿,解壓該aab文件內(nèi)容如下:
由此可以看到其結(jié)構(gòu)同項(xiàng)目結(jié)構(gòu)分包相似。
打開其中具體某一目錄可以發(fā)現(xiàn)其和正常apk解壓后的結(jié)構(gòu)相差無(wú)幾:
從aab文件內(nèi)容捆等,可知其包含base和feature的代碼滞造、資源、so等栋烤,同時(shí)還有BundleConfig.pb這一配置文件谒养,該配置文件是google play用于拆分apk。如果我們需要在google play上支持動(dòng)態(tài)發(fā)布明郭,只需要上傳aab文件即可买窟,后續(xù)工作交給google play完成。
4. 使用bundletool測(cè)試Android應(yīng)用程序包
在本地使用 bundletool命令行工具:
從GitHub下載bundletool 工具【https://github.com/google/bundletool/releases】
執(zhí)行java –jar bundletool.jar 可以將”.aad”文件轉(zhuǎn)換成”apks”文件薯定。
例如上述生成一個(gè)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
執(zhí)行安裝命令:
java -jar bundletool.jar install-apks --apks=bundle.apks
【目前windows 10 好像是有bug】
有關(guān)于命令參數(shù)的配置可以見下表:
獲取鏈接設(shè)備信息,命令如下::
java -jar bundletool.jar get-device-spec --output=tcl.json --adb=D:/Android/SDK/platform-tools/adb.exe
我們分割出該apks文件之后就會(huì)生成以下apk话侄。命令如下:
java -jar bundletool.jar extract-apks --apks=bundle.apks --output-dir=D:\bundle\apks --device-spec=tcl.json
由此也可以證明我們的生成.aad 文件是正確的亏推。