1. 程式人生 > >初識Android App Bundle

初識Android App Bundle

什麼是Android App Bundle?
Android App Bundle是一種新的上傳格式,包含所有應用的已編譯程式碼和資源,但推遲了APK生成並簽名到Google Play

什麼是動態交付?
它是Google Play的新應用服務模式,它使用您的應用束為每個使用者的裝置配置生成並提供優化的APK,因此他們只需下載執行應用所需的程式碼和資源。您不再需要構建,簽名和管理多個APK,使用者可以獲得更小,更優化的下載。

什麼是動態功能模組?
這些是您可以新增到應用專案的模組,並將它們包含在您的應用束中。通過動態交付,您的應用可以在需要時下載和安裝動態功能。
此功能仍處於測試階段。
在這裡插入圖片描述
圖1.左側:一個簡單的應用程式,包括基本APK(B)和一些可配置的APK集(C)。右側:一個更復雜的應用程式,包括兩個動態功能APK(D)和相應的可配置的APK集(C)供需要時下載。

二、安裝
以下步驟將幫助您設定安裝前的前提條件。
獲取Android Studio 3.2金絲雀
開始配置專案和構建app bundles的最簡單方法是使用最新版本的Android Studio。如果您還沒有這樣做,請立即下載Android Studio 3.2 Canary
在這裡插入圖片描述
確保您擁有最新版本的Canary版本。使用頂部選單,展開Android Studio選單,然後單擊關於Android Studio。您應該使用Android Studio 3.2 Canary 14.此codelab中描述的某些工具僅適用於此版本的Android Studio。
在這裡插入圖片描述

開始程式碼
當使用針對多種語言的複雜真實應用程式,使用多個資源用於不同的螢幕密度並針對不同的體系結構時,Android應用程式束和動態​​功能的好處最為明顯。在此類應用程式中,應用程式束可以大大減少使用者裝置上安裝的APK的大小。

但是,在codelab中,為了演示目的,我們會保持簡單的做法。您需要做的就是在Android Studio中建立一個通用的Android專案,並在建立完後修改該專案。

三、具有拆分APK集的動態交付
動態交付的一個基本要素是Android 5.0(API21)及更高版本上提供的拆分APK機制。使用該機制,Google Play可以將大型應用分解為較小的離散包,並根據需要安裝在使用者的裝置上。
不同型別的拆分APK
您將在此codelab中瞭解有三種拆分APK。
基礎APK
包含所有其他拆分APK可以訪問的程式碼和資源,併為您的應用提供基本功能。當用戶下載應用程式時,總是會包含此APK。

配置APK
僅包含給定裝置配置的本機庫和資源。具體來說,這意味著根據以下幾點優化APK內容:

語言環境
螢幕密度
CPU架構

動態功能APK
包括首次安裝應用程式時不需要的功能,但可以在以後下載和安裝。
Google Play會為您構建並提供所有應用的APK集。而且,對於執行Android 4.4(API20)及更低級別的裝置,Google Play會自動提供針對裝置配置進行了優化的單個APK。

四、構建應用程式束
好的,讓我們開始啟動Android Studio Canary 14。

使用以下步驟建立新的Android Studio專案:

選擇“Start a new Android Studio project”選單項。
在“Create Android Project”螢幕上,選擇專案名稱並使用合理的預設值填寫其餘欄位。
在Target Android Devices螢幕上,選擇“Phone and Tablet”
在下一個螢幕上,選擇“Empty Activity”
配置Activity(可以保持Android Studio提供的預設設定)
點選完成。
以上,你剛剛建立了一個很小的Android專案,打印出“Hello,World!”到螢幕。

建立你的專案
在這一步中,我們將比較和對比構建專案的兩種方法:1)構建整個APK,以及2)構建應用束。

構建APK應該是大多數Android開發人員所熟悉的(轉到Build> Build Bundle(s)/ APK(s)並選擇Build APK(s))。整個APK包括以下所有內容:

所有res值,無論裝置區域設定如何。
所有assets,無論裝置的相關密度如何。
支援所有體系結構,無論裝置的相關配置如何。

構建bundles
作為構建整個APK的替代方法,您可以選擇構建應用束。

首先,開啟app / build.gradle並在android {}塊中新增以下內容:

