Android App bundle 调研

Android App Bundle是Google最新推出的Apk动态打包,动态组件化的技术,与Instant App不同,AAB是借助Split Apk完成动态加载,使用AAB动态下发方式,可以大幅度减少应用体积。

概述

App bundle 将apk在资源纬度、ABI纬度和语言纬度进项拆分,然后客户端根据设备情况等信息按需组合安装所需要的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 和适配当前手机屏幕分辨率的资源的apk,根据设备的信息进行组合安装;
Dynamic feature APKs:特性功能模块,不需要在首次安装就加载。

准备

使用APP Bundle打包方式需要Android studio 3.2以上的版本。

要使用特性功能模块动态加载功能,需要在项目中加入google play核心库

1
2
3
4
5
6
7
8
// In your app’s build.gradle file:
...
dependencies {
// This dependency is downloaded from the Google’s Maven repository.
// So, make sure you also include that repository in your project's build.gradle file.
implementation 'com.google.android.play:core:1.6.4'
...
}

具体的使用play核心库下载模块方法参考goole官方文档

开始使用

打包

使用Android studio的菜单栏Build->Build Bundle(s)/Apk(s)->Build Bundle(s)打出来的即是.aab后缀的Android App Bundle包,我们将这个aab文件和签名文件上传到google play后台,google则会稍后为我们拆分打包出对应各个设备的签名apk包,客户最终下载的就是针对客户设备打包出来的最终apk包(不包含一些设配其他设备的资源等,所以客户下载的包体会相应减小)。

配置

可以在build.gradle的android节点下配置下面的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
android {
...

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

...
}

enableSplit为true表示对应的纬度会进行拆分。

特性功能模块

创建特性功能模块跟我们创建普通的module差不多,不过选择的是Dynamic Feature Module。有三个参数需要配置
1.module title这是动态下载安装时显示给用户的名字。
2.Install-time inclusion,配置是否按需下载。如果不启用,会直接打进Apk.
3.fusing, 对于不支持按需下载的设备(Android 5.0以下的系统),是否直接融合安装。

配置完之后,Android studio会为我们生成一些对应的配置,主app模块的build.gradle文件中会生成下面的代码:

1
2
3
4
5
6
7
android{
...

dynamicFeatures = [":dynamicfeature"]

...
}

动态加载模块的AndroidManifest文件则会生成如下配置

1
2
3
4
5
6
7
8
9
10
11
12
13
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:dist="http://schemas.android.com/apk/distribution"
package="com.aube.dynamicfeature">

<dist:module
dist:instant="false"
dist:title="@string/title_dynamicfeature">
<dist:delivery>
<dist:on-demand />
</dist:delivery>
<dist:fusing dist:include="true" />
</dist:module>
</manifest>

测试

测试打包出来的aab文件有两种方式。

上传到google play控制后台,然后下载测试。

暂时没条件测试,先使用方式二测试

使用bundletool工具进行本地测试

参考文档
工具下载地址

从 app bundle 生成一组 APK
当 bundletool 从您的 app bundle 生成 APK 时,它会将这些 APK 包含在一个名为“APK set archive”的容器中,该容器以 .apks 作为文件扩展名。要从 app bundle 为应用支持的所有设备配置生成一组 APK,请使用 bundletool build-apks 命令,如下所示。

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

也可以指定签名信息

1
2
3
4
5
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

将Apk部署到连接电脑的设备

1
bundletool install-apks --apks=/MyApp/my_app.apks

工具更多的的使用方法参考官方文档

文章目录
  1. 1. 概述
  2. 2. 准备
  3. 3. 开始使用
    1. 3.1. 打包
    2. 3.2. 配置
    3. 3.3. 特性功能模块
  4. 4. 测试
    1. 4.1. 上传到google play控制后台,然后下载测试。
    2. 4.2. 使用bundletool工具进行本地测试
|