androidAppBundle是一系列的文件,主要目的是app"瘦身"吧,需要借助bundletool最終要變成相應(yīng)的apk部署到設(shè)備上。
- splitAPKs介紹
- project生成bundle
- bundle生成apk
前言:
-
androidBundle是什么?
googlePlay上一種新的上傳格式,以前是傳apk,現(xiàn)在可以傳Bundle。GP通過(guò)dynamic Delevery從Bundle中現(xiàn)在特定的配置給用戶。 -
androidBundle的使用場(chǎng)景和優(yōu)勢(shì)
1.split APKs。
這個(gè)概念類似多apk,不過(guò)現(xiàn)在不用打包上傳很多不同apk了,只需要上傳bundle,因?yàn)閍pk生成是gp操作的。
面向多國(guó)家針對(duì)不同語(yǔ)言、屏幕、abi做不同適配的app。由于需要各種適配,配置文件較多,apk就變大了。但是實(shí)際上某一用戶使用時(shí),如需要english+480+armabi,其他的配置其實(shí)就可以不要了。googlePlay的dynamicDelevery可以幫我們管理,用戶下載的apk變小了,開(kāi)發(fā)者也不用打包很多apk了。
2.dynamic feature module
這個(gè)概念感覺(jué)像是游戲里面到某個(gè)新地圖才開(kāi)始下載那樣,不是一來(lái)就把所有資源都下載下來(lái)。這樣顯得apk更小了,而且就像游戲邏輯一樣,高級(jí)副本的地圖新手或者一部分菜雞永遠(yuǎn)也沒(méi)機(jī)會(huì)進(jìn)去一樣,有的用戶可能很久都不會(huì)用到部分功能,就可以放在dynamic feature module,等要用的時(shí)候再下載。
當(dāng)然app都需要一個(gè)BaseMoudle,就是以apply plugin application那個(gè),主模塊和分模塊有一些規(guī)則,有點(diǎn)像是多模塊application和library的關(guān)系。不過(guò)dynamic feature module是apply plugin: 'com.android.dynamic-feature' -
嘗鮮需要的環(huán)境
1.環(huán)境
需要as3.2 canary14+ 以及gralde3.2+才能使用buildBundle工具
2.配置
既有的項(xiàng)目生成splitAPKs可以自動(dòng)生成。但是如果要搞dynamic feature module,就要加新的dynamicModule的相關(guān)設(shè)置,可能要涉及到重構(gòu),把其他獨(dú)立業(yè)務(wù)抽成dynamic feature module。
Split Apks(5.0+)
-
baseApk
包含了app所有基礎(chǔ)功能的code和resuources,這個(gè)在第一次下載的時(shí)候就會(huì)安裝。
-
configuration Apks
這個(gè)配合著baseApk或者dynamic feature apk使用。
包含各種特定配置的nativelibrarise和resources。
GP通過(guò)bundle里面的資源可以自動(dòng)生成,不用我們操心。
-
Dynamic feature Apks
這個(gè)是在后面按需的時(shí)候才會(huì)下載安裝,第一次下載不會(huì)。
比如一些模塊功能如拍照,第一次安裝不會(huì)安裝這個(gè)apk,后面拍照的時(shí)候才去下載。
splitApks需要5.0以上才支持,5.0以下的gp會(huì)按照mutilApk管理,所以不用擔(dān)心api兼容問(wèn)題。

project生成bundle
官方提供了兩種方法,一種是as3.2+gradle3.2可以直接buildBundle,一種是通過(guò)bundleTool命令行生成。
1.AS的方式生成
需要AndroidStuido升級(jí)到3.2Canary14+就會(huì)有BuildBunlde的選項(xiàng),和之前buildApk在一個(gè)位置。同時(shí)需要gradle升級(jí)到3.2+才允許使用這個(gè)功能。
2.通過(guò)命令行生成
./gradlew :base:bundleDebug
生成的bundle是一個(gè).aab格式的壓縮文件,用解壓出來(lái)后。看到的那個(gè)base目錄就是對(duì)應(yīng)的baseModule,由于這個(gè)項(xiàng)目就是一個(gè)helloWorld,所以沒(méi)dynmaicFeatureModule。
Base進(jìn)去看到是一些很熟悉的文件,dex manifest res.....