bundle {
   language {
       enableSplit = true
   }
   density {
       enableSplit = true
   }
   abi {
       enableSplit = true
   }
}

這可確保語言,螢幕密度和abi配置拆分全部被啟用。

注意:將來,預設情況下這些將設定為true,並且不需要此步驟。

等待專案同步。

現在,您可以構建您的App Bundle。轉到Build> Build Bundle(s)/ APK(s)並選擇Build Bundle(s):
在這裡插入圖片描述

Bundles以.aab格式儲存。您可以在構建目錄中看到生成的.aab。請參閱app> build> outputs> bundle> debug> bundle.aab

將bundle上傳到Google Play後,Google Play僅會安裝使用者裝置所需的配置。這包括:

僅對應於裝置區域設定的res值。例如,預設語言設定為日語的使用者將只獲取values-jp中的字串,而不是所有字串。
只有與裝置螢幕密度對應的assets。對於xxxhdpi裝置,這意味著只提供drawable-xxxhdpi的內容,而不是針對其他密度的內容。
如果模組具有x86和ARM CPU體系結構,則只有該體系結構的相關本機庫。

在最基本的層面上,現有的應用程式可以轉換為捆綁“單個模組”和ABI,密度和語言配置。在這種情況下,Google Play為目標裝置提供具有正確配置集合的單個模組,使apk更小。

這種方法使開發人員獲益良多。它使應用程式更小,並且無需構建和釋出多個APK。

五、使用bundletool測試Android App Bundles
構建Android應用程式包後,您應該測試Google Play如何使用它來生成APK以及這些APK在部署到裝置時的行為方式。有兩種方法可以考慮用於測試您的應用包:

本地使用bundletool命令列工具
通過Google Play將您的bundle上傳到Play控制檯並使用新的內部測試工具。
codelab的這一步解釋瞭如何使用bundletool在本地測試您的應用程式包。

什麼是bundletool?
Bundletool是一種Gradle,Android Studio和Google Play用於構建Android應用程式包或將應用程式包轉換為部署到裝置的各種APK的基礎工具。 Bundletool也可作為命令列工具使用,因此您可以重新建立,檢查和驗證Google Play的應用程式APK的伺服器端版本。
下載bundletool
如果您還沒有下載bundletool,請從GitHub下載bundletool。您將下載bundletool-all-0.3.3.jar檔案。

從您的應用包中生成一組APK
當bundletool從您的應用包中生成APK時,它會將它們包含在名為APK 存檔集合的容器中,該容器使用.apks副檔名。要為應用程式包中支援的所有裝置配置生成APK集,請使用bundletool build-apks命令,如下所示。

bundletool build-apks命令語法如下:

bundletool build-apks --bundle=<path to .aab> --output=<out.apks>

只需要兩個引數,1).aab檔案的路徑,以及2)儲存生成的apks的目錄。

1),回想一下Android debug應用程式包(.aab檔案)是在以下位置生成的:
./app/build/outputs/bundle/debug/bundle.aab
2),建立一個目錄來儲存生成的apks:
mkdir out.apks
現在您可以執行build-apks。如果bundletool在您的路徑中,請執行以下命令:

java -jar ~/Downloads/bundletool-all-0.3.3.jar build-apks --bundle=./app/build/outputs/bundle/debug/bundle.aab --output=out.apks

這假設你下載了bundletool-all-0.3.3.jar到〜/ Downloads目錄;如果bundletool-all-0.3.3.jar的路徑不同,請調整命令。
執行命令後,您應該看到與此類似的輸出:

WARNING: The APKs won't be signed and thus not installable unless you also pass a keystore via the flag --ks. See the command help for more information.

如輸出所示,如果您要將APK部署到裝置,則還需要包含應用的簽名信息。我們將在此codelab中跳過該步驟並開始工作。相反,我們將從應用程式包生成apks並檢查輸出。
檢查生成的APK
執行bundletool build-apks會根據語言,螢幕密度和abi生成大量拆分的apk。現在,您將解壓縮out.apk的內容並檢查生成的apks。

建立一個apks /目錄來儲存解壓縮的apks:

mkdir apks

然後,將out.apks的內容解壓縮到apks /:

unzip out.apks -d apks

