1. Android App Bundle 是什么?

从 2021 年 8 月起,新运用需求运用 Android App Bundle 才能在 Google Play 中发布。

Android App Bundle是一种发布格局,打包出来的格局为aab,而之前咱们打包出来的格局为apk。编写完代码之后,将其打包成aab格局(里边包括了一切通过编译的代码和资源),然后上传到Google Play。用户终究装置的还是apk,只不过不是一个,而是多个apk,这些apk是Google Play依据App Bundle生成的。

既然现已有了apk,那要App Bundle有啥用?咱之前打一个apk,会把各种架构、各种言语、各种分辨率的图片等全部放入一个apk中,但详细到某个用户的设备上,这个设备只需求一种so库架构、一种言语、一种分辨率的图片,那其他的东西都在apk里边,这就有点浪费了,不仅下载需求更多的流量,而且还占用用户设备更多的存储空间。当然,也能够通过在打包的时分打多个apk,分别支撑各种密度、架构、言语的设备,但这太麻烦了。

于是,Google Play出手了。

App Bundle是通过签名的二进制文件,可将运用的代码和资源组织到不同的模块中。比方,当某个用户的设备是xxhdpi+arm64-v8a+values-zh环境,那Google Play后台会运用App Bundle中的对应的模块(xxhdpi+arm64-v8a+values-zh)拼装起来,组成一个base apk和多个装备apk供该用户下载并装置,而不会去把其他的像armeabi-v7ax86之类的与当前设备无关的东西拼装进apk,这样用户下载的apk体积就会小许多。体积越小,转化率越高,也更环保。

有了Android App Bundle之后,Google Play还供给了2个东西:Play Feature Delivery 和 Play Asset Delivery。Play Feature Delivery能够按某种条件分发或按需下载运用的某些功用,从而进一步减小包体积。Play Asset Delivery是Google Play用于分发大体积运用的解决方案,为开发者供给了灵活的分发方法和极高的性能。

2. Android App Bundle打包

打Android App Bundle十分简略,直接通过Android Studio就能很方便地打包,当然指令行也能够的。

  • Android Studio打包:Build -> Generate Signed Bundle / APK -> 选中Android App Bundle -> 选中签名和输入暗码 -> 选中debug或许release包 -> finish开始打包
  • gradle指令行打包:./gradlew bundleDebug 或许 ./gradlew bundleRelease

打出来之后是一个类似app-debug.aab的文件,能够将aab文件直接拖入Android Studio进行剖析和检查其内部结构,很方便。

3. 如何测验Android App Bundle?

Android App Bundle包却是打出来了,那怎么进行测验呢?咱们设备上仅允许装置apk文件,aab是不能直接进行装置的。这儿官方供给了3种方法可供选择:Android Studio 、Google Play 和 bundletool,下面咱们一一来介绍。

3.1 Android Studio

运用Android Studio,在咱们平常开发时就能够直接将项目打包成debug的aab并且运转到设备上,只需关键一下运转按钮即可(当然,这之前需求一些简略的装备才行)。Android Studio和Google Play运用相同的东西从aab中提取apk并将其装置在设备上,因此这种本地测验战略也是可行的。这种方法能够验证以下几点:

  • 该项目是否能够构建为app bundle
  • Android Studio是否能够从app bundle中提取方针设备装备的apk
  • 功用模块的功用与运用的基本模块是否兼容
  • 该项目是否能够在方针设备上按预期运转

默许情况下,设备衔接上Android Studio之后,运转时打的包是apk。所以咱们需求装备一下,改成运转时先打app bundle,然后再从app bundle中提取出该设备需求的装备apk,再拼装成一个新的apk并签名,随后装置到设备上。详细装备过程如下:

  1. 从菜单栏中依次选择 Run -> Edit Configurations。
  2. 从左侧窗格中选择一项运转/调试装备。
  3. 在右侧窗格中,选择 General 标签页。
  4. 从 Deploy 周围的下拉菜单中选择 APK from app bundle。
  5. 假如你的运用包括要测验的免装置运用体验,请选中 Deploy as an instant app 周围的复选框。
  6. 假如你的运用包括功用模块,你能够通过选中每个模块周围的复选框来选择要布置的模块。默许情况下,Android Studio 会布置一切功用模块,并且始终都会布置基本运用模块。
  7. 点击 Apply 或 OK。

