Android App Bundle:动态功能模块
目錄
Android App Bundle
創建動態功能模塊
動態功能模塊?
與主模塊建立關聯
部署應用
按需分發On-Demand?
免安裝分發
自 2021 年 8 月起,Google Play 將開始要求新應用使用 Android App Bundle 進行發布。該格式將取代 APK 作為標準發布格式。雖然這個政策目前還無法影響到國內應用,但是作為Android開發者,對于新的動態還是要有一定的認識。本文并不是介紹Android App Bundle,因為它不是新的事物,相關的文章也有很多了,本文重點介紹的是Android App Bundle中“動態功能模塊”的實際應用。
Android App Bundle
Android App Bundle是基于google play的分發技術,可以有效的減少apk的大小。
Android App Bundle可以自動將不同的分辨率、語言、平臺(CPU)的資源分別打包,這樣當安裝時只根據當前設備安裝對應的資源,這樣大大的節省了內存空間。
除了這些資源,Android App Bundle還支持動態功能模塊(Dynamic Feature Module),這樣如果用戶不需要這部分功能,則不安裝這個模塊,這樣就更加高度優化了下載和安裝。
創建動態功能模塊
下面就來看看如何創建動態功能模塊:
1、從菜單欄中依次選擇 File > New > New Module。這一步與創建普通模塊一樣。
2、在 Create New Module 對話框中,選擇 Dynamic Feature Module,然后點擊 Next。
3、在 Configure your new module 部分中,完成以下操作:
-
從下拉菜單中選擇應用項目的 Base application module。(一般就是main主模塊)
-
指定 Module name。IDE 會使用此名稱在 Gradle 設置文件中將該模塊標識為 Gradle 子項目。當您構建 app bundle 時,Gradle 會使用子項目名稱的最后一個元素在功能模塊的清單中注入 <manifest split> 屬性。
-
指定該模塊的 package name。默認情況下,Android Studio 會建議一個軟件包名稱,該名稱由基本模塊的根目錄軟件包名稱和您在上一步中指定的模塊名稱組合而成。
-
選擇您希望該模塊支持的 Minimum API level。此值應與基本模塊的值一致。
-
點擊 Next。
4、在 Module Download Options 部分中,完成以下操作:
1)指定最多包含 50 個字符的 Module title。(這個會展示給用戶)
2)在 Install-time inclusion 下的下拉菜單中,選擇分發時機,有下面三種:
-
Include module at install-time 安裝時分發(與普通模塊類似)
-
Do not include module at install-time ?按需分發(安裝時不分發,后面單獨說)
-
Only include module at app install for devices with specified features ?按條件分發
?????按條件分發還需要配置條件,如下圖
????????點擊“+ device-feature”可以添加一個條件(可以添加多個條件)。在 每個device-feature 旁邊,從下拉菜單中選擇以下選項之一,然后為其指定值:
-
Name:用于指定設備為在安裝應用時下載模塊所需具備的硬件或軟件功能。按條件分發所支持的功能與被 PackageManager 列為 FEATURE_* 常量的功能相同。如果您選擇此選項,請先在下拉菜單旁邊的字段中輸入相應功能的常量值的任意部分(例如“bluetooth”),然后在所顯示的建議中選擇一個。
-
OpenGL ES Version:用于指定設備為在安裝應用時下載模塊所需的 OpenGL ES 版本。如果您選擇此選項,請先在下拉菜單旁邊的字段中輸入相應版本(例如“0x00030001”),然后在所顯示的建議中選擇一個。
3)如果您希望此模塊可提供給搭載 Android 4.4(API 級別 20)及更低版本的設備并包含在多 APK 中,請選中 Fusing 旁邊的復選框。這意味著,您可以從不支持下載和安裝拆分 APK 的設備上將其省略。
(這部分的配置最終會在模塊下的Manifest中體現,下面會提到)
5、點擊 Finish即可創建模塊
?
動態功能模塊?
創建出的模塊目錄如下:
可以看到與正常模塊一樣,但是這里的Manifest內容有差異,如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:dist="http://schemas.android.com/apk/distribution"package="com.huichongzi.dynamicfeature"><dist:moduledist:instant="false"dist:title="@string/title_dynamicfeature"><dist:delivery><dist:on-demand /></dist:delivery><dist:fusing dist:include="true" /></dist:module> </manifest>?可以看到這里出現了一個dist標簽,這個標簽下就是動態功能模塊的一些配置。比如dist:instant="false"就是不支持免安裝(免安裝后面會細說),而title就是上面4步中設置的module title。而
<dist:delivery><dist:on-demand /> </dist:delivery>就是分發時機,on-demand就是Do not include module at install-time即按需分發(后面單獨說),如果改成install-time就是Include module at install-time即安裝時分發,按條件分發則不太一樣,如下:
<dist:delivery><dist:install-time><dist:conditions><dist:device-feature dist:name="android.hardware.camera.ar"/>...</dist:conditions></dist:install-time></dist:delivery>模塊創建后可以在這里添加新的分發條件。
這里也可以根據國家/地區指定條件
<dist:conditions><!-- Set to "true" to specify countries to exclude from downloadingthis module at app install-time. By default, modules are availablefor download to all user countries. --><dist:user-countries dist:exclude="true"><!-- Specifies the two-letter CLDR country code for regions that shouldnot download the module at app install-time. --><dist:country dist:code="CN"/><dist:country dist:code="HK"/></dist:user-countries> </dist:conditions>根據 API 級別指定條件
<dist:conditions><!-- Specifies the minimum API level that the device must satisfyin order to download your module at app install-time. The API level youspecify must be greater or equal to the module's own minSdkVersion. --><dist:min-sdk dist:value="21"/><!-- Specifies the maximum API level that the device cannot exceedin order to download your module at app install-time. The API level youspecify must be less than or equal to the module's own maxSdkVersion. --><dist:max-sdk dist:value="24"/> </dist:conditions>與主模塊建立關聯
當 Android Studio 創建功能模塊時,它會自動在基本模塊的?build.gradle?文件添加?android.dynamicFeatures?屬性,以使該功能模塊對基本模塊可見,如下所示:
// In the base module’s build.gradle file. android {defaultConfig {...}...// Specifies feature modules that have a dependency on// this base module.dynamicFeatures = [":dynamic_feature", ":dynamic_feature2"] }此外,Android Studio 還會將基本模塊添加為功能模塊的依賴項,如下所示:
// In the feature module’s build.gradle file: ... dependencies {...// Declares a dependency on the base module, ':app'.implementation project(':app') }部署應用
在開發支持功能模塊的應用時,您可以像往常一樣,從菜單欄中依次選擇 Run > Run(或點擊工具欄中的 Run 圖標 ),將該應用部署到連接的設備。
如果您的應用項目包含一個或多個功能模塊,您可以通過修改現有的運行/調試配置以選擇需要在部署應用時包含的功能,具體操作步驟如下:
-
從菜單欄中依次選擇 Run > Edit Configurations。
-
在 Run/Debug Configurations 對話框的左側面板中,選擇所需的 Android App 配置。
-
在 General 標簽頁中的 Dynamic features to deploy 下,選中需要在部署應用時包含的每個功能模塊旁邊的復選框。
-
點擊 OK。
默認情況下,Android Studio 不會使用 app bundle 部署您的應用,而是由 IDE 構建針對部署速度(而非 APK 大小)進行了優化的 APK,并將其安裝到設備中。如需將 Android Studio 配置為通過 app bundle 構建和部署 APK 以及免安裝體驗,請修改運行/調試配置。
按需分發On-Demand?
上面我們提到了三種分法模式:安裝時分發,按需分發和按條件分發。
安裝時分發比較好理解,即在google play下載安裝應用的時候就會下載該模塊;按條件分發也比較好理解,下載安裝應用時,如果當前設備滿足條件才會下載該模塊;只有按需分發,并不是很容易理解。
按需分發與國內很多應用的插件化類似,就是在功能被使用的時候才會去下載那部分代碼和資源。官方描述是這樣的:
如果在使用購物平臺應用的用戶中,只有 20%?的人發布待售商品,有一個不錯的策略可以減少大多數用戶的初始下載大小,那就是將拍照、輸入商品描述及上架商品的功能配置為按需下載。也就是說,您可以為應用的銷售功能配置功能模塊,使該功能僅在用戶希望在購物平臺上銷售商品時才下載。此外,如果用戶在一段時間后不再出售商品,應用可以通過請求卸載該功能減小其安裝大小。
但是通過上面創建部署動態模塊的流程,我們發現沒有關于按需下載的這部分邏輯。這是因為如果要使用動態模塊,還需要配合google的play core?library才可以:
implementation "com.google.android.play:core:${versions.playcore}"?通過這個library中的SplitInstallManager這個類來實現判斷模塊是否安裝,如果沒有安裝則下載安裝等邏輯。
這部分內容很多,受本文篇幅所限就不展開了,官方有一篇很詳細的教程:https://developer.android.com/codelabs/on-demand-dynamic-delivery#0,有興趣的同學可以自行閱讀(需要梯子)。以后有時間我會單獨出一篇中文教程,請大家留意我的公眾號更新。
免安裝分發
還有一種動態功能模塊,即免安裝分發。Google Play 免安裝體驗讓用戶無需在設備上安裝 APK 即可與您的應用互動。用戶可以通過 Google Play 商店中的“立即體驗”按鈕或您創建的網址體驗您的應用。這種內容分發形式可讓您更輕松地提高用戶與應用的互動度。
僅當應用的基本模塊也支持免安裝體驗時,您才能使功能支持免安裝體驗。這是因為,如果用戶想要體驗您的應用中某個支持免安裝體驗的功能模塊,他們的設備還必須下載應用的基本模塊以獲取通用代碼和資源。請注意,為了支持 Google Play 免安裝體驗,基本模塊和功能的下載必須滿足幾個條件:
最大大小:支持免安裝體驗的基本模塊和支持免安裝體驗的功能模塊的總大小不得超過 10 MB。如需了解詳情,請閱讀通過縮減應用或游戲大小支持免安裝體驗。
后臺活動:支持免安裝體驗的模塊無法使用后臺服務。此外,此類模塊在后臺運行時無法發送通知。
如果您使用 Android Studio 3.5 或更高版本創建支持免安裝體驗的功能模塊(如本部分所述),IDE 會在每個模塊的清單中添加以下內容,從而自動使基本模塊和功能模塊支持免安裝體驗:
<manifest xmlns:dist="http://schemas.android.com/apk/distribution"... ><dist:module dist:instant="true" />...此外,在下載并安裝您的應用時,系統會隨該應用的基本 APK 自動下載并安裝支持免安裝體驗的功能模塊。因此,IDE 還會在支持免安裝體驗的功能模塊中添加以下內容。
總結
以上是生活随笔為你收集整理的Android App Bundle:动态功能模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 细说Android apk四代签名:AP
- 下一篇: Jetpack:使用 ActivityR