bundletool

bundletool 是 Android Gradle 外掛程式 Android Studio 及 Google Play 用於建構 Android App Bundle 的基礎工具,bundletool 會將應用程式套件轉換為部署至裝置的各種 APK。

Android SDK 套件 (ASB) 和套件的 APK 都使用 bundletool 建構而成。您也可以把它當做一種指令列工具,用來自行建構應用程式套件和 SDK 套件,並可重新建立下列兩者的 Google Play 伺服器端版本:應用程式 APK 或支援執行階段的 SDK APK。

下載 bundletool

如果您尚未從 GitHub 存放區下載 bundletool,請先完成這項操作。

建構並測試應用程式套件

您可以運用 Android Studio 或 bundletool 指令列工具建構 Android App Bundle,並測試用這個應用程式套件產生的 APK。

建構應用程式套件

使用 Android Studio 和 Android Gradle 外掛程式建構並簽署 Android App Bundle。然而,如果無法使用 IDE,例如您使用的是持續建構伺服器,那麼您也可以透過指令列建構應用程式套件然後使用 jarsigner 簽署。

如要進一步瞭解如何使用 bundletool 建構應用程式套件,請參閱使用 bundletool 建構應用程式套件

透過應用程式套件產生一組 APK

建構 Android App Bundle 後,測試 Google Play 用以產生 APK 的結果,以及這些 APK 部署到裝置後的表現。

測試應用程式套件的方式有兩種:

本節說明如何使用 bundletool 在本機測試您的應用程式套件。

bundletool 從您的應用程式套件產生 APK 時,會將產生的 APK 納入名為「APK 集的封存檔案」容器,而容器會使用 .apks 副檔名。如果希望從應用程式套件產生的 APK 集可以適用您應用程式支援的所有裝置設定,請使用 bundletool build-apks 指令,如下所示:

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

如要將 APK 部署到裝置,您必須一併加入應用程式的簽署資訊,如下方指令所示。如果未提供簽署資訊,bundletool 會嘗試為您用偵錯金鑰簽署 APK。

bundletool build-apks --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks
--ks=/MyApp/keystore.jks
--ks-pass=file:/MyApp/keystore.pwd
--ks-key-alias=MyKeyAlias
--key-pass=file:/MyApp/key.pwd

下表詳細說明了在使用 bundletool build-apks 指令時,您可以設定的各種標記和選項:

表 1. bundletool build-apks 指令的選項

標記 說明
--bundle=path (必要) 指定您透過 Android Studio 建構的應用程式套件路徑。詳情請參閱「建構專案」
--output=path (必要) 指定輸出 .apks 檔案的名稱,其中包含應用程式的所有 APK 構件。如要在裝置上測試這個檔案中的構件,請參閱如何將 APK 部署至連結裝置章節。
--overwrite 使用 --output 選項指定的路徑覆寫任何現有的輸出檔案。如果您未提供這個標記,且輸出檔案已存在,您會收到建構錯誤。
--aapt2=path 指定 AAPT2 的自訂路徑。 根據預設,bundletool 包含自己的 AAPT2 版本。
--ks=path (可選) 指定用來簽署 APK 的部署 KeyStore 路徑。如果您未提供這個標記,bundletool 會嘗試使用偵錯簽署金鑰簽署您的 APK。
--ks-pass=pass:password

--ks-pass=file:/path/to/file
指定 KeyStore 密碼。如果您要以純文字指定密碼,請使用 pass: 進行認證。如要將路徑傳送至含有密碼的檔案,請使用 file: 進行認證。如果您使用 --ks 標記指定 KeyStore,但沒有指定 --ks-passbundletool 會提示您透過指令列輸入密碼。
--ks-key-alias=alias 指定要使用的簽署金鑰別名。
--key-pass=pass:password

--key-pass=file:/path/to/file
指定簽署金鑰的密碼。如果您要以純文字指定密碼,請使用 pass: 進行認證。如要將路徑傳送至含有密碼的檔案,請使用 file: 進行認證。

如果這組密碼與 KeyStore 本身的密碼相同,請略過這個標記。

--connected-device 指示 bundletool 只針對連結裝置設定建構 APK。如果您未提供這個標記,bundletool 會針對應用程式支援的所有裝置設定產生 APK。
--device-id=serial-number 如果您有多部連結裝置,請使用此標記指定要部署應用程式的裝置序號。
--device-spec=spec_json 提供 .json 檔案路徑,指定您針對的裝置設定。詳情請參閱「建構及使用裝置規格 JSON 檔案」一節。
--mode=universal 將模式設為 universal。如果希望 bundletool 僅建構一個 APK,包含您應用程式的所有程式碼及資源,並與應用程式支援的所有裝置相容,請使用此選項。

