Android App Bundle

Android App Bundle是一種改進(jìn)的應(yīng)用程序打包方式,能大幅度減少應(yīng)用體積。簡(jiǎn)而言之,可以理解Google 官方的動(dòng)態(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
  • 安裝更快
  • 支持動(dòng)態(tài)發(fā)布

限制

  • 僅限于通過(guò) 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會(huì)優(yōu)化Size,但不支持動(dòng)態(tài)交付。

成本

  • 需要升級(jí)到Android Studio 3.2修改工程以便支持App Bundle格式
  • 集成Play Core Library

原理

只須在 Android Studio 中構(gòu)建一個(gè)應(yīng)用束 (app bundle),就可以將應(yīng)用所需的全部?jī)?nèi)容 (適用于所有設(shè)備) 都涵蓋在內(nèi):所有語(yǔ)言、所有設(shè)備屏幕大小、所有硬件架構(gòu)。接著,在用戶(hù)下載您的應(yīng)用時(shí),Google Play 的新動(dòng)態(tài)交付只會(huì)傳輸適用于用戶(hù)設(shè)備的代碼和資源。人們?cè)?Play Store 上看到的安裝包體積更小,下載速度也越快,同時(shí)也節(jié)省了設(shè)備存儲(chǔ)空間。


  • (左)舊版 APK 交付樣例 - 將全部資源都交付至設(shè)備;
  • (右) 動(dòng)態(tài)交付樣例 - 只向設(shè)備交付必要資源;

結(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),這樣開(kāi)發(fā)者可以隨時(shí)按需交付功能,而不是僅限在安裝過(guò)程中。

  • 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)目一樣,它決定了最終程序的版本號(hào)、應(yīng)用簽名、代碼縮小、splits、包名等信息。

默認(rèn)情況下,在構(gòu)建應(yīng)用程序包時(shí),它支持為每組語(yǔ)言資源,屏幕密度資源和ABI庫(kù)生成配置APK。使用android.bundle基本模塊build.gradle文件中的塊 ,如下所示,您可以禁用對(duì)一種或多種配置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是需要?jiǎng)討B(tài)加載的模塊,如果手機(jī)不支持動(dòng)態(tài)加載,其內(nèi)容會(huì)合并到最終的apk內(nèi)。

創(chuàng)建動(dòng)態(tài)功能模塊

創(chuàng)建新動(dòng)態(tài)功能模塊的最簡(jiǎn)單方法是使用Android Studio 3.2或更高版本。由于動(dòng)態(tài)要素模塊對(duì)基礎(chǔ)應(yīng)用程序模塊具有內(nèi)在依賴(lài)性,因此您只能將它們添加到現(xiàn)有應(yīng)用程序項(xiàng)目中。

要使用Android Studio向您的應(yīng)用項(xiàng)目添加動(dòng)態(tài)功能模塊,請(qǐng)執(zhí)行以下操作:

  1. 如果您還沒(méi)有這樣做,請(qǐng)?jiān)贗DE中打開(kāi)您的應(yīng)用程序項(xiàng)目。
  2. 從菜單欄中選擇File> New> New Module。
  3. 在Create New Module對(duì)話框中,選擇 Dynamic Feature Module,然后單擊Next。
  4. 在“ 配置新模塊”部分中,完成以下操作:
    a. 從下拉菜單中選擇應(yīng)用程序項(xiàng)目的Base應(yīng)用程序模塊。
    b. 指定模塊名稱(chēng)。IDE使用此名稱(chēng)將模塊標(biāo)識(shí)為Gradle設(shè)置文件中的Gradle子項(xiàng)目 。構(gòu)建應(yīng)用程序包時(shí),Gradle使用子項(xiàng)目名稱(chēng)的最后一個(gè)元素將<manifest split>屬性 注入AndroidManifest清單中。
    c. 指定模塊的包名稱(chēng)。默認(rèn)情況下,Android Studio會(huì)建議一個(gè)包名稱(chēng),該名稱(chēng)包含基本模塊的根包名稱(chēng)和您在上一步中指定的模塊名稱(chēng)。
    d. 選擇希望模塊支持的最低API級(jí)別。該值應(yīng)與基本模塊的值匹配。
  5. 單擊下一步。
  6. 在“ 配置按需選項(xiàng)”部分中,執(zhí)行如下操作:
    a. 使用最多50個(gè)字符指定模塊標(biāo)題。例如,當(dāng)確認(rèn)用戶(hù)是否想要下載模塊時(shí),平臺(tái)使用該標(biāo)題來(lái)向用戶(hù)標(biāo)識(shí)模塊。因此,您的應(yīng)用程序的基本模塊必須包含模塊標(biāo)題作為字符串資源,您可以將其翻譯。使用Android Studio創(chuàng)建模塊時(shí),IDE會(huì)為您將字符串資源添加到基本模塊,并在動(dòng)態(tài)要素模塊的清單中注入以下條目:
