AppBundle
Android App Bundle是一种Google官方新推出的应用资源包. 可以有效的减少包体大小,提升启动速度.
Bundle原理
APK的方式:
传统APK,开发者因为不清楚用户的CPU架构,机器分辨率,当前语言环境,采用直接把所有资源放到APK里面. 而实际上一个X86平板(一般是64位)的xxhdpi的中国用户,他并不需要下载arm架构的so文件,mdpi的资源文件,以及日语语言资源包. 但是GP清楚用户的信息,所以GP就可以有针对性的去下发这些APK资源文件,从而达到减少包体大小的目的. 因为包体资源减少了,对应的启动速度也变快了. 这就是AppBundle技术
imageBundle会把所有资源都生成出来,但是用户下载的时候仅会取到他需要的部分.
如上图: Base.apk + feature2-xhdpi.apk + feature2-armabi.apk + feature2-en.apk 来组合形成的一个APK提供给这种手机配置的用户下载. 如果用户需要feature1和feature3的时候再下发给用户.
集成
升级AndroidStudio & Gradle
AS必须在3.2以上,同时因为使用Gradle构造Bundle文件,必须保证Gradle升级到可以支持Bundle的版本,测试Gradle-5.1.1-all版本没有问题.
动态配置资源APK
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.releaseConfig
}
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.releaseConfig
}
}
bundle {
density {
// Different APKs are generated for devices with different screen densities; true by default.
enableSplit false
}
abi {
// Different APKs are generated for devices with different CPU architectures; true by default.
enableSplit true
}
language {
// This is disabled so that the App Bundle does NOT split the APK for each language.
// We're gonna use the same APK for all languages.
enableSplit false
}
}
新增bundle配置方式,density/abi/language顾名思义,对应dpi/cpu平台/语言包. 默认为true.
构建App Bundle
使用命令行构建: ./gradlew bundleDebug
,生成debug版的bundle文件.
当然也可以使用IDE. 路径:
-
Build
-
Generata Signed APK
-
选择对应密钥,填入密匙
-
生成
最终生成一个aab文件
BuildTool测试
手动安装: https://github.com/google/bundletool,下载下载是一个jar文件,然后使用这个jar文件打包
java -jar bundletool-all-0.9.0.jar build-apks
--bundle=/Users/zhourui08/app/other/baidu/simeji-android/simeji2048/app/debug/app.aab
--output=/Users/zhourui08/app/other/baidu/simeji-android/simeji2048/app/debug/app.apks
--ks=/Users/zhourui08/app/other/baidu/simeji-android/simeji2048/app/adamrocker.keystore
--ks-pass=pass:xxxxxx
--ks-key-alias=xxxxxx
--key-pass=pass:xxxxxx
[推荐]使用brew
brew install bundletool
然后就可以愉快的使用bundletool命令了
bundletool build-apks
--bundle=/Users/zhourui08/app/other/baidu/simeji-android/simeji2048/app/debug/app.aab
--output=/Users/zhourui08/app/other/baidu/simeji-android/simeji2048/app/debug/app.apks
--ks=/Users/zhourui08/app/other/baidu/simeji-android/simeji2048/app/adamrocker.keystore
--ks-pass=pass:xxxxxx
--ks-key-alias=xxxxxx
--key-pass=pass:xxxxxx
打包完成后生成的是一个apks文件. 我们把这个文件后缀改为zip,解压缩出来看到
上传AppBundle
上传签名
动态资源下发
例如一个游戏apk设置免费只能玩到第三关,从第4关开始需要收费. 那么对于初始APK资源就没必要把第4关之后的资源放到基础模块里面,等用户付费了再去下载对应的模块即可.
而这里面的下载应用逻辑GP已经帮我们做好了,仅需要简单的代码即可:
例如我申明了一个feature1的module,那么我需要在gradle文件中申明
android{
bundle {
density {
enableSplit true
}
abi {
enableSplit true
}
language {
enableSplit false
}
}
// Dynamic feature modules
dynamicFeatures = [":feature1"]
}
同时在主模块代码中如下调用即可:
public void loadFeatureOne() {
SplitInstallRequest request =
SplitInstallRequest
.newBuilder()
.addModule("feature1")
.build();
SplitInstallManagerFactory.create(getApplicationContext())
.startInstall(request)
.addOnSuccessListener(new OnSuccessListener<Integer>() {
@Override
public void onSuccess(Integer integer) {
Intent intent = new Intent().setClassName(getPackageName(), "com.bapspatil.feature1.FeatureOneActivity");
startActivity(intent);
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
Toast.makeText(getApplicationContext(), "Couldn't download feature1: " + e.getMessage(), Toast.LENGTH_LONG).show();
}
});
}
网友评论