Android App Bundle是一種改進(jìn)的應(yīng)用程序打包方式,能大幅度減少應(yīng)用體積。簡而言之,可以理解Google 官方的動態(tài)發(fā)布方案。
好處
Size更小
- 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
- 安裝更快
- 支持動態(tài)發(fā)布
限制
- 僅限于通過 Google Play 發(fā)布的應(yīng)用,(Google進(jìn)一步鞏固自身生態(tài))
- 需要加入到 Google 的 beta program enroll your app in app signing by Google Play in the Play Console
- 最低支持版本Android 5.0 (API level 21)
- 低于Android 5.0 (API level 21) 的版本GooglePlay會優(yōu)化Size,但不支持動態(tài)交付。
成本
- 需要升級到Android Studio 3.2修改工程以便支持App Bundle格式
- 集成Play Core Library
原理
只須在 Android Studio 中構(gòu)建一個應(yīng)用束 (app bundle),就可以將應(yīng)用所需的全部內(nèi)容 (適用于所有設(shè)備) 都涵蓋在內(nèi):所有語言、所有設(shè)備屏幕大小、所有硬件架構(gòu)。接著,在用戶下載您的應(yīng)用時,Google Play 的新動態(tài)交付只會傳輸適用于用戶設(shè)備的代碼和資源。人們在 Play Store 上看到的安裝包體積更小,下載速度也越快,同時也節(jié)省了設(shè)備存儲空間。

- (左)舊版 APK 交付樣例 - 將全部資源都交付至設(shè)備;
- (右) 動態(tài)交付樣例 - 只向設(shè)備交付必要資源;
結(jié)合Google Play Dynamic Delivery (動態(tài)交付) , 實(shí)現(xiàn)動態(tài)功能
Android App Bundle 支持模塊化,通過Dynamic Delivery with split APKs,將一個apk拆分成多個apk,按需加載(包括加載C/C++ libraries),這樣開發(fā)者可以隨時按需交付功能,而不是僅限在安裝過程中。
- Base Apk
首次安裝的apk,公共代碼和資源,所以其他的模塊都基于Base Apk - Configuration APKs
native libraries 和適配當(dāng)前手機(jī)屏幕分辨率的資源 -
Dynamic feature APKs
不需要在首次安裝就加載的模塊
使用方法

