Android App Bundle (AAB):開發人員和使用者的完整指南

A sealed parcel labeled AAB on a developer desk, illustrating the Android App Bundle format

2021 年 8 月,Google 做出了一項決定,從根本上改變了 Android 應用程式的分發方式:所有提交到 Google Play 商店的新應用程式都必須使用 Android 應用程式套件 (AAB) 格式,而不是傳統的 APK。这种转变影响了开发者、用户以及第三方应用分发的整个生态系统。但 App Bundle 到底是什么、它是如何工作的以及为什么要关心?

本指南涵蓋了從 AAB 格式的技術內部原理到想要與朋友共享應用程式或將應用程式安裝在沒有 Play 商店存取權限的裝置上的用戶的實際影響的所有內容。

什麼是 Android 應用程式套件?

Android App Bundle 是一種發布格式,其中包含應用程式的所有已編譯程式碼和資源,但將最終可安裝 APK 的生成推遲到 Google Play。將其視為一個主模板,Google 的伺服器可以根據該模板動態建立最佳化的、特定於裝置的套件。

與可立即安裝的 APK 不同,AAB 檔案不能直接安裝在裝置上。它是一個上傳到 Play 商店的建置工件,Google 的基礎設施會對其進行處理並為每個裝置配置產生客製化的 APK。

檔案副檔名為 .aab,內部使用協定緩衝區格式與類似 ZIP 的結構結合。它包含應用程式的 DEX 字節碼、資源、資產、本機庫和一個特殊的捆綁元資料文件,該文件告訴 Google Play 如何拆分內容。

為什麼 Google 強制要求應用程式捆綁包

App Bundles 背後的主要動機是 減少應用程式下載大小。典型的 Android 應用程式需要支援多種螢幕密度(mdpi、hdpi、xhdpi、xxhdpi、xxxhdpi)、多種 CPU 架構(armeabi-v7a、arm64-v8a、x86、x86_64)和多種語言。在傳統的 APK 模型中,所有這些資源都捆綁到一個檔案中,即使任何給定設備只需要其中的一小部分。

考慮一個遊戲,其中包含適用於四種 CPU 架構的本機庫和適用於五種螢幕密度的紋理。通用 APK 可能為 200 MB,但僅包含相關架構和密度的裝置特定版本可能為 80 MB。下載大小減少了 60%。

Google 報告稱,使用 App Bundle 的應用程式平均比通用 APK 等效項小 15%。對於大型應用程式和遊戲,節省的費用可能要大得多。較小的下載意味著更快的安裝、更少的頻寬消耗以及更少的由於大小問題而放棄的安裝。

應用程式包內部如何運作

束結構

AAB 檔案被組織成模組,每個模組都包含自己的程式碼、資源和資產。最常見的結構包括:

  • 基礎模組: 包含每個裝置所需的核心應用程式程式碼和資源。這始終是安裝的。
  • 配置拆分: 語言資源、螢幕密度資源和 ABI(CPU 架構)本機庫的單獨部分。
  • 動態功能模組: 初始安裝後可按需下載的選用模組。
  • 資源包: 遊戲關卡或媒體等大型資產可以在安裝時、按需或在後台交付。

拆分 APK 生成

當使用者從 Play 商店下載應用程式時,Google 的伺服器會檢查裝置的配置並產生一組針對該特定裝置自訂的分割 APK。典型的安裝可能包括:

  • base.apk,核心應用程式碼與必備資源
  • split_config.arm64_v8a.apk,設備 CPU 的本機庫
  • split_config.xxhdpi.apk,裝置螢幕密度的資源
  • split_config.en.apk,使用者區域設定的語言資源

這些拆分的 APK 作為單一邏輯應用程式安裝在一起。 Android 套件管理器將它們視為一個應用程序,但它們在設備上是物理上獨立的檔案。這是可以節省大小的機制。

動態交付