apks /目錄現在包含許多apk。您的輸出應如下所示:

shailentuli:~/work/android/DynamicAppsCodelab (master)$ ls -l apks
total 4584
-rw-r--r--  1 shailentuli  eng    97167 May  7 15:37 base-arm64_v8a.apk
-rw-r--r--  1 shailentuli  eng    69911 May  7 15:37 base-armeabi_v7a.apk
-rw-r--r--  1 shailentuli  eng    40332 May  7 15:37 base-hdpi.apk
-rw-r--r--  1 shailentuli  eng    36156 May  7 15:37 base-ldpi.apk
Archive:  out.apks
 extracting: apks/base-xhdpi.apk     
 extracting: apks/base-hdpi.apk      
 extracting: apks/base-mdpi.apk      
 extracting: apks/base-ldpi.apk      
 extracting: apks/base-xxxhdpi.apk   
 extracting: apks/base-xxhdpi.apk    
 extracting: apks/base-ca.apk        
 extracting: apks/base-da.apk        
 extracting: apks/base-ja.apk        
 extracting: apks/base-fa.apk        
 extracting: apks/base-tvdpi.apk     
 extracting: apks/base-ka.apk        
 extracting: apks/base-pa.apk        
 extracting: apks/base-ta.apk        
 extracting: apks/base-nb.apk        
 extracting: apks/base-be.apk        
 extracting: apks/base-de.apk        
 extracting: apks/base-ne.apk        
 extracting: apks/base-te.apk        
 extracting: apks/base-af.apk        
 extracting: apks/base-th.apk        
 extracting: apks/base-bg.apk        
 extracting: apks/base-fi.apk        
 extracting: apks/base-si.apk        
 extracting: apks/base-hi.apk        
 extracting: apks/base-vi.apk        
 extracting: apks/base-kk.apk        
 extracting: apks/base-mk.apk        
 extracting: apks/base-sk.apk        
 extracting: apks/base-uk.apk        
 extracting: apks/base-el.apk        
 extracting: apks/base-gl.apk        
 extracting: apks/base-ml.apk        
 extracting: apks/base-nl.apk        
 extracting: apks/base-pl.apk        
 extracting: apks/base-tl.apk        
 extracting: apks/base-sl.apk        
 extracting: apks/base-am.apk        
 extracting: apks/base-km.apk        
 extracting: apks/base-bn.apk        
 extracting: apks/base-in.apk        
 extracting: apks/base-kn.apk        
 extracting: apks/base-mn.apk        
 extracting: apks/base-ko.apk        
 extracting: apks/base-lo.apk        
 extracting: apks/base-ro.apk        
 extracting: apks/base-sq.apk        
 extracting: apks/base-fr.apk        
 extracting: apks/base-ar.apk        
 extracting: apks/base-master.apk    
 extracting: apks/base-sr.apk        
 extracting: apks/base-hr.apk        
 extracting: apks/base-mr.apk        
 extracting: apks/base-tr.apk        
 extracting: apks/base-cs.apk        
 extracting: apks/base-ur.apk        
 extracting: apks/base-bs.apk        
 extracting: apks/base-et.apk        
 extracting: apks/base-es.apk        
 extracting: apks/base-ms.apk        
 extracting: apks/base-is.apk        
 extracting: apks/base-lt.apk        
 extracting: apks/base-eu.apk        
 extracting: apks/base-it.apk        
 extracting: apks/base-pt.apk        
 extracting: apks/base-zu.apk        
 extracting: apks/base-hu.apk        
 extracting: apks/base-ru.apk        
 extracting: apks/base-gu.apk        
 extracting: apks/base-lv.apk        
 extracting: apks/base-iw.apk        
 extracting: apks/base-sv.apk        
 extracting: apks/base-sw.apk        
 extracting: apks/base-my.apk        
 extracting: apks/base-az.apk        
 extracting: apks/base-hy.apk        
 extracting: apks/base-ky.apk        
 extracting: apks/base-uz.apk        
 extracting: apks/base-zh.apk        
 extracting: apks/base-en.apk        
 extracting: apks/base-jp.apk        
 extracting: apks/base-armeabi_v7a.apk  
 extracting: apks/base-arm64_v8a.apk  
 extracting: apks/base-x86_64.apk    
 extracting: apks/base-x86.apk

