AndroidAppBundle

androidAppBundle是一系列的文件,主要目的是app"瘦身"吧,需要借助bundletool最終要變成相應(yīng)的apk部署到設(shè)備上。

  • splitAPKs介紹
  • project生成bundle
  • bundle生成apk

官方文檔點(diǎn)這里

前言:

  • 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)題。

盜一張官網(wǎng)的圖

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.....


image.png

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。

屏幕快照 2018-05-31 下午5.24.47.png

屏幕快照 2018-05-31 下午5.24.52.png

上面是語(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吧。

image.png

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 
屏幕快照 2018-05-31 下午8.12.23.png

可以看到這三個(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上正常工作。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容