App Bundles 最強大的功能之一是動態交付。開發人員可以將某些功能標記為可按需下載。例如,照片編輯應用程式可能包含高級濾鏡作為動態功能模組。從未使用過這些過濾器的用戶永遠不會下載它們,從而節省了儲存空間。

動態功能模組在運行時透過 Play Core 庫下載並安裝。該應用程式可以檢查模組是否已安裝,並在需要時請求下載,因此用戶可以透過小型應用程式內下載來體驗新功能,而不是完全重新安裝。

AAB 與 APK:主要區別

了解這些格式之間的差異有助於闡明每種格式何時適用:

  • 可安裝性: APK檔案可以直接安裝在任何Android裝置上。 AAB 檔案無法直接安裝,必須先處理。
  • 尺寸: 通用 APK 包含所有配置的資源。 AAB 支援特定於裝置的交付,從而減少下載量。
  • 簽約: 透過 APK,開發人員簽署最終的可安裝套件。透過 AAB,開發人員對捆綁包進行簽名,Google 使用 Play 應用程式簽名對產生的 APK 進行重新簽名。
  • 分配: APK 可以透過任何管道分發。 AAB 主要是為 Play 商店設計的,儘管像 bundletool 這樣的工具可以在本地從它們產生 APK。
  • 分享性: 您可以輕鬆地與其他人分享 APK 檔案。共用從 AAB 安裝的應用程式需要收集所有拆分的 APK,這更加複雜。

簽約爭議

AAB 授權中爭議最多的方面之一是 播放應用程式簽名。當開發者上傳 AAB 時,Google 持有用於簽署交付給使用者的最終 APK 的簽署金鑰。這意味著 Google 在技術上有能力在簽署和交付 APK 內容之前對其進行修改。

谷歌認為這是必要的,因為他們需要簽署他們產生的分割 APK。開發人員保留上傳金鑰來驗證其上傳內容,但實際的應用程式簽署金鑰由 Google 的基礎架構管理。

對於大多數開發人員來說,這是一個合理的權衡。 Google 提供金鑰備份和復原服務,並且消除了金鑰遺失的風險(這將永久阻止應用程式更新)。然而,注重隱私的開發人員和開源倡議者對這種信任的集中化表示擔憂。

這對於共享應用程式的用戶意味著什麼

向 App Bundle 的轉變對於想要在 Play 商店之外共享應用程式的用戶具有重大影響:

提取已安裝的應用程式

當您提取從 AAB 安裝的應用程式時,您不會獲得單一 APK 檔案。相反,您會獲得拆分 APK 的集合。這些分割是特定於裝置的,這意味著從具有 ARM64 處理器和 xxhdpi 螢幕的手機中提取的應用程式將無法在具有不同配置的裝置上運行。

XAPK 和 APKS 格式

為了解決共享拆分 APK 的挑戰,創建了 XAPK 和 APKS 等容器格式。這些格式將所有拆分的 APK 捆綁在一起形成一個可下載檔案。當您遇到 XAPK 檔案時,它可能包含最初作為應用程式套件分發的應用程式。

我們的 XAPKS 到 APK 轉換器 可以幫助您從這些容器格式中提取基礎 APK。但是,請記住,基礎 APK 本身可能不包含應用程式在每個裝置上正常運作所需的所有資源,因為密度和 ABI 特定資源可能位於分割 APK 中。

使用捆綁工具

Google 提供了一個名為 bundletool 的開源工具,可以在本地從 AAB 檔案產生 APK。開發人員可以使用它來建立通用 APK 以進行測試或替代分發。該指令如下圖所示:

bundletool build-apks --bundle=app.aab --output=app.apks --mode=universal

這會產生一個通用 APK,其中包含所有配置的所有資源。它將比特定於設備的版本更大,但適用於任何設備。這是我們的AAB 到 APK 轉換器所使用的方法。

對替代應用程式商店的影響

