對 Android 未來的發展十分重要的技術 | App Bundles

2021-03-06 程式設計師技術

作者丨Dotry
https://www.jianshu.com/p/57cccc680bb6

在今年的Google I/O大會上,Google向 Android 引入了新 App 動態化框架(即Android App Bundle,縮寫為AAB),AAB是藉助Split Apk完成動態加載,使用AAB動態下發方式,可以大幅度減少應用體積。現在只須在 Android Studio 中構建一個應用 (app bundle),就可以將應用所需的全部內容 (適用於所有設備) 都涵蓋在內:所有語言、所有設備屏幕大小、所有硬體架構。它本身並不支持動態化,只是動態化的一個載體文件,真正實現邏輯並不是它。

1.Split APKs:

多apk 支持以下類型屏幕密度ABI,使用新的拆分機制,構建同一個應用程式的hdpi版本和mdpi版本,能夠共享很多的任務 (如 javac,dx,proguard)。此外,它會被認為是一個單一的variant,並且同一個測試程序將會被用來測試每個多APK。

2.Dynamic Feature Module:

這個概念感覺像是遊戲裡面到某個新地圖才開始下載那樣,不是一來就把所有資源都下載下來。這樣顯得apk更小了,而且就像遊戲邏輯一樣,高級副本的地圖新手沒機會進入,就不必要下載這部分內容,有的用戶可能很久都不會用到部分功能,就可以放在dynamic feature module,等要用的時候再下載。

下面是Dynamic Delivery示意效果圖:

(左) 舊版 APK 交付樣例 - 將全部資源都交付至設備;

(右) 動態交付樣例 - 只向設備交付必要資源

具體一下說明和視頻演示可以查看網站

https://developer.android.com/guide/app-bundle

好處:


Size更小【個人理解是相對用戶來感知來說更小】


Google has claimed that it can reduce app sizes up to 50 percent


Its own apps like YouTube and other apps like LinkedIn which saw a 23% file reduction


安裝更快【base.apk被優化相對來說安裝會更快】


支持動態發布


限制


僅限於通過 Google Play 發布的應用,(Google進一步鞏固自身生態)


需要加入到 Google 的 beta program


最低支持版本Android 5.0 (API level 21)


低於Android 5.0 (API level 21) 的版本GooglePlay會優化Size,但不支持動態交付。


成本


需要升級到Android Studio 3.2修改工程以便支持App Bundle格式


集成Play Core Library

結合Google Play Dynamic Delivery (動態交付) , 實現動態功能


Android App Bundle 支持模塊化,通過Dynamic Delivery with split APKs,將一個apk拆分成多個apk,按需加載(包括加載C/C++ libraries),這樣開發者可以隨時按需交付功能,而不是僅限在安裝過程中。

Base Apk


首次安裝的apk,公共代碼和資源,所以其他的模塊都基於Base Apk

Configuration APKs

native libraries 和適配當前手機屏幕解析度的資源

Dynamic feature APKs

不需要在首次安裝就加載的模塊


具體的結構如下:

具體使用時,在Android Studio新增一項module——Dynamic Feature Module。

選中Dynamic Feature Module直接next到以下頁面

•   Enable on-demand: 是否支持按需下載模式。如果不支持,那麼該feature則在安裝app時被安裝。

•   Fusing: 如果app運行在Android 5.0(不包括5.0)以下,勾選Fusing則表示該feature會被一起打包至完整apk中。

•   Module Title當確認用戶是否想要下載模塊時,平臺使用該標題來向用戶標識模塊。


新建項目生成的項目結構圖如下:

如圖feature生成的目錄結構和我們常用的module結構相差無幾。


例如谷歌官方提供的demo項目結構如下:

在demo中有四個feature,通過module名很清楚這些feature是舉例介紹如何訪問代碼、資源、so等。


我們可以看到源碼裡面主要是通過一個SplitInstallManager類來進行管理不同的模塊的。

以下是加載對應模塊的簡單使用:

dynamic feature module編譯所使用的插件com.android.dynamic-feature通過編譯產物分析,運行示例後,發現在所有dynamic feature模塊build目錄下均會生成apk文件。


直接運行後我們在feature 下打開目錄查看如下:

可以發現會生成一個apk 文件,這個apk文件就是用來被base.apk 調用的。


接著反編譯base.apk,會發現兩個的現象:


•   所有dynamic feature module的代碼、資源、so並未打包至主apk中。