好了,现在现已装备好了,现在点击运转按钮,Android Studio会构建app bundle,并运用它来仅布置衔接的设备及你选择的功用模块所需求的apk。

3.2 bundletool

bundletool 是一种指令行东西,谷歌开源的,Android Studio、Android Gradle 插件和 Google Play 运用这一东西将运用的通过编译的代码和资源转换为 App Bundle,并依据这些 Bundle 生成可布置的 APK。

前面运用Android Studio来测验app bundle比较方便,可是,官方引荐运用bundletool 从 app bundle 将运用布置到衔接的设备。因为bundletool供给了专门为了帮助你测验app bundle并模仿通过Google Play分发而规划的指令,这样的话咱们就不用上传到Google Play管理中心去测验了。

下面咱们就来实验一把。

  1. 首要是下载bundletool,到GitHub上去下载bundletool,地址:github.com/google/bund…
  2. 然后通过Android Studio或许Gradle将项目打包成Android App Bundle,然后通过bundletool将Android App Bundle生成一个apk容器(官方称之为split APKs),这个容器以.apks作为文件扩展名,这个容器里边包括了该运用支撑的一切设备装备的一组apk。这么说或许不太好懂,咱们实操一下:
//运用debug签名生成apk容器
java -jar bundletool-all-1.14.0.jar build-apks --bundle=app-release.aab --output=my_app.apks
//运用自己的签名生成apk容器
java -jar bundletool-all-1.14.0.jar build-apks --bundle=app-release.aab --output=my_app.apks
--ks=keystore.jks
--ks-pass=file:keystore.pwd
--ks-key-alias=MyKeyAlias
--key-pass=file:key.pwd

ps: build-apks指令是用来打apks容器的,它有许多可选参数,比方这儿的--bundle=path表明:指定你的 app bundle 的途径,--output=path表明:指定输出 .apks 文件的称号,该文件中包括了运用的一切 APK 零部件。它的其他参数咱们感兴趣能够到bundletool查阅。

履行完指令之后,会生成一个my_app.apks的文件,咱们能够把这个apks文件解压出来,看看里边有什么。

│ toc.pb
│
└─splits
        base-af.apk
        base-am.apk
        base-ar.apk
        base-as.apk
        base-az.apk
        base-be.apk
        base-bg.apk
        base-bn.apk
        base-bs.apk
        base-ca.apk
        base-cs.apk
        base-da.apk
        base-de.apk
        base-el.apk
        base-en.apk
        base-es.apk
        base-et.apk
        base-eu.apk
        base-fa.apk
        base-fi.apk
        base-fr.apk
        base-gl.apk
        base-gu.apk
        base-hdpi.apk
        base-hi.apk
        base-hr.apk
        base-hu.apk
        base-hy.apk
        base-in.apk
        base-is.apk
        base-it.apk
        base-iw.apk
        base-ja.apk
        base-ka.apk
        base-kk.apk
        base-km.apk
        base-kn.apk
        base-ko.apk
        base-ky.apk
        base-ldpi.apk
        base-lo.apk
        base-lt.apk
        base-lv.apk
        base-master.apk
        base-mdpi.apk
        base-mk.apk
        base-ml.apk
        base-mn.apk
        base-mr.apk
        base-ms.apk
        base-my.apk
        base-nb.apk
        base-ne.apk
        base-nl.apk
        base-or.apk
        base-pa.apk
        base-pl.apk
        base-pt.apk
        base-ro.apk
        base-ru.apk
        base-si.apk
        base-sk.apk
        base-sl.apk
        base-sq.apk
        base-sr.apk
        base-sv.apk
        base-sw.apk
        base-ta.apk
        base-te.apk
        base-th.apk
        base-tl.apk
        base-tr.apk
        base-tvdpi.apk
        base-uk.apk
        base-ur.apk
        base-uz.apk
        base-vi.apk
        base-xhdpi.apk
        base-xxhdpi.apk
        base-xxxhdpi.apk
        base-zh.apk
        base-zu.apk

里边有一个toc.pb文件和一个splits文件夹(splits望文生义,便是拆分出来的一切apk文件),splits里边有许多apk,base-最初的apk是主module的相关apk,其间base-master.apk是基本功用apk,base-xxhdpi.apk则是对资源分辨率进行了拆分,base-zh.apk则是对言语资源进行拆分。

