1. 程式人生 > >Android App瘦身新姿勢——Android App Bundle

Android App瘦身新姿勢——Android App Bundle

由於博主長期從事海外App的開發,所以心繫谷歌爸爸的動向呀,最近谷歌爸爸推出了一個Android App Bundle的東西,據說可以壓縮包體,當然這僅限於上傳Google Play的應用,國內市場不支援,當然我們也可以學習谷歌爸爸的思想。
在這裡插入圖片描述

概述

Android App Bundle是Google最新推出的Apk動態打包,動態元件化的技術,與Instant App不同,AAB是藉助Split Apk完成動態載入,使用AAB動態下發方式,可以大幅度減少應用體積。
在這裡插入圖片描述

從這個動態圖中,我們就可以大概知道了App Bundle的原理是什麼,App Bundle將這些特性在多個維度進行拆分,在資源維度,ABI維度和Language維度進行了拆分,你只要按需組裝你的Apk然後安裝即可。再說的直白一點就是,比如,專案中可能會xxhdpi,xhdpi各有一套圖,或者x86,armeabi的又各有一套so庫,以前的安裝方式,是把這些全部裝進使用者的手機中,使用App Bundle,假設你是一個x86,xxhdpi的手機,那麼App Bundle會幫你拼裝好一個apk,這個apk的資源只有xxhdpi的,而且so庫只有x86,其他無關的都會剔除。

App Bundles將一個apk拆分成多個apk,我們的apk一般會被拆分為如下幾個部分:

Base Apk:首次安裝的apk,公共程式碼和資源,所以其他的模組都基於Base Apk;
Configuration APKs:native libraries 和適配當前手機螢幕解析度的資源;
Dynamic feature APKs:不需要在首次安裝就載入的模組。

在這裡插入圖片描述

AAB並不是一個外掛化框架,它利用的是Android Framework提供的split apks技術來完成的,而所有安裝split apk工作均是通過IPC交由google play完成。 想了解更多關於split apks的內容,請關注這裡:

https://developer.android.com/studio/build/configure-apk-splits?authuser=2

如何使用App Bundle

在這裡插入圖片描述
1.將你的Android Studio升級為3.2及其以上版本
2.新增對Dynamic Delivery的支援
其實就是一些基礎apk需要東西,比如簽名,MAIN入口等,詳細請閱讀:
https://developer.android.google.cn/studio/projects/dynamic-delivery
3.構建App Bundle
在這裡插入圖片描述
當你是3.2以上的studio時候,就可以選擇build bundle,來構建app bundle的檔案
在這裡插入圖片描述


構建出來就是一個.aab檔案

4.通過bundletool工具來測試你的.aab檔案
下載地址:https://github.com/google/bundletool
解壓出來就是一個jar包,以bundletool-all-0.6.0.jar為例子

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

這個命令構建出來的是沒有簽名的檔案,要有簽名的,需要如下:

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

這些引數的說明詳見如下:
在這裡插入圖片描述
在這裡插入圖片描述

無疑就是一些打包的簽名,密碼等,還有一些特殊的屬性,詳細大家可以看英文介紹,使用命令後,出來的是app.apks檔案,我們可以解壓縮一下,出來就是如下的內容:
在這裡插入圖片描述

在這裡插入圖片描述

從打包出來的東西,更印證了我們前面所說的原理

5.app的簽名上傳google play
6.將你的包上傳到google console

相容性問題

Api < 21的手機無法進行模組化,Google Play會對其進行Multiple Apks操作來進行下發操作。
Enable on-demand: 是否啟用按需下載,如果不啟用,會直接打進Apk
Fusing:熔斷操作,是否安裝到不支援按需下載的裝置中
Module title: 模組標題

對於動態元件的一些使用場景

語言包的動態下發
當Split 針對語言進行劃分時候,使用者下載的Apk僅僅只能下載下來一個Base Apk,包含他的當前系統語言,你可以將其他語言包作為Dynamic feature下發給使用者,做到語言包的動態下發

功能的動態下發
對於某些獨立的feature,這其實跟之前的外掛化方案有異曲同工之處,而且天然支援友好,動態下發業務需求能有效的減少包大小,增加啟動速度,減少安裝時間等等。