•   主apk manifest信息包括所有dynamic feature module的manifest,即feature manifest會被合併至主apk manifest中。
以上兩個現象需要我們在模塊劃分的時候做好規劃,隨著需求不斷迭代,結構規劃可能需要做對應的調整。

•   Build Bundle(s)

Android App Bundle:提供一種全新編譯產物格式文件aab,使用Android Studio提供的App Bundle即可。

生成方式如下:


1.通過命令行生成,在命令行裡輸入以下命令即可:
./gradlew :base:bundleDebug

2.通過Android Studio 生成

點擊「Build Bundle(s)」之後我們會在主工程build目錄下回生成bundle.aab文件,該文件是壓縮格式文件,解壓該aab文件內容如下:

由此可以看到其結構同項目結構分包相似。

打開其中具體某一目錄可以發現其和正常apk解壓後的結構相差無幾:

從aab文件內容,可知其包含base和feature的代碼、資源、so等,同時還有BundleConfig.pb這一配置文件,該配置文件是google play用於拆分apk。如果我們需要在google play上支持動態發布,只需要上傳aab文件即可,後續工作交給google play完成。

使用bundletool測試Android應用程式包

在本地使用 bundletool命令行工具:

從GitHub下載bundletool 工具

https://github.com/google/bundletool/releases

執行java –jar bundletool.jar 可以將」.aad」文件轉換成」apks」文件。

例如上述生成一個bundle.aab 文件,採用命令生成bundle.apks文件

java -jar bundletool.jar build-apks --bundle=bundle.aab --output=bundle.apks --ks=features.jks --ks-pass=pass:tcl123 --ks-key-alias=key0 --key-pass=pass:tcl123

執行安裝命令:

java -jar bundletool.jar install-apks --apks=bundle.apks

【目前windows 10 好像是有bug】

有關於命令參數的配置可以見下表:

獲取連結設備信息,命令如下::


java -jar bundletool.jar get-device-spec --output=tcl.json --adb=D:/Android/SDK/platform-tools/adb.exe

我們分割出該apks文件之後就會生成以下apk。命令如下:


java -jar bundletool.jar  extract-apks --apks=bundle.apks --output-dir=D:undleapks --device-spec=tcl.json

由此也可以證明我們的生成.aad 文件是正確的。

 推薦↓↓↓ 

涵蓋:程式設計師大咖、源碼共讀、程式設計師共讀、數據結構與算法、黑客技術和網絡安全、大數據科技、編程前端、Java、Python、Web編程開發、Android、iOS開發、Linux、資料庫研發、幽默程式設計師等。