這裡有很多apk!讓我們劃分這些apk。請注意,所有apk都以base-為字首,因為我們的app只包含一個基本模組。
base-master.apk 包含基本模組的程式碼和資源
base-armeabi_v7a.apk, base-arm64_v8a.apk, 等 ABI配置拆分
base-xhdpi.apk, base-mdpi.apk,等 螢幕密度配置拆分
base-ko.apk, base-fr.apk, 等 語言配置拆分

六、動態功能模組
動態功能模組允許您將某些功能和資源與應用程式的基本模組分開,並將它們包含在您的應用程式包中。通過動態交付,使用者可以在安裝了應用程式的基本APK後,在需要時下載和安裝這些元件。

建立動態功能模組
要向您的應用新增動態功能模組,請執行以下操作:

從選單欄中選擇File> New> New Module。在“Create New Module”對話方塊中,選擇“Dynamic Feature Module”。
在這裡插入圖片描述

在“Configure your new module”螢幕上,為模組命名。請注意,已為您選擇app作為Base application module。
在這裡插入圖片描述
在“Configure your new module”螢幕上,指定模組標題。
在這裡插入圖片描述
如果希望模組可用於按需下載,請勾選“Enable on-demand”框。如果未選中此選項,則當用戶首次下載並安裝您的應用時,就會獲取動態功能模組。

如果您希望此模組可供執行Android 4.4(API20)及更低版本的裝置使用,請檢查“Fusing”框,並將其包含在多個APK中。僅當您選中“Enable on-demand”旁邊的框時,此選項才可用。這意味著您可以為此模組啟用按需行為,並禁用融合以從不支援下載和安裝拆分APK的裝置中省略它。

點選完成並等待專案同步。您應該看到新建立的Payments模組,您的專案結構應如下所示:
在這裡插入圖片描述

您應該很快注意到預設程式碼,資源和結構與標準app模組的預設程式碼,資源和結構類似。

檢查生成的內容
平臺使用您剛為功能模組指定的標題向用戶標識模組,例如,在確認使用者是否要下載模組時。

因此,您的應用程式的基本模組(app)必須包含模組標題作為字串資源,可以進行翻譯。 Android Studio會在基礎模組中為您建立此資源,並將其注入功能模組的manifest檔案中(Payments):

開啟payment / src / main / AndroidManifest.xml,你應該看到代表模組配置的以下XML:

<dist:module
   dist:onDemand="true"
   dist:title="@string/title_payments">
   <dist:fusing include="true" />
</dist:module>

動態功能模組構建配置
使用Android Studio建立新的動態功能模組時,IDE會將以下Gradle外掛應用於動態功能模組的build.gradle檔案。

apply plugin: 'com.android.dynamic-feature'

該外掛包括配置和構建包含動態功能模組的應用程式包所需的Gradle任務和屬性。

當Android Studio建立動態功能模組時,通過將android.dynamicFeatures屬性新增到基礎模組的build.gradle檔案,它使基本模組可見。

開啟app / build.gradle,您應該看到以下內容:

dynamicFeatures = [":payments"]

此外,Android Studio將基本模組作為動態功能模組的依賴項。開啟payment / build.gradle,您應該看到以下內容:

dependencies {
   ...
   implementation project(':app')
}

標準應用程式外掛可用的許多屬性也可用於動態功能模組。由於每個動態功能模組都依賴於基本模組,它還會繼承某些配置。因此,您應該在動態要素模組的build.gradle檔案中省略以下內容:

minifyEnabled屬性(如果需要,可以為每個動態要素模組指定其他ProGuard規則)。
versionCode和versionName:構建應用程式包時,Gradle使用基本模組提供的應用程式版本資訊。您應該從動態模組的build.gradle檔案中省略這些屬性。

七、總結
恭喜!您已完成所有步驟。在此codelab中,您瞭解了Android App Bundle格式,使用bundletool檢查生成的APK並建立了動態功能模組。

在整個codelab中,您使用了debug構建。有關建立已簽名bundles以及如何在Google Play商店中部署它們的詳細資訊,請訪問https://developer.android.com/guide/app-bundle/
在這裡插入圖片描述