app模塊為Base Apk,features目錄下的模塊為Dynamic feature APKs。Base Apk和正常的Android應(yīng)用項(xiàng)目一樣,它決定了最終程序的版本號、應(yīng)用簽名、代碼縮小、splits、包名等信息。
默認(rèn)情況下,在構(gòu)建應(yīng)用程序包時,它支持為每組語言資源,屏幕密度資源和ABI庫生成配置APK。使用android.bundle基本模塊build.gradle文件中的塊 ,如下所示,您可以禁用對一種或多種配置APK的支持:
android {
// When building Android App Bundles, the splits block is ignored.
splits {...}
// Instead, use the bundle block to control which types of configuration APKs
// you want your app bundle to support.
bundle {
language {
// Specifies that the app bundle should not support
// configuration APKs for language resources. These
// resources are instead packaged with each base and
// dynamic feature APK.
enableSplit = false
}
density {
// This property is set to true by default.
enableSplit = true
}
abi {
// This property is set to true by default.
enableSplit = true
}
}
}
Dynamic feature APKs是需要動態(tài)加載的模塊,如果手機(jī)不支持動態(tài)加載,其內(nèi)容會合并到最終的apk內(nèi)。
創(chuàng)建動態(tài)功能模塊
創(chuàng)建新動態(tài)功能模塊的最簡單方法是使用Android Studio 3.2或更高版本。由于動態(tài)要素模塊對基礎(chǔ)應(yīng)用程序模塊具有內(nèi)在依賴性,因此您只能將它們添加到現(xiàn)有應(yīng)用程序項(xiàng)目中。
要使用Android Studio向您的應(yīng)用項(xiàng)目添加動態(tài)功能模塊,請執(zhí)行以下操作:
- 如果您還沒有這樣做,請?jiān)贗DE中打開您的應(yīng)用程序項(xiàng)目。
- 從菜單欄中選擇File> New> New Module。
- 在Create New Module對話框中,選擇 Dynamic Feature Module,然后單擊Next。
- 在“ 配置新模塊”部分中,完成以下操作:
a. 從下拉菜單中選擇應(yīng)用程序項(xiàng)目的Base應(yīng)用程序模塊。
b. 指定模塊名稱。IDE使用此名稱將模塊標(biāo)識為Gradle設(shè)置文件中的Gradle子項(xiàng)目 。構(gòu)建應(yīng)用程序包時,Gradle使用子項(xiàng)目名稱的最后一個元素將<manifest split>屬性 注入AndroidManifest清單中。
c. 指定模塊的包名稱。默認(rèn)情況下,Android Studio會建議一個包名稱,該名稱包含基本模塊的根包名稱和您在上一步中指定的模塊名稱。
d. 選擇希望模塊支持的最低API級別。該值應(yīng)與基本模塊的值匹配。 - 單擊下一步。
- 在“ 配置按需選項(xiàng)”部分中,執(zhí)行如下操作:
a. 使用最多50個字符指定模塊標(biāo)題。例如,當(dāng)確認(rèn)用戶是否想要下載模塊時,平臺使用該標(biāo)題來向用戶標(biāo)識模塊。因此,您的應(yīng)用程序的基本模塊必須包含模塊標(biāo)題作為字符串資源,您可以將其翻譯。使用Android Studio創(chuàng)建模塊時,IDE會為您將字符串資源添加到基本模塊,并在動態(tài)要素模塊的清單中注入以下條目:
<dist:module
...
dist:title="@string/title_dynamic_feature">
</dist:module>
b. 如果希望模塊可用于按需下載,請選中“ 按需啟用 ”旁邊的框。如果您未啟用此選項(xiàng),則當(dāng)用戶首次下載并安裝您的應(yīng)用時,可以使用動態(tài)功能。Android Studio會在模塊的清單中注入以下內(nèi)容以反映您的選擇。
<dist:module
...
dist:onDemand="true">
</dist:module>
c. 如果您希望此模塊可供運(yùn)行Android 4.4(API級別20)及更低版本的設(shè)備使用,請選中“ 融合 ”旁邊的框,并將其包含在多個APK中。僅當(dāng)您選中上一步中按需啟用旁邊的框時,此選項(xiàng)才可用。這意味著您可以為此模塊啟用按需行為,并禁用融合以從不支持下載和安裝拆分APK的設(shè)備中省略它。Android Studio會在模塊的清單中注入以下內(nèi)容以反映您的選擇。
<dist:module
...
<dist:fusing dist:include="true" />
</dist:module>
- 單擊完成。
在Android Studio完成模塊創(chuàng)建后,請從“ 項(xiàng)目”窗格中自行檢查其內(nèi)容( 從菜單欄中選擇“ 視圖”>“工具窗口”>“項(xiàng)目 ”)。您應(yīng)該快速注意到默認(rèn)代碼,資源和組織與標(biāo)準(zhǔn)應(yīng)用程序模塊的默認(rèn)代碼,資源和組織類似。
動態(tài)功能模塊構(gòu)建配置
使用Android Studio創(chuàng)建新的動態(tài)要素模塊時,IDE會將以下Gradle插件應(yīng)用于模塊的build.gradle文件。
// The following applies the dynamic-feature plugin to your dynamic feature module.// The plugin includes the Gradle tasks and properties required to configure and build// an app bundle that includes your dynamic feature module.apply plugin: 'com.android.dynamic-feature'
什么不包括在動態(tài)功能模塊構(gòu)建配置中
由于每個動態(tài)功能模塊都依賴于基本模塊,因此它還會繼承某些配置。因此,您應(yīng)該在動態(tài)要素模塊的build.gradle文件中省略以下內(nèi)容:
- 簽名配置:使用您在基本模塊中指定的簽名配置對應(yīng)用程序包進(jìn)行簽名。
-
該
minifyEnabled屬性:您可以 使代碼萎縮 僅從基本模塊的構(gòu)建配置為您的整個應(yīng)用項(xiàng)目。因此,您應(yīng)該從動態(tài)功能模塊中省略此屬性。但是,您可以 為每個動態(tài)要素模塊指定其他ProGuard規(guī)則。 -
versionCode和versionName:構(gòu)建應(yīng)用程序包時,Gradle使用基本模塊提供的應(yīng)用程序版本信息。您應(yīng)該從動態(tài)模塊的build.gradle文件中省略這些屬性 。
建立與基礎(chǔ)模塊的關(guān)系
當(dāng)Android Studio創(chuàng)建動態(tài)要素模塊時,通過將android.dynamicFeatures屬性添加到基礎(chǔ)模塊的build.gradle文件,它使基本模塊可見,如下所示:
// In the base module’s build.gradle file.android { ... // Specifies dynamic feature modules that have a dependency on // this base module. dynamicFeatures = [":dynamic-feature", ":dynamic-feature2"]}
此外,Android Studio將基本模塊作為動態(tài)功能模塊的依賴項(xiàng),如下所示:
// In the dynamic feature module’s build.gradle file:...dependencies { ... // Declares a dependency on the base module, ':app'. implementation project(':app')}
指定其他ProGuard規(guī)則
雖然只有基本模塊的構(gòu)建配置可以為您的應(yīng)用項(xiàng)目啟用代碼縮減,但可以使用proguardFiles屬性為每個動態(tài)功能模塊提供自定義ProGuard規(guī)則 ,如下所示。
android.buildTypes {
release {
// You must use the following property to specify additional ProGuard
// rules for dynamic feature modules.
proguardFiles 'proguard-rules-dynamic-features.pro'
}
}
部署您的應(yīng)用
在開發(fā)支持動態(tài)交付的應(yīng)用程序時,可以像往常一樣通過從菜單欄選擇“運(yùn)行”>“運(yùn)行”(或單擊工具欄中的“運(yùn)行 ),將應(yīng)用程序部署到連接的設(shè)備 。

附:谷歌官方示例 https://github.com/googlesamples/android-dynamic-features
