Android App Bundle (Android新的應用釋出格式)
1.簡介
新的應用釋出格式 Android App Bundle 是一種更有效的方式來構建和釋出您的應用。Android App Bundle 讓您可以更輕鬆地以更小的應用程式大小提供出色的體驗,從而支援當今各種各樣的Android裝置。切換很容易。您無需重構程式碼即可從較小的應用程式中受益。適用於Android Studio 3.2或更高版本以及Unity 2018.3 beta版。
一個Android應用程式包是一個新的上載格式,包括所有的應用程式的編譯程式碼和資源。
Google Play的新應用服務模式稱為動態傳遞,然後使用您的應用包為每個使用者的裝置配置生成並提供優化的APK,因此他們只下載執行您的應用所需的程式碼和資源。您不再需要構建,簽署和管理多個APK來支援不同的裝置,使用者可以獲得更小,更優化的下載。
此外,您可以嚮應用專案新增動態功能模組,並將其包含在應用包中。這些模組包含您可以決定在使用者首次下載和安裝應用程式時不包含的功能和資產。 使用Play核心庫,您的應用可以稍後請求將這些模組下載為動態功能APK,並且通過動態傳遞,Google Play僅為該模組提供裝置的程式碼和資源。
2.要構建應用程式包並支援動態交付步驟
2.1.下載Android Studio 3.2或更高版本 - 這是新增動態功能模組和構建應用程式包的最簡單方法。
2.2.通過包含基本模組,組織配置APK的程式碼和資源以及(可選)新增動態功能模組,新增對動態交付的支援。
2.3.構建Android應用程式包。
2.4.使用bundtool測試您的Android應用包,從您的應用包中生成APK並將其部署到連線的裝置。
2.5.註冊Google Play的應用簽名。否則,您無法將應用包上傳到Play控制檯。
2.6.將您的應用包上傳到Play控制檯。然後,您可以使用Play控制檯的新內部測試軌道快速測試通過動態交付下載您的應用。
3.注意事項
3.1.只有執行Android 5.0(API級別21)及更高版本的裝置才支援按需下載和安裝動態功能。要使您的動態功能適用於早期版本的Android,請確保在建立動態功能模組時 啟用“ 融合”。
3.2.確保啟用SplitCompat,以便您的應用程式可以立即訪問下載的動態功能模組。
3.3.如果動態功能的下載大小很大,則應用程式需要先 獲取使用者確認, 然後才能將動態功能模組下載到裝置。
3.4.動態要素模組不應在其清單中指定 android:exported設定為的活動 true。這是因為當另一個應用程式嘗試啟動活動時,無法保證裝置已下載動態功能模組。此外,您的應用應確認在嘗試訪問其程式碼和資源之前已下載動態功能。要了解更多資訊,請閱讀 管理安裝的模組。
3.5.在釋出應用程式之前,請務必使用Play Console的測試軌道徹底測試您的動態功能。
4.使用拆分APK動態投放
動態傳遞的一個基本元件是Android 5.0(API級別21)及更高版本上提供的拆分APK機制。拆分APK與常規APK非常相似 - 它們包括已編譯的DEX位元組碼,資源和Android清單。但是,Android平臺能夠將多個已安裝的拆分APK視為單個應用。也就是說,您可以安裝多個可以訪問公共程式碼和資源的拆分APK,並在裝置上顯示為一個已安裝的應用程式。
分割APK的好處是可以分解單片APK,即包含應用支援的所有功能和裝置配置的程式碼和資源的APK,以及根據需要安裝在使用者裝置上的較小的離散包。
例如,一個拆分APK可能包含只有少數使用者需要的附加功能的程式碼和資源,而另一個拆分APK包含僅用於特定語言或螢幕密度的資源。當用戶請求或裝置需要時,下載並安裝這些拆分APK中的每一個。
以下描述了可以在裝置上一起安裝以形成完整應用體驗的不同型別的APK。您將在本頁的後續部分中瞭解如何配置您的應用專案以支援這些APK。
4.1.基本APK
此APK包含所有其他拆分APK可以訪問的程式碼和資源,併為您的應用提供基本功能。當用戶請求下載您的應用時,首先下載並安裝此APK。這是因為只有基本APK的清單包含應用程式服務,內容提供商,許可權,平臺版本要求和系統功能依賴關係的完整宣告。Google Play會從您專案的應用(或基礎)模組為您的應用生成基本APK。如果您擔心減少應用的初始下載大小,請務必記住,此模組中包含的所有程式碼和資源都包含在您應用的基本APK中。
4.2.配置APK
這些APK中的每一個都包含用於特定螢幕密度,CPU架構或語言的本機庫和資源。當用戶下載您的應用時,他們的裝置會下載並僅安裝定位其裝置的配置APK。每個配置APK都是基本APK或動態功能APK的依賴項。也就是說,它們與APK一起下載和安裝,它們提供程式碼和資源。與基本和動態功能模組不同,您不需要為配置APK建立單獨的模組。如果您使用標準做法 為基本和動態功能模組組織備用的,特定於配置的資源,Google Play會自動為您生成配置APK。
4.3.動態功能APK
這些APK中的每一個都包含應用功能的程式碼和資源,這在首次安裝應用時不是必需的。也就是說,使用Play核心庫,可以在裝置上安裝基本APK之後按需安裝動態APK,以向用戶提供附加功能。例如,您可能有一個聊天應用程式,可以下載並安裝僅在使用者請求使用該功能時捕獲和傳送照片的功能。由於動態功能在安裝時可能無法使用,因此您應該在基本APK中包含任何公共程式碼和資源。也就是說,您的動態功能應該假設只有基本APK的程式碼和資源在安裝時可用。Google Play會根據您專案的動態功能模組為您的應用生成動態功能APK。
考慮具有三個動態功能模組的應用程式,並支援多個裝置配置。下面的圖1說明了應用程式的各種APK的依賴樹可能是什麼樣子。請注意,基本APK構成樹的頭部,所有其他APK依賴於基本APK。(如果您對Android應用程式包中如何表示這些APK的模組感到好奇,請參閱Android App Bundle格式。)
上圖所示:使用拆分APK提供的應用程式的依賴關係樹。
請注意,您不需要自己構建這些APK - Google Play會使用您使用Android Studio構建的單個簽名應用包為您完成此操作。要了解有關應用程式包格式以及如何構建應用程式包格式的更多資訊:https://developer.android.google.cn/studio/run/
執行Android 4.4(API級別19)及更低版本的裝置
由於執行Android 4.4(API級別19)及更低版本的裝置不支援下載和安裝拆分APK,因此Google Play會為這些裝置提供單個APK,稱為多APK,該裝置針對裝置的配置進行了優化。也就是說,多APK代表您的完整應用體驗,但不包含不必要的程式碼和資源 - 例如其他螢幕密度和CPU架構的程式碼和資源。
但是,它們包含您的應用支援的所有語言的資源。例如,這允許使用者更改應用的首選語言設定,而無需下載不同的多APK。
多APK無法在以後按需下載動態功能模組。要在此APK中包含動態模組,您必須在建立動態要素模組時 禁用 按需或啟用融合。
請注意,使用動態投放,您無需為應用支援的每個裝置配置構建,簽名,上傳和管理APK。您仍然只為整個應用構建並上傳了一個應用包,Google Play會為您完成剩下的工作。因此,無論您是否計劃支援執行Android 4.4或更低版本的裝置,Dynamic Delivery都會為您和您的使用者提供靈活的服務機制。
5.Android App Bundle格式
Android App Bundle是.aab您上傳到Google Play以支援動態投放的檔案(帶有副檔名)。
應用程式包是簽名的二進位制檔案,可以將應用程式的程式碼和資源組織到模組中,如圖2所示。每個模組的程式碼和資源的組織方式與在APK中找到的類似,這是有道理的,因為每個模組都可能是作為單獨的APK生成。然後,Google Play會使用應用套件生成向用戶投放的各種APK,例如基本APK,動態功能APK,配置APK和(對於不支援拆分APK的裝置)多APK。這是在藍等彩色的目錄drawable/,values/以及lib/目錄,代表程式碼和資源,谷歌Play使用每個模組建立配置的APK。
上圖所示:帶有一個基本模組和兩個動態功能模組的Android App Bundle的內容。
注意:您為每個唯一的應用程式或applicationID構建應用程式包。也就是說,如果您使用產品風格從單個應用程式專案建立應用程式的多個版本,並且每個版本都使用唯一的 applicationID,則需要為每個版本的應用程式構建單獨的應用程式包。
以下列表更詳細地描述了一些應用程式包的檔案和目錄
5.1.base /,feature1 /和feature2 /
這些頂級目錄中的每一個都代表了應用程式的不同模組。應用程式的基本模組始終包含在base
應用程式包的目錄中。但是,每個動態要素模組的目錄都具有模組split
清單中屬性指定的名稱。要了解更多資訊,請閱讀 動態功能模組清單。
5.2.BUNDLE-METADATA /
此目錄包含元資料檔案,其中包含對工具或應用商店有用的資訊。此類元資料檔案可能包含ProGuard對映以及應用程式DEX檔案的完整列表。此目錄中的檔案未打包到您應用的APK中。
5.3.模組協議緩衝區(*.pb
)檔案
這些檔案提供的元資料有助於嚮應用商店(如Google Play)描述每個應用模組的內容。例如,BundleConfig.pb
提供有關包本身的資訊,例如用於構建應用程式包的構建工具的版本,native.pb
以及resources.pb
描述每個模組中的程式碼和資源,這在Google Play針對不同裝置配置優化APK時非常有用。
5.4.manifest /
與APK不同,app bundle將AndroidManifest.xml
每個模組的檔案儲存在這個單獨的目錄中。
5.5.dex /
與APK不同,app bundle將每個模組的DEX檔案儲存在這個單獨的目錄中。
5.6.res /,lib /和assets /
這些目錄與典型的APK中的目錄相同。當您上傳應用包時,Google Play會檢查這些目錄並僅打包滿足目標裝置配置的檔案,同時保留檔案路徑。
5.7.root /
此目錄儲存稍後重定位到包含此目錄所在模組的任何APK的根目錄的檔案。例如,base/root/
應用程式包的目錄可能包含應用程式載入的基於Java的資源 Class.getResource()
。這些檔案稍後會重新定位到應用基礎APK的根目錄以及Google Play生成的每個多APK。此目錄中的路徑也會保留。也就是說,目錄(及其子目錄)也被重定位到APK的根目錄。
警告:如果此目錄中的內容與APK根目錄中的其他檔案和目錄衝突,則Play Console會在上載時拒絕整個應用程式包。例如,您不能包含 root/lib/目錄,因為它會與lib 每個APK已包含的目錄衝突。
6.構建和部署Android應用程式包
應用包與APK不同,因為您無法將其部署到裝置。相反,它是一種上傳格式,在單個構建工件中包含所有應用程式的已編譯程式碼和資源。因此,在您上傳已簽名的應用套裝後,Google Play會提供構建和簽署應用APK所需的一切,並通過動態投放將其提供給使用者。
如果您使用的是Android Studio,則 只需點選幾下即可將專案構建為已簽名的應用包。然後,只需將您的應用套裝上傳 到Play控制檯,即可使用動態投放測試或釋出您的應用。
7.使用bundletool測試您的應用包
在構建Android應用程式包之後,您應該測試Google Play將如何使用它來生成APK以及這些APK在部署到裝置時的行為方式。
您可以使用bundletool
Gradle,Android Studio和Google Play用於構建Android應用程式包或將應用程式包轉換為部署到裝置的APK的命令列工具在本地執行這些測試。此工具對於在構建伺服器上包含應用程式包支援也很有用。要了解如何下載和使用bundletool
,請閱讀 使用bundletool測試Android應用程式包。
在本地測試您的應用包後,您應該通過將應用包上傳到Play控制檯,通過Google Play進行測試 。通過內部測試軌道,您可以將應用程式包上傳到Play控制檯,並在幾分鐘內通過Dynamic Delivery開始在裝置上對其進行測試。
8.使用Play核心庫下載動態功能模組
如果您的應用包含動態功能,則需要使用Play核心庫來請求,監控和管理動態功能模組下載。要了解更多資訊,請轉到使用Play核心庫下載模組。
9.關於即時應用的說明
在Android Studio 3.2或更高版本中, 只要應用程式的大小足夠小,您就可以為應用程式包新增即時體驗。有關您可以建立的不同型別即時體驗的大小限制的詳細資訊,請參閱Google Play Instant概述。
10.已知的問題
以下是構建Android應用程式包或使用動態交付為您的應用程式提供服務時當前已知的問題。如果您遇到下面未描述的問題,請 報告錯誤。
- Android App Bundles不支援 APK擴充套件檔案。但是,Google Play仍然要求應用下載量不超過100MB。因此,例如,在首次安裝您的應用時,您的基本APK及其配置APK的總大小必須等於100 MB或更少。同樣,任何動態功能APK及其配置APK的總大小必須為100 MB或更少。上傳您的應用套裝後,如果您的應用套裝導致違反此限制的APK,Play Console會發出警告。
- 如果您使用動態修改資源表的工具,則從應用程式包生成的APK可能會出現意外行為。因此,在構建應用程式包時,建議您禁用此類工具。
- 在動態要素模組的清單中,您不應引用基本模組中不存在的資源。這是因為,當Google Play生成應用的基本APK時,它會將所有模組的清單合併到基本APK的清單中。因此,如果基本APK的清單引用基礎APK中不存在的資源,則資源連結會中斷。
- 從Android Studio 3.2 Canary 14開始,當您更改應用程式基本模組的構建變體時,不會為依賴於基本模組的動態功能模組自動選擇相同的構建變體。因此,構建應用時可能會收到錯誤訊息。只需確保為基本模組和依賴它的其他模組選擇相同的構建變體。
- 目前,可以在動態要素模組的構建配置中配置與基礎(或其他)模組中的屬性衝突的屬性。例如,您可以
buildTypes.release.debuggable = true
在基本模組中進行設定,並將其設定false
為動態要素模組。此類衝突可能會導致構建和執行時問題。請記住,預設情況下,動態要素模組從基礎模組繼承一些構建配置。因此,請確保在動態功能模組構建配置中瞭解應保留哪些配置以及應忽略哪些配置。 - 由於應用安裝可能需要下載多個APK(例如基本APK和一些配置APK),因此在將應用的APK手動轉移到裝置上時也應該小心(也稱為 側載)。否則,由於缺少程式碼和資源,您的應用可能會遇到執行時問題。
- 目前,Google Play在單個APK中包含動態功能模組的所有程式碼和資源。在不久的將來,對於執行Android 5.0(API級別21)及更高級別的裝置,將優化服務以使用配置APK。
- 下載動態功能模組要求裝置安裝最新版本的Play商店應用。因此,如果您的應用包含動態功能模組,則極少數使用者的下載可能會回退到單個優化的多APK,這與執行Android 4.4(API級別20)及更低版本的裝置的下載體驗相同。
補充:
1.Google Play簡介
Google Play 前名為 Android Market,是一個由Google為Android裝置開發的線上應用程式商店。一個名為“Play Store”的應用程式會預載在允許使用Google Play的手機上,可以讓使用者去瀏覽、下載及購買在Google Play上的第三方應用程式。2012年3月7日,Android Market服務與Google Music、Google 圖書、Google Play Movie整合,並將其更名為Google Play。
2.Android App Bundle官方連結