Bundle生成apks
上面生成了.aab文件,但是不能直接安裝到設(shè)備上。需要通過(guò)bundleTool來(lái)生成。
文檔里面說(shuō)把bundle遞交到googlePlay,GP就可以在用戶下載的時(shí)候,根據(jù)用戶設(shè)備的特性,給予相應(yīng)的apk,這樣包就比下載所有配置的要小一些。GP也是通過(guò)bundleTool來(lái)工作的,所以我們也可以根據(jù)這個(gè)來(lái)測(cè)試我們的bundle是否能有效工作。
官方bundleTool提供了一個(gè)對(duì)應(yīng)的jar,里面有一些build apk,exctra apk等一系列命令,來(lái)幫助生成apk,github上也有源碼,有興趣可以去看看。
我用的bundleTool已經(jīng)到0.4.1了,修復(fù)了之前的一個(gè)Bug,language分割需要手動(dòng)設(shè)置,現(xiàn)在默認(rèn)language density abi三個(gè)維度默認(rèn)是開(kāi)啟了。當(dāng)然可以手動(dòng)設(shè)置去禁用一些。
1.通過(guò)bundletool build-apks --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks來(lái)生成apks
這里的bundletool是一個(gè)別名 = java -jar yourJarPath;
alias bundletool='java -jar /Users/**/Desktop/Documents/project/bundletool-all-0.4.1.jar '
所以如果不想配置別名,還是老老實(shí)實(shí)的在命令行敲java -jar yourJarPath --bundle=*** --output=***;
此時(shí)雖然會(huì)生成apks了,但是會(huì)警告你沒(méi)有簽名,后面將不能安裝到設(shè)備上。
所以需要加上簽名相關(guān)的參數(shù)
--ks=*** (keyStore文件)
--ks-pass=pass:*** (keyStore密碼)
--ks-key-alias=*** (alias)
--key-pass=pass:*** (密碼)
其實(shí)就是和之前生成簽名apk的參數(shù)一樣的。
執(zhí)行完命令后得到后綴名為.apks的壓縮文件,解壓后可以看到有很多apk,果然不愧后綴名為apks。


上面是語(yǔ)言split下面是設(shè)備尺寸split,但是為啥沒(méi)有abi split呢~~
2.安裝apk到設(shè)備上
上面得到的apks也是不能直接安裝,通過(guò)bundletool install-apks --apks=***.apks(bundletool沒(méi)配置的就按前面的java -jar)安裝。
這里需要加上--adb參數(shù),文檔里面沒(méi)提,估計(jì)是bundlTool的bug吧。

bundletool install-apks --apks=***.apks --adb=上面的地址
這樣apk就安裝到手機(jī)上了,不過(guò)對(duì)比直接安裝和bundle安裝的apk大小只差了200k,我的內(nèi)心是崩潰的。(helloWorld工程測(cè)試的,多配置的項(xiàng)目應(yīng)該會(huì)要明顯很多,后面再加上dynamic feature module試試,不過(guò)大項(xiàng)目上要專門分離dynamic module出來(lái)還是有點(diǎn)費(fèi)勁的)
3.導(dǎo)出apk
除了安裝上去,也可以導(dǎo)出特定的apk。
獲取連接設(shè)備的配置信息
bundletool get-device-spec
--output=/Users/**/Desktop/hongmi.json
--adb=/Users/**/Library/Android/sdk/platform-tools/adb
然后就有一個(gè)連接的紅米手機(jī)的配置信息,已json形式保存
{
"supportedAbis": ["arm64-v8a", "armeabi-v7a", "armeabi"],
"supportedLocales": ["zh-CN"],
"screenDensity": 480,
"sdkVersion": 23
}
根據(jù)配置導(dǎo)出特定apks
bundletool extract-apks
--apks=/Users/**/Desktop/d.apks
--output-dir=/Users/**/Desktop/myapks
--device-spec=/Users/**/Desktop/hongmi.json

可以看到這三個(gè)apk都是之前很多base里面針對(duì)紅米配置的,其他配置apk已經(jīng)沒(méi)有了,有條件還是要在GP的play consle上試一試。
后續(xù)
- 后續(xù)要繼續(xù)調(diào)研下dynamic feature module,改動(dòng)大不大、坑多不多,權(quán)衡下利弊,值不值得做。
- 看看能不能在GP上正常工作。