Android App Bundle 格式

Android App Bundle 是一種可上傳到 Google Play 的檔案 (副檔名為 .aab)。

應用程式套件是已簽署的二進位檔,可將應用程式的程式碼與資源整理到不同模組中,如圖 1 所示。每個模組的程式碼與資源組織方式均與 APK 中的內容相似,而這相當合理,因為每個模組都可以產生單獨的 APK。然後,Google Play 會使用應用程式套件產生供使用者使用的各種 APK,比如基本 APK、功能 APK、設定 APK 和多重 APK (適用於不支援分割 APK 的裝置)。標示藍色的目錄 (例如 drawable/values/lib/ 目錄) 代表 Google Play 用來為每個模組建立設定 APK 的程式碼與資源。

應用程式套件會將應用程式組織成目錄,而每個目錄均代表一個模組。在每個模組目錄中,程式碼與資源的組織方式會與一般 APK 類似。

圖 1 Android App Bundle 的內容包含一個基本模組、兩個功能模組以及兩個資產包。

以下我們針對部分應用程式套件的檔案與目錄提供進一步的說明:

  • base/、feature1/ 與 feature2/:這些頂層目錄分別代表不同的應用程式模組。應用程式的基本模組一律包含在應用程式套件的 base 目錄中。不過,為每個功能模組的目錄提供的名稱由模組資訊清單中的 split 屬性指定。詳情請參閱功能模組資訊清單
  • asset_pack_1/ 與 asset_pack_2/:如果是圖形處理要求極高的應用程式或遊戲,您可以將資產模組化為資產包。資產包的大小上限較大,因此十分適用於遊戲類的應用程式。您可以根據三種提供模式 (安裝時提供、以快速追蹤的方式提供及隨選提供),自訂各個資產包下載到裝置上的方式和時間點。所有資產包都由 Google Play 代管及提供。如要進一步瞭解如何將資產包新增至應用程式套件,請參閱「Play Asset Delivery 總覽」。
  • BUNDLE-METADATA/:這個目錄含有中繼資料檔案,其中包含工具或應用程式商店會用到的資訊。這類中繼資料檔案可能包括 ProGuard 對應,以及應用程式 DEX 檔案的完整清單。這個目錄中的檔案不會封裝至應用程式的 APK 中。
  • 模組通訊協定緩衝區 (*.pb) 檔案:這些檔案會提供中繼資料,有助於向應用程式商店 (如 Google Play) 說明每個應用程式模組的內容。例如,BundleConfig.pb 會提供套件本身的相關資訊 (例如用於建構應用程式套件的建構工具版本),而 native.pbresources.pb 會說明每個模組中的程式碼與資源,這在 Google Play 依不同的裝置設定調整 APK 時相當實用。
  • manifest/:與 APK 不同,應用程式套件會將每個模組的 AndroidManifest.xml 檔案儲存在這個單獨的目錄中。
  • dex/:與 APK 不同,應用程式套件會將每個模組的 DEX 檔案儲存在這個單獨的目錄中。
  • res/、lib/ 與 asset/:這些目錄與一般 APK 中的目錄相同。當您上傳應用程式套件時,Google Play 會檢查這些目錄,並僅封裝滿足目標裝置設定需求的檔案,同時保留檔案路徑。
  • root/:根據這個目錄所在的模組隸屬於哪些 APK,這個目錄儲存的檔案之後就會移到這些 APK 的根目錄。舉例來說,應用程式套件的 base/root/ 目錄可能包含應用程式使用 Class.getResource() 載入的 Java 資源。這些檔案之後會移到應用程式基本 APK 及 Google Play 產生的每個多重 APK 的根目錄,這個目錄中的路徑也會保留下來。也就是說,目錄 (及其子目錄) 也會移到 APK 的根目錄。

分割 APK 總覽

Android 5.0 (API 級別 21) 以上版本提供的「分割 APK」機制是提供最佳化應用程式的基本元件。分割 APK 與一般 APK 非常相似,其中包括經過編譯的 DEX 位元碼、資源及 Android 資訊清單。不過,Android 平台能將多個已安裝的分割 APK 視為單一應用程式。也就是說,您可以安裝多個分割 APK,而這些 APK 可以存取共通的程式碼與資源,並在裝置上呈現為一個安裝版應用程式。

分割 APK 的優點在於能將單體 APK 分割成較小的獨立套件,這些套件可「視需要」安裝在使用者的裝置上。單體 APK 是指一個 APK 即包含用於應用程式所有功能與裝置設定的程式碼與資源。

例如,一個分割 APK 可能包含僅少數使用者需要的額外功能相應程式碼與資源,而另一個分割 APK 僅包含特定語言或螢幕密度相應的資源。這些分割 APK 可以根據使用者的要求或裝置的需求,分別下載及安裝。

