提綱
是什么(Android App Bundles簡介)
為什么使用(aab的四個(gè)新功能及實(shí)用性)
怎么使用(怎么進(jìn)行aab的改造)
怎么測試(可以通過google市場測試 而本文主要介紹aab本地測試工具 Bundletool)
簡介
Android App Bundles(以下簡稱AAB)是2018年Google I/O大會(huì)帶來的一款全新動(dòng)態(tài)化框架奸腺,與Instant App不同,AAB是借助Split Apk完成動(dòng)態(tài)加載脆炎。AAB的技術(shù)特點(diǎn)如下:
1. 不同于傳統(tǒng)的App以整個(gè)Apk為單位录平,一個(gè)App被分割成了一個(gè)base Apk和多個(gè)split Apk庄撮。
2. Apk在安裝后,可以按需請求下發(fā)或者更新模塊Apk。
3. split Apk可以根據(jù)配置進(jìn)行更細(xì)的劃分圃泡,并根據(jù)當(dāng)前運(yùn)行的設(shè)備特征來請求特定的Apk窥浪。
4. 請求與安裝過程必須通過Google Play商店進(jìn)行祖很,Google進(jìn)一步統(tǒng)一標(biāo)準(zhǔn)和鞏固自身生態(tài)。
5. split Apk功能只在Android 5.0(API 21)及以上機(jī)型使用漾脂,針對Android 4.4及以下機(jī)型Google Play商店仍會(huì)下發(fā)完整的Apk假颇,以此來向下兼容。
以下是AAB運(yùn)行時(shí)動(dòng)態(tài)加載Apk與傳統(tǒng)方式下發(fā)Apk的對比示意圖:
AAB是一個(gè)動(dòng)態(tài)化框架骨稿,它是利用Android Framework提供的split apks功能完成笨鸡。所有安裝split apk工作均是通過IPC交由google play完成。
好處
- Size 更刑构凇(最高可以減少 50% 應(yīng)用體積)
- 安裝更快 ( base.apk + split apks)
- Android App Bundle 是單一工件形耗,因此無需構(gòu)建、簽名或管理多個(gè) APK
- 支持動(dòng)態(tài)發(fā)布 (為特定用戶添加動(dòng)態(tài)功能辙浑,而無需增加安裝時(shí)的應(yīng)用體積)
- 官方提供的系統(tǒng)級插件化方案
限制和成本
- 僅限于通過 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)交付判呕。
- 需要升級到 Android Studio 3.2 以上倦踢,修改工程結(jié)構(gòu)以便支持 App Bundle 格式
集成 Play Core Library
已知問題
- 不支持動(dòng)態(tài)修改 resource tables
- 在 dynamic feature 模塊的清單文件里,不能引用不在 base 模塊里的資源
- 在 AS 中侠草,更改 base 模塊的 build variant辱挥,并不會(huì)自動(dòng)更改依賴 base 的其他模塊,所以構(gòu)建時(shí)可能會(huì)報(bào)錯(cuò)
- 不同模塊 build configuration 不同边涕,可能會(huì)有沖突晤碘,導(dǎo)致構(gòu)建或運(yùn)行時(shí)出錯(cuò)愧哟,比如 buildTypes.release.debuggable = true
- 由于 AAB 可能包含多個(gè) apk 文件,所以在把 apk 發(fā)送到設(shè)備時(shí)可能會(huì)因找不到資源哼蛆,導(dǎo)致運(yùn)行時(shí)異常蕊梧,比如 adb刷機(jī)( sideloading )
- 動(dòng)態(tài)下載模塊需要安裝最新的 Play Store app,所以有很小概率下載 app 時(shí)會(huì)回滾為下載一個(gè) multi-APK(為 Android 4.4以下設(shè)備提供)
通過appbundle 很多應(yīng)用都減少了較多的體積腮介,平均減少體積為11%
aab的四個(gè)新功能
1. 應(yīng)用內(nèi)更新:即時(shí)or靈活
兩種更新方式
即時(shí)更新肥矢,在應(yīng)用內(nèi)直接觸發(fā)模塊更新,用戶停留在更新流程中直到更新完成叠洗。確認(rèn)更新-更新下載甘改,下載完成,安裝(google管理流程)-繼續(xù)使用
靈活更新:提示用戶有新的更新-用戶確認(rèn)更新-google管理進(jìn)行下載灭抑,下載的時(shí)候用戶正常使用app-下載完成以后google提示重啟十艾,使用新的app
2. 按條件分發(fā) 根據(jù)國家,版本腾节,機(jī)型是否有什么功能的維度忘嫉,在安裝時(shí)將模塊發(fā)給用戶
指定國家,版本案腺,是否有ar功能等
指定參數(shù)劈榨,版本访递,功能
指定國家
3. 按需分發(fā) 根據(jù)場景拷姿,需要用到功能時(shí),才分發(fā)相應(yīng)模塊給用戶安裝
定制應(yīng)用的哪個(gè)功能旱函,在什么時(shí)候响巢,發(fā)給什么用戶。如對于有上傳需求的用戶陡舅,需要上傳時(shí)抵乓,才分發(fā)上傳的功能模塊
示例1:在app內(nèi)提示下載相關(guān)模塊和進(jìn)行安裝
示例2:安裝時(shí)有新手模塊伴挚,運(yùn)行后續(xù)卸載新手模塊
按需請求模塊關(guān)鍵代碼
按需刪除模塊(模塊卸載不會(huì)立即發(fā)生。也就是說茎芋,設(shè)備會(huì)根據(jù)需要在后臺(tái)卸載它們颅眶,以節(jié)省存儲(chǔ)空間)
Play Feature Delivery 概覽 使用功能模塊實(shí)現(xiàn)自定義分發(fā)
https://developer.android.google.cn/guide/app-bundle/play-feature-delivery
處理請求錯(cuò)誤
https://developer.android.google.cn/guide/playcore/play-feature-delivery#handle_request_errors
4.游戲資源分發(fā) :根據(jù)設(shè)備分發(fā)
游戲可以大到1gb,或者分更多的資源包
為什么比cdn分發(fā)好
怎么進(jìn)行aab的改造
Codelab
按需模塊田弥,可幫助您打造按需下載和安裝功能的應(yīng)用涛酗。(官方的手把手教學(xué))
https://developer.android.com/codelabs/on-demand-dynamic-delivery
在您的項(xiàng)目中添加 Play Core 庫
https://developer.android.google.cn/guide/playcore/play-feature-delivery#include_playcore
Play Feature Delivery 概覽 使用功能模塊實(shí)現(xiàn)自定義分發(fā)
https://developer.android.google.cn/guide/app-bundle/play-feature-delivery
測試工具 Bundletool 介紹
aab可以上傳google市場進(jìn)行測試(需要開發(fā)者賬號(hào)),本地測試可以用這個(gè)工具來進(jìn)行
Bundletool是一個(gè)用于處理 Android App Bundle 的命令行工具。使用 bundletool商叹,您可以構(gòu)建 AAB燕刻,提取連接的設(shè)備配置,生成 APK Set 文件 (.apks)剖笙,從 APK Set 文件中提取或安裝 APK卵洗,以及驗(yàn)證 App Bundle。由于 AAB 僅是一種發(fā)布格式弥咪,因此 bundletool 用于生成和測試 APK过蹂。
構(gòu)建aab
用 Bundletool 工具測試 AAB
1. 下載 bundletool:下載地址https://github.com/google/bundletool/releases/tag/1.6.0?
2. 切換到 aab 所在文件夾,生成 apks 文件
bundletool build-apks --bunlde=[bundle_name].aab --output=./[bundle_name].apks
3. 如果要 build 簽名的 apks 文件聚至,則需要加上 keystore 設(shè)置
bundletool build-apks --bundle=.aab --output=.apks --ks=[your_keystorename].jks/.keystore --ks-pass=pass: [your_keystore_pass] --ks-key-alias=[your_keystore_alias]? --key-pass=pass:[your_keystore_pass]
4. 將 apks 安裝在當(dāng)前連接的設(shè)備上
bundletool install-apks --apks=[bundle_name].apks
可以看到只有對應(yīng)的幾個(gè)apk安裝到設(shè)備中
另外介紹幾個(gè)有用的功能:
輸出當(dāng)前設(shè)備對應(yīng)的設(shè)備信息
bundletool get-device-spec --output=tcl.json --adb=/Library/Android_sdk/platform-tools/adb
生成當(dāng)前設(shè)備對應(yīng)的 apks
bundletool build-apks --connected-device --bundle=app.aab --output=./app1.apks --adb=/Library/Android_sdk/platform-tools/adb
根據(jù)aab文件生成一個(gè)全量apk
bundletool-all-0.10.3.jar build-apks --bundle=app.aab --output=all.apks --mode=universal
更多命令集合
https://blog.csdn.net/javaniceyou/article/details/107714732
https://developer.android.google.cn/guide/app-bundle/test/testing-fakesplitinstallmanager
參考
Android App Bundle探索
Android App Bundle解析
https://zhuanlan.zhihu.com/p/86995941
Android新特性——App Bundles
https://blog.csdn.net/kdsde/article/details/104002500
視頻介紹地址
https://www.bilibili.com/video/BV1nJ411w7p3?from=search&seid=9721899851768761615