天天看點

Android App Bundle基礎入門一、前言二、Android App Bundle 使用入門

一、前言

重要提示:從 2021 年 8 月起,新應用需要使用 Android App Bundle 才能在 Google Play 中釋出。現在,Play Feature Delivery 或 Play Asset Delivery 支援大小超過 150 MB 的新應用。

    Android App Bundle 是一種釋出格式(并不是可安裝檔案),檔案字尾名為

.aab

,是一個壓縮檔案,其中包含了應用的所有經過編譯的代碼和資源,APK檔案的生成和簽名都由 Google Play 完成。Google Play 在使用 App Bundle 生成 APK 的過程中,會針對每種裝置配置進行優化,隻保留特定裝置需要的代碼和資源,是以特定的裝置會下載下傳的 APK 的體積會得到一定程度減少。

    舉個簡單的例子,你的項目中包含

x86

armabi

armeabi-v7a

多種 CPU 架構的 so 庫,直接生成的 APK 中直接包含了這三種架構 so 庫,但是安裝的裝置的 CPU 隻會是其中一種架構,那麼其他的 so 庫就是備援的資源,下載下傳安裝的裝置根本用不到。使用 Android App Bundle 就是根據裝置生成對應的 APK,減少備援資源(包括圖檔資源、so 庫等),進而 APK 體積也可以得到減小。

    減少備援資源隻是使用 Android App Bundle 的其中一個用處,它還有一個更重要的用法是可以将應用進行子產品化劃分,生成多個 APK,使用者首次隻需要下載下傳較小的安裝包,在使用過程中根據需求下載下傳相應的子產品,而且還可以實作對不需要的子產品進行寫作。使用 App Bundle 格式釋出應用時,可以選擇使用 Play 功能分發(Play Feature Delivery),它可以讓您向應用項目中添加功能子產品,這些子產品包含的功能和資源僅在您指定的條件下才會添加到您的應用中,或者在稍後運作時下載下傳 Play 核心庫(Play Core Library)時使用。使用App Bundle 格式釋出遊戲時,開發者可以使用 Play 資産分發(Play Asset Delivery),它是 Google Play 用于分發擁有大量資産的遊戲的解決方案,為開發者提供靈活的分發方式和高效的性能。

注意事項:Android App Bundle 隻是一種 Google Play 的釋出格式,并不是可安裝檔案,需要經過Google Play處理生成最終的可安裝 APK 檔案。可參考:bundletool 工具使用詳解

二、Android App Bundle 使用入門

2.1 配置基本子產品

    對于大多數應用而言,要支援 Android App Bundle 并不費力。因為應用基礎 APK 中包含代碼和資源的子產品是一個标準的應用子產品,當使用 Android Studio 建立項目的時候得到的預設子產品就是這樣的一個子產品,在此子產品下的

build.gradle

腳本檔案中使用

application

插件(

com.android.application

),并為應用的基礎功能提供所需的代碼和資源。

如果項目支援 Kotlin,還可以在

build.gradle

中這麼聲明應用子產品:

plugins {
    // The standard application plugin creates your app's base module.
    id("com.android.application")
}
           

    除了給應用提供核心功能之外,基礎子產品中還提供許多關系整個應用項目的編譯配置和清單配置。

2.1.1 基本子產品的編譯配置

    對現有大多數應用項目,你無需更改基礎子產品中編譯配置的任何内容。然而,如果你需要往項目中增加功能子產品,或者你需要使用多個 APK 釋出應用,你必須記住要對基礎子產品的編譯配置的某些方面進行修改。

2.1.1.1 版本号與應用更新

    使用 Android App Bundle,你無需關注上傳到 Google Play 的多個 APK 的版本号,你隻需要關注應用基礎子產品的版本号即可。在基礎子產品下的

build.gradle

配置版本号,如下示例所示:

android {
    defaultConfig {
        // ...
        // 隻需要在基礎子產品下指定應用的版本号
        versionCode 1
        versionName "1.0"
    }
}
           

    在您上傳 App Bundle 之後,Google Play會使用基礎子產品中定義的應用版本号,為從這個 App Bundle 生成的所有 APK 的版本号進行重新設定。是以,當裝置下載下傳并安裝您的應用,是以分割的 APK 都有一樣的版本号。

    當您需要使用新的代碼或者資源更新您的應用時,必須更新應用基礎子產品下的版本号,并且建構一個完整的新 App Bundle。将新的 App Bundle 上傳到 Google Play後,會重新生成一系列基于基礎子產品新的版本号的 APK。随後,當使用者更新應用時,Google Play 服務端會更新裝置上安裝的所有 APK 的版本号,裝置上所有安裝的 APK 都會更新到新版本。

注意事項:由 App Bundle 生成的 APK,版本号是以應用基礎子產品的版本号決定的。另外,還有許多編譯配置也會忽略掉功能子產品下的配置,隻使用基礎子產品中的配置,比如

minifyEnabled