咱们能够将这些apk拖入Android Studio看一下里边有什么,比方base-xxhdpi.apk

│  AndroidManifest.xml
|  
|  resources.arsc
│
├─META-INF
│      BNDLTOOL.RSA
│      BNDLTOOL.SF
│      MANIFEST.MF
│
└─res
    ├─drawable-ldrtl-xxhdpi-v17
    │      abc_ic_menu_copy_mtrl_am_alpha.png
    │      abc_ic_menu_cut_mtrl_alpha.png
    │      abc_spinner_mtrl_am_alpha.9.png
    │
    ├─drawable-xhdpi-v4
    │      notification_bg_low_normal.9.png
    │      notification_bg_low_pressed.9.png
    │      notification_bg_normal.9.png
    │      notification_bg_normal_pressed.9.png
    │      notify_panel_notification_icon_bg.png
    │
    └─drawable-xxhdpi-v4
            abc_textfield_default_mtrl_alpha.9.png
            abc_textfield_search_activated_mtrl_alpha.9.png
            abc_textfield_search_default_mtrl_alpha.9.png
            abc_text_select_handle_left_mtrl_dark.png
            abc_text_select_handle_left_mtrl_light.png
            abc_text_select_handle_middle_mtrl_dark.png
            abc_text_select_handle_middle_mtrl_light.png
            abc_text_select_handle_right_mtrl_dark.png
            abc_text_select_handle_right_mtrl_light.png

首要,这个apk有自己的AndroidManifest.xml,其次是resources.arsc,还有META-INF签名信息,终究是与自己称号对应的xxhdpi的资源。

再来看一个base-zh.apk:

│  AndroidManifest.xml
│  resources.arsc
│
└─META-INF
        BNDLTOOL.RSA
        BNDLTOOL.SF
        MANIFEST.MF

也是有自己的AndroidManifest.xml、resources.arsc、签名信息,其间resources.arsc里边包括了字符串资源(能够直接在Android Studio中检查)。

剖析到这儿咱们对apks文件就有必定的了解了,它是一个压缩文件,里边包括了各种终究需求组成apk的各种零部件,这些零部件能够依据设备来按需组成一个完整的app。 比方我有一个设备是只支撑中文、xxhdpi分辨率的设备,那么这个设备其实只需求下载部分apk就行了,也便是base-master.apk(基本功用的apk)、base-zh.apk(中文言语资源)和base-xxhdpi.apk(图片资源)给组合起来。到Google Play上下载apk,也是这个流程(假如这个项目的后台上传的是app bundle的话),Google Play会依据设备的特性(CPU架构、言语、分辨率等),首要下载基本功用apk,然后下载与之装备的CPU架构的apk、言语apk、分辨率apk等,这样下载的apk是最小的。

  1. 生成好了apks之后,现在咱们能够把安卓测验设备插上电脑,然后运用bundletool将apks中适合设备的零部件apk选择出来,并布置到已衔接的测验设备。详细操作指令:java -jar bundletool-all-1.14.0.jar install-apks --apks=my_app.apks,履行完该指令之后设备上就装置好app了,能够对app进行测验了。bundletool会去识别这个测验设备的言语、分辨率、CPU架构等,然后选择适宜的apk装置到设备上,base-master.apk是首要需求装置的,其次是言语、分辨率、CPU架构之类的apk,运用Android 5.0以上的split apks,这些apk装置之后能够同享一套代码和资源。

3.3 Google Play

假如我终究便是要将Android App Bundle发布到Google Play,那能够先上传到Google Play Console的测验途径,再通过测验途径进行分发,然后到Google Play下载这个测验的App,这样肯定是最贴近于用户的运用环境的,比较引荐这种方法进行终究的测验。

4. 拆解Android App Bundle格局

首要,放上官方的格局拆解图(下图包括:一个基本模块、两个功用模块、两个资源包):

Android App Bundle