AAB 指令主要影響 Google Play 商店。替代應用程式商店和直接分發管道仍然可以接受 APK 檔案。想要在 Play 之外分發的開發者可以在上傳 AAB 的同時繼續建立通用 APK。

然而,有些開發者只建置 AAB,並完全依賴 Play 進行分發。這意味著這些開發者的應用程式更難在 Play 商店生態系統之外獲得。第三方應用程式儲存庫已透過託管拆分 APK 集合(作為 XAPK 或 APKS 檔案)或使用 bundletool 產生通用 APK 進行了調整。

動態特徵模組的實踐

動態功能模組代表了 App Bundle 格式最有趣的功能之一。以下是一些現實世界的用例:

  • 相機特點: 應用程式可能包含 AR 濾鏡作為動態模組,僅在使用者首次存取相機功能時下載。
  • 語言包: 不太常見語言的翻譯資料可以按需提供,而不是與每次安裝捆綁在一起。
  • 遊戲關卡: Games 可以隨著玩家的進步提供額外的內容,從而保持初始下載量較小。
  • 專業工具: 生產力應用程式中的進階功能只能提供給需要的使用者。

對於用戶來說,這意味著隨著動態模組的下載,應用程式的安裝大小可能會隨著時間的推移而增加。這也意味著共享此類應用程式需要包含所有下載的模組,從而使提取過程更加複雜。

開發人員最佳實踐

如果您正在開發 Android 應用程序,以下是有效使用應用程式套件的建議:

  1. 始終在本機上使用bundletool進行測試 上傳到 Play 之前。產生特定於裝置的 APK 並驗證它們是否正常運作。
  2. 使用 Play 管理中心的內部測試軌道 用於驗證拆分 APK 是否在真實裝置上安裝並正常運作。
  3. 如果您的用戶群超出了 Play 商店,則 考慮提供通用 APK 適用於替代分銷管道。
  4. 請注意動態功能模組邊界。 經常使用的功能應該位於基本模組中,而不是動態模組中。
  5. 在不同配置的設備上進行測試,確保正確產生組態分割並且不遺失任何資源。
  6. 確保您的上傳密鑰安全。 雖然 Google 管理應用程式簽署金鑰,但您的上傳金鑰會驗證您作為開發者的身分。

應用程式分發的未來

App Bundle 格式不斷發展。 Google 推出了針對大型遊戲資產的 Play Asset Delivery、針對廣告 SDK 的 SDK Runtime 等功能,以及改進了對 Wear OS 和 Android TV 配置的支援。趨勢是更精細、按需交付應用程式元件。

對於用戶來說,這意味著單一、獨立的應用程式檔案的概念對於 Play 商店應用程式來說越來越不常見。對於在標準 Play 商店流程之外管理應用程式的任何人來說,了解 XAPK、APKS 等格式以及可用於使用它們的工具變得越來越重要。

何時保留 AAB 與何時建構通用 APK

Android App Bundle 代表了應用程式打包和交付方式的根本轉變。雖然它在下載大小和交付效率方面帶來了真正的好處,但它也為共享應用程式或從其他來源安裝應用程式的用戶帶來了複雜性。了解 AAB 的工作原理、它們如何產生分割 APK 以及可用於在格式之間進行轉換的工具,可以幫助您自信地選擇正確的格式並在它們之間進行轉換。

開發人員尋求 AAB 來優化應用程式的交付方式;大多數日常用戶只有在嘗試在無法存取 Play 商店的裝置上安裝某些內容時才會遇到這種情況。不管怎樣,值得記住的事情很簡單:AAB 是一種發布格式,而不是安裝格式,並且有一些工具可以彌補兩者之間的差距。

由 Shaefale 女士設計並記錄 首席開發人員和 Android 套件架構師 • 在 Android 12–15 上經過驗證

Mst Shaefale 在 xapktoapk.com 維護用戶端 XAPK/APKS 合併、二進位清單解析器和 APK v1+v2 簽章工具。發現過時的命令或作業系統變更?發送編輯說明。