oynix

于无声处听惊雷,于无色处见繁花

AAB介绍以及bundletool的使用

自2021年8月开始,GooglePlay商店要求开发者使用AAB来发布新应用。自打2018年5月谷歌官方推出AAB,已经过去了3个年头。

介绍

AAB,即Android App Bundle,可以把它理解成是新一代的APK。相比于APK,它的优点是可以进一步减小安装包的大小。

举个例子,如果项目了引用了native库,那么一般都会有多个so库文件,每个库文件对应一种abi架构。

当使用apk安装时,需要把所有so文件打到apk文件里,移动端下载该apk文件来安装程序;

当使用aab安装时,会根据移动端的架构选择出对应的库文件,以及其他资源和代码,打到apk文件里,移动端下载该apk文件来安装程序,这样就不需要下载其他用不上的库文件,下载的文件小,省时间又省流量,用户体验好,所有官方主推这种格式。

可以看到,中间有个过程,根据请求安装的客户端来生成对应的apk安装包,这件事就是Goolge Play商店在做。目前,不是所有的应用商店都支持了这个操作,只能在支持的应用商店上使用aab分发应用,不支持的依然要用apk格式的文件。

分割维度

根据官方文档介绍,点击查看,支持3个维度的分割:语言、分辨率和架构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
android {
// When building Android App Bundles, the splits block is ignored.
splits {...}

// Instead, use the bundle block to control which types of configuration APKs
// you want your app bundle to support.
bundle {
language {
// Specifies that the app bundle should not support
// configuration APKs for language resources. These
// resources are instead packaged with each base and
// feature APK.
enableSplit = false
}
density {
// This property is set to true by default.
enableSplit = true
}
abi {
// This property is set to true by default.
enableSplit = true
}
}
}

生成aab文件

Gradle任务中,有配置好的task,bundleDebug、bundleRelease,执行对应的task就可以生成aab文件。

严格来讲,aab文件并不是安装包,在生成的时候并不知道目标设备的信息,所以只能算是一堆零件,可以按需组装。

bundletool

谷歌官方介绍 官方项目地址
这是个专门用来操作aab文件的工具,可在项目里直接下载jar包使用,也可以通过brew install bundletool安装。

这个工具可以通过aab文件生成apks、将apks安装到手机,还有几个不常用的功能,可以看项目里的介绍。

  1. 生成设备规范的JSON文件

    1
    $ bundletool get-device-spec --output=/tmp/device-spec.json

    这个命令可以生成当前连接设备的规范文件,也就是参数信息文件。也可以手动创建,格式如下:

    1
    2
    3
    4
    5
    6
    {
    "supportedAbis": ["arm64-v8a", "armeabi-v7a"],
    "supportedLocales": ["en", "fr"],
    "screenDensity": 640,
    "sdkVersion": 27
    }
  2. 生成apks

    1
    $ bundletool build-apks --bundle=/MyApp/my_app.aab --output=/MyApp/my_app.apks

    此外还可以通过ks,ks-pass,ks-key-alias,key-pass四个参数来指定签名,如果不指定则使用缺省的签名文件
    这个apks是针对所有设备,加上--connected-device数可生成只针对当前连接的设备,多个设备时使用--device-id=serial-id,也可以使用--device-spec=xxx.json通过JSON文件来限定。
    为什么是apks呢,因为这真的就是多个apk。把.apks改成.zip后解压缩,就会看到里面有很多apk文件,包括基本的apk,以及按维度分割的apk。

  3. 安装apks到设备

    1
    $ bundletool install-apks --apks=xxx.apks

    可以再检查一下都安装了哪几个apk文件:

    1
    2
    3
    $ adb shell pm path your.app.package.name
    package:/data/app/your.app.package.name-_cJc4OrWZxYQCwC4AaWAtw==/base.apk
    package:/data/app/your.app.package.name-_cJc4OrWZxYQCwC4AaWAtw==/split_config.arm64_v8a.apk

    可以看到,安装了一个基本的base.apk,以及一个对应abi的apk。想查询设备上其他app时,可以通过这个命令来查询包名:

    1
    $ adb shell pm list package | grep key-word
  4. 其他命令

  • 抽取apks的子集
    1
    2
    3
    4
    bundletool extract-apks
    --apks=/MyApp/my_existing_APK_set.apks
    --output-dir=/MyApp/my_pixel2_APK_set.apks
    --device-spec=/MyApp/bundletool/pixel2.json
  • 获取下载的大小
    1
    bundletool get-size total --apks=/MyApp/my_app.apks

总结

国内一般都是无线网来下载、安装,但老外们使用流量的却不在少数,所以如果能减少安装包的大小,对于提高CVR还是有一定帮助的。

------------- (完) -------------
  • 本文作者: oynix
  • 本文链接: https://oynix.com/2021/09/09986fb81e90/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

欢迎关注我的其它发布渠道