相關焦點

  • Android App Shortcuts
    :name=".MainActivity"    android:label="@string/app_name"    android:screenOrientation="portrait">    <intent-filter>        <action android:name="android.intent.action.MAIN"/>        <
  • App安全評估手冊-Android
    在一個android應用中,一個Activity通常就是一個單獨的屏幕,它上面可以顯示一些控制項也可以監聽並處理用戶的事件做出響應。Activity之間通過Intent進行通信。可以在桌面生成快捷方式,應用程式的入口4.Icon屬性:指定應用程式的圖標5.android:theme屬性:指定主題android:theme="@android:style/Theme.Dialog"android:exported是否允許外部程序調用下面就是我們再AndroidManifest.xml中定義的組件的常見形式
  • 還在用 android.support?谷歌強推 AndroidX 啦!
    :1.1.2com.android.support:appcompat-v7androidx.appcompat:appcompat:1.0.0com.android.support:cardview-v7androidx.cardview:cardview:1.0.0com.android.support:coordinatorlayoutandroidx.coordinatorlayout:coordinatorlayout
  • Android 約束布局(ConstraintLayout)詳解
    >添加約束添加約束十分簡單,我們首先從 Design 界面的 Palette 操作欄拖動一個 Button 到藍圖中,添加完後,點擊選中它,效果是這樣的:> app:layout_constraintTop_toTopOf="parent" android:layout_marginTop="8dp" android:layout_marginLeft="8dp" app:layout_constraintLeft_toLeftOf="parent" android:layout_marginRight
  • 機器學習技術在 App 啟動測試中的一次嘗試
    背景app啟動時間是一個常規的性能測試指標,通常在app啟動過程中研發會加入一些耗時的數據預處理過程。
  • Android實現年月選擇器功能
    ><android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent
  • Adblock Plus攻克,十五萬條規則依然十分流暢
    經過好幾天的折騰,終於把adblockplus搞定了,我和群管理以及大佬們體驗了,訂閱了一二十萬條攔截規則,依然十分流暢,攔截效果也不錯。海闊視界規則分享,當前分享的是:首頁頻道,小棉襖親情推薦¥home_rule¥{"firstHeader":"class","title":"漫畫臺","author":"@LoyDgIk","url":"https://getconfig-globalapi.yyhao.com/app_api/v5/getsortlist/?
  • Android用戶態啟動流程分析
    除了屬性服務,init 中另外一個重要的功能就是對 initrc 的處理,畢竟作為用戶態的第一個進程,其肩負了啟動其他進程和服務的使命。在 Linux 中使用 init.rc 文件來描述各個啟動項的啟動屬性和順序,關於該文件格式的詳細介紹可以參考 initrc/README.md[4]。
  • 帶你了解 Android 約束布局 ConstraintLayout
    ><android.support.constraint.ConstraintLayout    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    android:layout_width
  • Android Design Support Library v28 新增組件詳解
    android:attr/textAppearanceLargeInverse"        app:icon="@mipmap/ic_launcher"        app:iconSize="30dp"        app:iconTint="@color/colorPrimary" />    <android.support.design.button.MaterialButton
  • APP的生死之道
    讓app活的久一點,可以從兩個方面來優化:儘量保證不被系統殺死能夠自我復活如何保證不被殺?核心就是提高adj的值,讓系統覺得不能殺。最厲害的就是將自己的應用弄成系統應用,但是這個不在技術討論的範疇。1、進程拆分內存的大小也是系統殺死進程的一個考量,所以通過進程拆分來來減少整個app的內存大小。
  • Android真機或模擬器激活Xposed框架的方法
    就無法替換/system/bin/app_process)(2).安裝de.robv.android.xposed.installer_v32_de4f0d.apk(3).將app_process寫進system.img中,把system.img掛載到新建的system文件夾,在Ubuntu上執行命令:sudo mount -t ext4 -o loop system.img
  • Android 11 適配中遇到的問題及解決辦法
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3449)at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)at android.app.servertransaction.LaunchActivityItem.execute
  • Android模擬器之Genymotion
    android模擬器中速度最快的,也就是genymotion,另外VS2015中,微軟自帶的android模擬器運行速度確實可以(感興趣的同學可以嘗試),今天重點介紹genymotion的安裝以及配置,使用。
  • Android世界的起源 — Zygote
    然後,init進程會去讀取一個配置文件init.rc,這個配置文件記錄了需要啟動的系統服務,例如android調試守護進程,USB守護進程等。當然這其中也包含創建Zygote進程的配置有興趣的可以通過adb shell查看設備中的文件,這裡推薦使用模擬器(可以通過su命令獲取root權限)
  • app測試系列:ADB常用的指令詳解
    adb是android sdk裡的一個工具, 用這個工具可以直接操作管理android模擬器或者真實的android設備。還可以進行很多手機操作,如安裝軟體,系統升級,運行shell命令等。其實簡單來說,adb就是連接Android手機與PC端的橋梁,可以讓用戶在電腦上對手機進行全面操作。
  • Android創建進程
    * @param appDataDir null-ok the data directory of the app. * @param invokeWith null-ok the command to invoke with.
  • 夜神模擬器模擬APP+Appium+mitmdump數據抓取
    這兒需要安裝Appium用來控制夜神模擬器對app進行操作。1 安裝appium從官網下載(http://appium.io/)直接安裝即可。啟動界面如下:通過appium控制夜神模擬器內的app時與直接操作手機app類似,但是可能連接時會報錯。
  • Android Things 開發入門
    可以看出ats對標準android framework的支持還是挺多的,這也就保證了app開發者們可以很輕鬆的做ats的開發。樹莓派針腳說明ats的開發很多時候都是操作硬體,所以我們就有必要去研究,如何去操作外設設備,一個很重要的方法就是通過外設接口去操作。看下圖:
  • Android三方應用實現靜默安裝
    code小生,一個專注Android領域的技術平臺作者:最憶是深秋地址:https://www.jianshu.com/p/681016514bc4聲明:本文已獲最憶是深秋授權,轉發等請聯繫原作者授權背景 一個三方應用想要內置進我們 ROM,並且想要能夠靜默安裝應用。