附註:bundletool 只有功能模組在通用 APK 的資訊清單中指定 <dist:fusing dist:include="true"/>。詳情請參閱功能模組資訊清單

請注意,這些 APK 比針對特定裝置設定最佳化的 APK 還要大。但這樣您就能輕鬆與內部測試人員分享資訊,例如,告知對方可用多種裝置設定測試應用程式。

--local-testing 啟用應用程式套件進行本機測試。本機測試可讓您快速並反覆測試,不需要上傳至 Google Play 伺服器,。

如需如何使用 --local-testing 標記測試模組安裝的範例,請參閱本機測試模組安裝

將 APK 部署到連結裝置

產生一組 APK 後,bundletool 即可從該集合部署正確的 APK 組合到連結裝置。

舉例來說,如果您的連結裝置搭載 Android 5.0 (API 級別 21) 以上版本,bundletool 會推送所需的基礎 APK、功能模組 APK 和設定 APK,以便在裝置上執行應用程式。或者,如果您的連結裝置搭載 Android 4.4 (API 級別 20) 以下版本,則 bundletool 會尋找相容的多個 APK,並部署至您的裝置。

如要從 APK 集部署應用程式,請使用 install-apks 指令並使用 --apks=/path/to/apks 標記指定 APK 設定的路徑,如下列指令所示。如果您連接多部裝置,請加入 --device-id=serial-id 標記來指定目標裝置。

bundletool install-apks --apks=/MyApp/my_app.apks

產生裝置專用的一組 APK

如果您建構 APK 套組時,並不想以應用程式支援的所有裝置設定為對象,可以使用 --connected-device 選項指定僅針對連結裝置,如下列指令所示。如果您連接多部裝置,請加入 --device-id=serial-id 標記來指定目標裝置。

bundletool build-apks --connected-device
--bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks

產生並使用裝置規格 JSON 檔案

bundletool 可以產生指定 JSON 檔案所指定的裝置設定的 APK 組合。如要先為連結裝置產生 JSON 檔案,請執行下列指令:

bundletool get-device-spec --output=/tmp/device-spec.json

bundletool 會在工具所在的目錄中建立裝置的 JSON 檔案。您可以將此檔案傳送至 bundletool 以產生一組指定該 JSON 檔案所描述設定的 APK,如下所示:

bundletool build-apks --device-spec=/MyApp/pixel2.json
--bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks

手動建立裝置規格 JSON

如果您無法存取要建構指定 APK 的裝置,例如好友想要用您目前沒有的裝置試用應用程式,您可以按照下列格式手動建立 JSON 檔案:

{
  "supportedAbis": ["arm64-v8a", "armeabi-v7a"],
  "supportedLocales": ["en", "fr"],
  "screenDensity": 640,
  "sdkVersion": 27
}

接著,請按照上一節的說明,將這個 JSON 傳送至 bundle extract-apks 指令。

從現有的 APK 套組擷取裝置專用的 APK

如果您已設定現有 APK,且想要從指定特定裝置設定的 APK 子集擷取,您可以使用 extract-apks 指令並指定裝置規格 JSON,如下所示:

bundletool extract-apks
--apks=/MyApp/my_existing_APK_set.apks
--output-dir=/MyApp/my_pixel2_APK_set.apks
--device-spec=/MyApp/bundletool/pixel2.json

測量 APK 套組的 APK 下載大小

如要測量 APK 套組中透過 Wi-Fi 無線提供的預估 APK 下載大小,請使用 get-size total 指令:

bundletool get-size total --apks=/MyApp/my_app.apks

您可以使用下列標記修改 get-size total 指令的行為:

表 2. get-size total 指令的選項

標記 說明
--apks=path (必要) 指定現有 APK 組合檔案的下載路徑大小。
--device-spec=path 指定裝置規格檔案的路徑 (來自 get-device-spec 或手動建構),以供比對。 您可以指定部分路徑來評估一組設定。
--dimensions=dimensions 指定在計算大小預估值時所採用的維度。可接受以逗號分隔的清單,包含 SDKABISCREEN_DENSITYLANGUAGE。如要測量所有維度,請指定 ALL
--instant 測量免安裝即用 APK 的下載大小,而非安裝專用的 APK。根據預設,bundletool 會測量可安裝的 APK 下載大小。
--modules=modules 指定在 APK 中設定要納入考量的模組清單,並以半形逗號分隔。bundletool 指令會自動包含指定組合的任何相依模組。根據預設,指令會計算在首次下載期間安裝的所有模組的下載大小。

其他資源

如要進一步瞭解如何使用 bundletool,請觀看應用程式套件:使用 bundletool 和 Play 管理中心測試套件