2.1.1.2 啟用或停用配置 APK 類型

    預設情況下,支援為每一組語言資源、螢幕密度資源和 ABI 庫生成配置 APK。在應用基礎子產品下的

build.gradle

腳本檔案中,通過

android.bundle

代碼塊可以啟用或者禁用對一個(或多個)配置 APK的支援。如下示例所示:

android {
    // 在建構 Android App Bundles時,splits 塊将會被忽略.
    // 你可以移除它,除非你想在建構 App Bundle 的同時建構多 APK。
    splits {...}

    // 改為使用 bundle 塊來控制你想要你的 App Bundle 支援哪些類型的配置 APK
    bundle {
        // 語言資源
        language {
            // 這個屬性預設為 true,你可以設定為 false 關閉為語言資源生成配置 APK。
            // 啟用後,将會為每種語言資源生成一個配置 APK。
            // 禁用後,不會為語言資源生成配置 APK,而是在基礎 APK 中包含所有的語言資源。
            enableSplit = false
        }
        // 螢幕密度資源
        density {
            // 這個屬性預設為 true,你可以設定為 false 關閉為螢幕密度資源生成配置 APK。
            enableSplit = true
        }
        // ABI庫資源
        abi {
            // 這個屬性預設為 true,你可以設定為 false 關閉為ABI資源生成配置 APK。
            enableSplit = true
        }
    }
}
           

2.1.1.3 下載下傳配置 APK(以語言配置 APK 為例)

    Google Play會根據使用者裝置系統設定的語言來決定安裝哪個語言資源。如果使用者在已經下載下傳并安裝您的應用之後變更系統預設語言,并且您的應用支援變更後的語言,裝置就會從 Google Play 中請求下載下傳對應語言的配置 APK。對于一些應用内部自帶語言選擇器,獨立于系統語言設定,動态改變應用的語言。因為Google Play下載下傳對應語言配置 APK 隻會根據系統語言變更時才會發生,這種情況下你必須確定不會因為資源确實而閃退,你可以在編譯配置中,将

android.bundle.language.enableSplit

屬性配置成 false(基礎 APK 中将包含所有配置的語言),或者使用 Play Core 庫按需下載下傳語言庫。

注意事項:下載下傳配置APK并更新應用,對于此類更新,并不會更改應用的版本代碼。

2.1.2 Android App Bundle(

.aab

) 檔案結構

    Android App Bundle 檔案字尾名為

.aab

,是一個壓縮檔案,包含了應用的所有經過編譯的代碼和資源,以及簽名資訊。如下圖所示:

Android App Bundle基礎入門一、前言二、Android App Bundle 使用入門
  • META-IF/

    :簽名資訊。
  • BUNDLE-METADATA/

    :Bundle檔案額外資訊,包含編譯依賴庫相關資訊等。
  • base/

    :程式相關檔案,包含經過編譯後的代碼和資源等
  • BundleConfig.pb

    :Bundle檔案配置

base/

目錄下包含程式相關檔案,目錄結構跟

apk

檔案類似,如下所示:

Android App Bundle基礎入門一、前言二、Android App Bundle 使用入門
  • base/root/

    :在安裝檔案(

    .apk

    )根目錄中的一些檔案,比如 kotlin 檔案、簽名資訊等。
  • base/res/

    :程式資源
  • base/manifest/

    :程式清單檔案
  • base/lib/

    : 程式 ABI 庫(Native 庫)
  • base/dex/

    :經過編譯隻有的代碼 dex
  • base/assets/

    :程式資産
  • base/***.pb

    :資源、資産、Native庫等配置資訊

附:Android App Bundle 檔案内容結構示意圖

Android App Bundle基礎入門一、前言二、Android App Bundle 使用入門

2.2 建構并測試 Android App Bundle

2.2.1 使用 Android Studio 建構 App Bundle

    如果您使用 Android Studio 開發,可以經過簡單的幾步導出經過簽名的 App Bundle。

  1. 下載下傳安裝 Android Studio 3.2 及以上版本;
  2. 在菜單欄中依次打開

    Build -> Generate Singned Bundle or APK

    ,在彈出視窗中選擇

    Android App Bundle

    ,點選下一步選擇簽名,最終導出 Android App Bundle 檔案(

    .aab

    )。如果在

    build.gradle

    中配置了簽名選項,可以在 Gradle 視窗中,依次展開

    基礎子產品名 -> Tasks -> build

    ,然後輕按兩下下面的

    bundle

    (或者

    bundleRelease

    )執行任務,執行完成之後會在

    基礎子產品名/build/outputs/bundle/<build-type>

    目錄下找到已簽名的 App Bundle 檔案(亦可以直接在 Android Studio 的指令行中執行

    gradlew bundle

    指令建構)
  3. 擷取到最終的 Android App Bundle 檔案,上傳到 Google Play進行部署(或者通過 Android Studio 部署 App Bundle 到連接配接的裝置上)

2.2.2 通過 Android Studio 部署 App Bundle

    因為Android App Bundle 檔案(

.aab

)隻是一種釋出格式,并不是可安裝檔案,是以不能直接安裝在測試裝置上,但是可以通過 Android Studio 将建構的 App Bundle 檔案,部署到已連接配接的測試裝置上(即針對測試裝置生成對應配置的 APK 并安裝運作),因為 Android Studio IDE 和 Google Play 使用的是同一種工具提取 APK 并安裝到裝置上。預設情況下,當您從 Android Studio 部署應用到連接配接的裝置上時,IDE 會建構和部署連接配接裝置對應的配置 APK(因為建構單個配置 APK 比建構所有配置 APK 要快得多)。在Android Studio 中部署 App Bundle,可以參考一下步驟:

  1. 在菜單欄中依次打開

    Run -> Edit Configurations

  2. 在左側容器中選中一個

    run/debug

    配置(Android Studio 中顯示為 Android App 類型);
  3. 在右側容器中選中

    General

    标簽,在

    Installation Options

    下面的

    Deplay

    選項中,選擇

    APK from app bundle

    ,然後點選

    Apply

    儲存配置;
  4. 在菜單欄中依次打開

    Run -> Run

    (或者點選工具欄的運作按鈕),Android Studio 就會建構 App Bundle,并且根據生成的 App Bundle 為連接配接的裝置生成對應的配置 APK 并安裝運作。
注意事項:使用 Android Studio 測試部署 App Bundle 時,并不會生成 APK 檔案,而是直接安裝到連接配接的裝置并運作,如果需要測試生成配置 APK,請參考:使用 bundletool 為 Android App Bundle 生成 APK 集合。

2.2.3 使用指令行工具建構和測試 App Bundle

    可以在指令行中使用 Android Studio 和 Google Play 用來建構 App Bundle 并将其轉換成一系列 APK 的工具。也就是說,您可以在指令行中使用這些工具,在本地建構 Android App Bundle 并部署應用。

That is, you can invoke these tools from the command line to locally build and deploy your app from an Android App Bundle.

2.2.3.1 使用指令行建構 App Bundle

    在指令行中建構 App Bundle,有兩種方法,一種是Android Gradle 插件,另一種是 BundleTools 工具。

  • Android Gradle 插件:這個插件由 Google 編寫,與Android Studio 捆綁,并且在 Maven 倉庫中可用。插件定義了可在指令行中建構 App Bundle 的指令。
gradlew :<子產品名>:bunbleDebug | bundleRelease
           

注意事項:

1. 不能使用 apksigner 對 App Bundle 進行簽名,要對 App Bundle 進行簽名,請使用 jarsigner;

2. Android Gradle 插件隻能建構 App Bundle,但不能生成配置 APK,如需要生成配置 APK,請參考:使用 bundletool 為 Android App Bundle 生成配置 APK。

  • BundleTool工具:相比 Android Gradle 插件而言,BundleTool工具生成 App Bundle 要複雜得多,首先要生成 proto 格式的清單和資源(使用 aapt2 編譯并連結應用的資源),然後将這些清單和資源打包成 ZIP 檔案(檔案目錄結構與 Android App Bundle 類似),最後使用

    bundletool build-bundle --modules=base.zip --output=mybundle.aab

    指令生成最終的 Android App Bundle檔案(

    .aab

    )。因步驟比較繁雜,之類也不做詳細介紹了。

2.2.3.1 使用指令行部署應用

    使用 Android Gradle 插件可以非常容易地建構 Android App Bundle,但是需要使用 bundletool 從 App Bundle 中部署應用到連接配接的測試裝置上。您可以通過BundleTool指令行測試應用和模拟 Google Play 分發。使用 bundletool 可以實作以下不同類型的測試場景:

  • 生成 APK 集合:使用 bundletool 可以生成您的應用所支援的所有裝置配置的 APK 拆分,bundletool 在部署應用到連接配接的裝置之前,必須先建構 APK 集合。
  • 部署應用:将 APK 集合安裝到連接配接的裝置中。bundletool 使用 adb 決定每個裝置配置對應的 APK 拆分,并将這些拆分安裝到裝置中(如果有多個連接配接的裝置,需要傳入裝置 ID 給 bundletool 來指定的目标裝置)。
  • 本地測試功能分發選項:可以使用 bundletool 模拟裝置從 Google Play 下載下傳和安裝功能子產品,而無需将應用釋出到 Google 管理中心。如果您想要在本地測試應用如何處理按需子產品的下載下傳以及下載下傳失敗的情況,這将會很有幫助。
  • 預估應用下載下傳大小:對于給定的裝置配置,這有助于更好地了解下載下傳您的應用程式的使用者體驗,并檢查您的應用程式是否滿足對應用程式包的壓縮下載下傳大小限制。

    使用 bundletool 生成 APK集合,使用以下指令:

bundletool build-apks --bundle=my_app.aab --output=my_app.apks
           

    關于 bundletool 的詳細使用,請參考:bundletool 工具使用詳解