Android動(dòng)態(tài)化框架App Bundles

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示意效果圖:


image

(左) 舊版 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)如下:


    image.png

3.使用方式

具體使用時(shí)掉瞳,在Android Studio新增一項(xiàng)module——Dynamic Feature Module毕源。


image.png

選中Dynamic Feature Module直接next到以下頁(yè)面


image.png

? 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)圖如下:


image.png

如圖feature生成的目錄結(jié)構(gòu)和我們常用的module結(jié)構(gòu)相差無(wú)幾拌牲。
例如谷歌官方提供的demo項(xiàng)目結(jié)構(gòu)如下:


image.png

在demo中有四個(gè)feature俱饿,通過(guò)module名很清楚這些feature是舉例介紹如何訪問(wèn)代碼、資源塌忽、so等拍埠。
我們可以看到源碼里面主要是通過(guò)一個(gè)SplitInstallManager類來(lái)進(jìn)行管理不同的模塊的。
image.png

以下是加載對(duì)應(yīng)模塊的簡(jiǎn)單使用:
image.png

dynamic feature module編譯所使用的插件com.android.dynamic-feature通過(guò)編譯產(chǎn)物分析土居,運(yùn)行示例后枣购,發(fā)現(xiàn)在所有dynamic feature模塊build目錄下均會(huì)生成apk文件。
直接運(yùn)行后我們?cè)趂eature 下打開目錄查看如下:


image.png

可以發(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 生成


image.png

點(diǎn)擊“Build Bundle(s)”之后我們會(huì)在主工程build目錄下回生成bundle.aab文件肴掷,該文件是壓縮格式文件逞姿,解壓該aab文件內(nèi)容如下:


image.png

由此可以看到其結(jié)構(gòu)同項(xiàng)目結(jié)構(gòu)分包相似。

打開其中具體某一目錄可以發(fā)現(xiàn)其和正常apk解壓后的結(jié)構(gòu)相差無(wú)幾:


image.png

從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ù)的配置可以見下表:


image.png

獲取鏈接設(shè)備信息,命令如下::
java -jar bundletool.jar get-device-spec --output=tcl.json --adb=D:/Android/SDK/platform-tools/adb.exe


image.png

我們分割出該apks文件之后就會(huì)生成以下apk话侄。命令如下:
java -jar bundletool.jar extract-apks --apks=bundle.apks --output-dir=D:\bundle\apks --device-spec=tcl.json
image.png

由此也可以證明我們的生成.aad 文件是正確的亏推。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市年堆,隨后出現(xiàn)的幾起案子吞杭,更是在濱河造成了極大的恐慌,老刑警劉巖变丧,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芽狗,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡痒蓬,警方通過(guò)查閱死者的電腦和手機(jī)童擎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)攻晒,“玉大人顾复,你說(shuō)我怎么就攤上這事⊙妆妫” “怎么了捕透?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵聪姿,是天一觀的道長(zhǎng)碴萧。 經(jīng)常有香客問(wèn)我乙嘀,道長(zhǎng),這世上最難降的妖魔是什么破喻? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任虎谢,我火速辦了婚禮,結(jié)果婚禮上曹质,老公的妹妹穿的比我還像新娘婴噩。我一直安慰自己,他們只是感情好羽德,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布几莽。 她就那樣靜靜地躺著,像睡著了一般宅静。 火紅的嫁衣襯著肌膚如雪章蚣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天姨夹,我揣著相機(jī)與錄音纤垂,去河邊找鬼。 笑死磷账,一個(gè)胖子當(dāng)著我的面吹牛峭沦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播逃糟,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼吼鱼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了绰咽?” 一聲冷哼從身側(cè)響起蛉抓,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎剃诅,沒(méi)想到半個(gè)月后巷送,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡矛辕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年笑跛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片聊品。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡飞蹂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出翻屈,到底是詐尸還是另有隱情陈哑,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站惊窖,受9級(jí)特大地震影響刽宪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜界酒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一圣拄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧毁欣,春花似錦庇谆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至执解,卻和暖如春哥攘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背材鹦。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工逝淹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人桶唐。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓栅葡,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親尤泽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子欣簇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容