不同類型的 APK 可以一起安裝在裝置上,以打造完整的應用程式體驗,說明如下。本頁面的後續各節將介紹如何設定應用程式專案以支援這些 APK。

  • 基本 APK:此 APK 中含有所有其他分割 APK 均可存取的程式碼與資源,並提供應用程式的基本功能。當使用者要求下載應用程式時,系統會先下載並安裝此 APK。這是因為只有基本 APK 的資訊清單包含應用程式服務、內容供應者、權限、平台版本需求及系統功能依附元件的完整宣告。Google Play 會從專案的應用程式 (或基本) 模組為應用程式產生基本 APK。若想縮減應用程式的初始下載大小,請務必注意,此模組中包含的所有程式碼與資源均包含在應用程式的基本 APK 中。
  • 設定 APK:每個設定 APK 均包含適用於特定螢幕密度、CPU 架構或語言的原生資料庫與資源。當使用者下載應用程式時,其裝置僅會下載並安裝以該裝置為目標的設定 APK。每個設定 APK 都是基本 APK 或功能模組 APK 的依附元件。也就是說,設定 APK 會與提供程式碼與資源的對象 APK 一起下載和安裝。與基本模組和功能模組不同,您不需要為設定 APK 建立單獨的模組。若您在為基本模組和功能模組組織設定專屬的替代資源時遵循標準做法,則 Google Play 會自動為您產生設定 APK
  • 功能模組 APK:每個功能模組 APK 均包含應用程式功能的程式碼和資源;這些功能可以透過功能模組進行模組化。隨後,您可以自訂功能下載到裝置上的方式及時機。例如,若使用 Play Core 資料庫,則可在基本 APK 安裝到裝置上之後,再依需求安裝功能,以向使用者提供額外功能。舉例來說,您可以讓即時通訊應用程式只在使用者要求時才下載並安裝可拍攝及傳送相片的功能。由於功能模組可能在安裝時還無法使用,因此您應該將所有常用程式碼和資源納入基本 APK 中。也就是說,您的功能模組應假定在安裝時只有基本 APK 的程式碼和資源可用。Google Play 會從專案的功能模組為應用程式產生功能模組 APK。

假設某個應用程式具備三個功能模組,並支援多種裝置設定。下方的圖 1 說明了該應用程式的不同 APK 可能呈現何種依附元件樹狀結構。請注意,基本 APK 會是樹狀結構的源頭,其他 APK 均依附於基本 APK (如要進一步瞭解這些 APK 的模組在 Android App Bundle 中的表示方式,請參閱「Android App Bundle 格式」)。

基本 APK 位於樹狀結構的源頭,而功能模組 APK 依附於該 APK。設定 APK (包括基本 APK 及每個功能模組 APK 的裝置設定專屬程式碼和資源),形成依附元件樹狀結構的分葉節點。

圖 1 使用分割 APK 建構的應用程式依附元件樹狀結構

請注意,您無須自行建構這些 APK,Google Play 會根據您以 Android Studio 建構的一個已簽署應用程式套件執行此動作。如要進一步瞭解應用程式套件格式及建構方式,請參閱建構、部署及上傳 Android App Bundle

搭載 Android 4.4 (API 級別 19) 以下版本的裝置

由於搭載 Android 4.4 (API 級別 19) 以下版本的裝置不支援下載及安裝分割 APK,因此 Google Play 為這些裝置提供了名為「多重 APK」的單個 APK,並為裝置設定進行了最佳化調整。也就是說,多重 APK 即代表完整的應用程式體驗,但不包含非必要的程式碼和資源 (例如用於其他螢幕密度及 CPU 架構的程式碼和資源)。

不過,這種 APK 還是包含應用程式支援的所有語言相應資源。如此一來,使用者無須下載其他多重 APK,即可變更應用程式的偏好語言設定。

多重 APK 無法在日後下載隨選功能模組。如要在此 APK 中加入功能模組,則必須在建立功能模組時停用「On-demand」(隨選) 或啟用「Fusing」(融合)

請注意,使用應用程式套件時,您無須為應用程式支援的每種裝置設定分別建構、簽署、上傳及管理 APK。您依然只需要為整個應用程式建構及上傳一個應用程式套件,其餘部分則交由 Google Play 處理。因此,無論您是否規劃支援搭載 Android 4.4 或以下版本的裝置,Google Play 都能讓您及您的使用者享有靈活的供應機制。

使用者語言變更

使用應用程式套件時,裝置只會下載執行應用程式所需的程式碼和資源。因此,對於語言資源,使用者的裝置只會依裝置設定中當下選取的一或多種語言,下載相符的應用程式語言資源。

若使用者在裝置設定中切換語言,則 Google Play 可能需要下載及安裝一些額外的分割 APK,應用程式才能以新語言顯示。

切換語言後,Google Play 會嘗試立即下載其他語言。若使用者裝置處於離線狀態、下載失敗或資源太大,Google Play 就會在裝置條件較佳時,再次嘗試在背景執行下載作業。在搭載 Android 9.0 (API 級別 28) 以下版本的裝置上執行時,若應用程式在安裝新語言分割 APK 期間於前景執行,系統就會終止該應用程式。

如果您的應用程式要求所有語言都必須在裝置上隨時提供,您可以在建構設定中停用語言分割

如果除了裝置設定中選取的使用者語言以外,應用程式下載其他語言 (例如實作應用程式內語言挑選器),您可以使用 Play Core 資料庫依需求下載語言