app bundle是通过签名的二进制文件,可将运用的代码和资源装进不同的模块中,这些模块中的代码和资源的组织方法和apk中类似,它们都能够作为单独的apk生成。Google Play会运用app bundle生成向用户供给的各种apk,如base apk、feature apk、configuration apks、multi-APKs。图中蓝色标识的目录(drawable、values、lib)表明Google Play用来为每个模块创建configuration apks的代码和资源。

  • base、feature1、feature2:每个顶级目录都表明一个不同的运用模块,基本模块是包括在app bundle的base目录中。
  • asset_pack_1asset_pack_2:游戏或许大型运用假如需求大量图片,则能够将asset模块化处理成资源包。资源包能够依据自己的需求,在适宜的机遇去恳求到本地来。
  • BUNDLE-METADATA/:包括元数据文件,其间包括对东西或运用商铺有用的信息。
  • 模块协议缓冲区(*pb)文件:元数据文件,向运用商铺说明每个模块的内容。如:BundleConfig.pb 供给了有关 bundle 本身的信息(如用于构建 app bundle 的构建东西版本),native.pb 和 resources.pb 说明晰每个模块中的代码和资源,这在 Google Play 针对不同的设备装备优化 APK 时十分有用。
  • manifest/:与 APK 不同,app bundle 将每个模块的 AndroidManifest.xml 文件存储在这个单独的目录中。
  • dex/:与 APK 不同,app bundle 将每个模块的 DEX 文件存储在这个单独的目录中。
  • res/lib/assets/:这些目录与典型 APK 中的目录完全相同。
  • root/:此目录存储的文件之后会从头定位到包括此目录地点模块的任意 APK 的根目录。

5. Split APKs

Android 5.0 及以上支撑Split APKs机制,Split APKs与常规的apk相差不大,都是包括通过编译的dex字节码、资源和清单文件等。区别是:Android能够将装置的多个Split APKs视为一个运用,也便是尽管我装置了多个apk,但Android系统认为它们是同一个app,用户也只会在设置里边看到一个app被装置上了;而平常咱们装置的普通apk,一个apk就对应着一个app。Android上,咱们能够装置多个Split APK,它们是共用代码和资源的。

Split APKs的优点是能够将单体式app做拆分,比方将ABI、屏幕密度、言语等方法拆分红多个独立的apk,按需下载和装置,这样能够让用户更快的下载并装置好apk,并且占用更小的空间。

Android App Bundle终究也便是运用这种方法来进行装置的,比方我上面在履行完java -jar bundletool-all-1.14.0.jar install-apks --apks=my_app.apks指令之后,那么终究装置到手机上的apk文件如下:

Android App Bundle

ps:5.0以下不支撑Split APKs,那咋办?没事,Google Play会为这些设备的用户装置一个全量的apk,里边什么都有,问题不大。

6. 国内商铺支撑Android App Bundle吗?

Android App Bundle不是Google Play的专有格局,它是开源的,任何商铺想支撑都能够的。

上面扯那么大一堆有的没的,这玩意儿这么好用,那国内商铺的支撑情况如何。我查了下,发现就华为能够支撑,手动狗头。

华为 Android App Bundle developer.huawei.com/consumer/cn…

7. 小结

现在上架Google Play必须上传Android App Bundle才行了,所以有必要简略了解下。简略来说便是Android App Bundle是一种新的发布格局,上传到商铺之后,商铺会运用这个Android App Bundle生成一堆Split APKs,当用户要去装置某个app时,只需求按需下载Split APKs中的部分apk(base apk + 各种装备apk),进行装置即可,总下载量大大削减。

参考材料

  • splits——安卓gradle blog.csdn.net/weixin_3762…
  • Android App Bundle探索 /post/684490…
  • Android App Bundle 简介 developer.android.google.cn/guide/app-b…
  • 装备基本模块 developer.android.google.cn/guide/app-b…
  • 测验 Android App Bundle developer.android.google.cn/guide/app-b…
  • app bundle 的代码透明性机制 developer.android.google.cn/guide/app-b…
  • Android App Bundle 格局 developer.android.google.cn/guide/app-b…
  • Android App Bundle 常见问题解答 developer.android.google.cn/guide/app-b…
  • 视频材料 App Bundles – MAD Skills :www.youtube.com/playlist?li…
  • Android App Bundle解析 zhuanlan.zhihu.com/p/86995941
  • bundletool developer.android.google.cn/studio/comm…
  • 从指令行构建运用 developer.android.google.cn/studio/buil…