<dist:module
    ...
    dist:title="@string/title_dynamic_feature">
</dist:module>

b. 如果希望模塊可用于按需下載,請(qǐng)選中“ 按需啟用 ”旁邊的框。如果您未啟用此選項(xiàng),則當(dāng)用戶(hù)首次下載并安裝您的應(yīng)用時(shí),可以使用動(dòng)態(tài)功能。Android Studio會(huì)在模塊的清單中注入以下內(nèi)容以反映您的選擇。

<dist:module
    ...
    dist:onDemand="true">
</dist:module>

c. 如果您希望此模塊可供運(yùn)行Android 4.4(API級(jí)別20)及更低版本的設(shè)備使用,請(qǐng)選中“ 融合 ”旁邊的框,并將其包含在多個(gè)APK中。僅當(dāng)您選中上一步中按需啟用旁邊的框時(shí),此選項(xiàng)才可用。這意味著您可以為此模塊啟用按需行為,并禁用融合以從不支持下載和安裝拆分APK的設(shè)備中省略它。Android Studio會(huì)在模塊的清單中注入以下內(nèi)容以反映您的選擇。

<dist:module
    ...
    <dist:fusing dist:include="true" />
</dist:module>
  1. 單擊完成。
    在Android Studio完成模塊創(chuàng)建后,請(qǐng)從“ 項(xiàng)目”窗格中自行檢查其內(nèi)容( 從菜單欄中選擇“ 視圖”>“工具窗口”>“項(xiàng)目 ”)。您應(yīng)該快速注意到默認(rèn)代碼,資源和組織與標(biāo)準(zhǔn)應(yīng)用程序模塊的默認(rèn)代碼,資源和組織類(lèi)似。

動(dòng)態(tài)功能模塊構(gòu)建配置

使用Android Studio創(chuàng)建新的動(dòng)態(tài)要素模塊時(shí),IDE會(huì)將以下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'

什么不包括在動(dòng)態(tài)功能模塊構(gòu)建配置中

由于每個(gè)動(dòng)態(tài)功能模塊都依賴(lài)于基本模塊,因此它還會(huì)繼承某些配置。因此,您應(yīng)該在動(dòng)態(tài)要素模塊的build.gradle文件中省略以下內(nèi)容:

  • 簽名配置:使用您在基本模塊中指定的簽名配置對(duì)應(yīng)用程序包進(jìn)行簽名。
  • minifyEnabled屬性:您可以 使代碼萎縮 僅從基本模塊的構(gòu)建配置為您的整個(gè)應(yīng)用項(xiàng)目。因此,您應(yīng)該從動(dòng)態(tài)功能模塊中省略此屬性。但是,您可以 為每個(gè)動(dòng)態(tài)要素模塊指定其他ProGuard規(guī)則。
  • versionCodeversionName:構(gòu)建應(yīng)用程序包時(shí),Gradle使用基本模塊提供的應(yīng)用程序版本信息。您應(yīng)該從動(dòng)態(tài)模塊的build.gradle文件中省略這些屬性 。

建立與基礎(chǔ)模塊的關(guān)系

當(dāng)Android Studio創(chuàng)建動(dòng)態(tài)要素模塊時(shí),通過(guò)將android.dynamicFeatures屬性添加到基礎(chǔ)模塊的build.gradle文件,它使基本模塊可見(jiàn),如下所示:

// 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將基本模塊作為動(dòng)態(tài)功能模塊的依賴(là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屬性為每個(gè)動(dòng)態(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)用

在開(kāi)發(fā)支持動(dòng)態(tài)交付的應(yīng)用程序時(shí),可以像往常一樣通過(guò)從菜單欄選擇“運(yùn)行”>“運(yùn)行”(或單擊工具欄中的“運(yùn)行 ),將應(yīng)用程序部署到連接的設(shè)備 。

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

?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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