U8SDK——是时候支持App Bundle了
Google推出Android App Bundle 已经有一段时间了。 根据Google的政策说明 ,预计2021年8月之后,新发布的应用都必须使用Android App Bundle(aab)来上架Google Play Store了。
对于Android App Bundle的原理,Google官方文档已经有了很详细的介绍, 想了解的同学建议直接阅读Google的官方文档。
如果你是使用Android Studio打包,那么你直接在Android Studio中选择构建App Bundle即可将应用打包成aab了。
这篇文章,我们主要介绍如何在U8SDK聚合打包工具中生成aab格式的文件(新版本的U8SDK打包工具已经支持了aab出包)。
一、文件格式介绍
aab——Android App Bundle格式文件,一个有固定目录格式的压缩文件。
我们以一个demo.aab为例,将其解压,我们看下其中的目录结构:
–BundleConfig.pb : 打包bundle的时候,自动生成
–base : base目录
——assets: 对应apk的assets目录
——dex: 原apk中classes.dex,classes2.dex…都放这里
——lib: 原apk中lib目录都放这里
——manifest: 原apk的AndroidManifest.xml放这里,需要是编译后的AndroidManifest.xml
——res:apk中的资源放这里,需要是编译后的资源
——root: apk中相对于根目录的其他资源文件
——resources.pb:编译资源的时候会生成的
——assets.pb:编译bundle的时候会生成的
——native.pb: 编译bundle的时候会生成的
二、如何打包生成aab
了解过U8SDK打包原理的同学应该知道,在U8SDK打包工具中,我们将母包apk反编译,然后合并进去对应的渠道SDK的代码、资源、so文件等,然后再将合并后的内容回编译成最终的apk。
在U8SDK打包工程中直接打出aab的原理其实就一句话——要生成aab,我们只需要将合并后的目录(decompile目录), 转换为上面aab打包需要的资源目录格式即可。
所以整个适配过程如下(想白嫖的同学注意了:鼓励自己动手,这里不贴python脚本,只说原理过程~😄):
1、编译资源
首先,我们需要将decompile目录下的res进行编译。 编译资源我们需要使用aapt2,并且需要将资源编译生成protobuf格式的版本。
使用aapt2编译资源,我们需要先执行compile命令,再执行link命令:
1 2 3 |
aapt2 compile --dir ./res -o ./compiled_resources aapt2 link --proto-format -o baseapk -I ../android.jar --manifest .\AndroidManifest.xml -R .\compiled_resources\*.flat --auto-add-overlay |
执行上面的命令之后, 我们就在decompile目录下,生成了base.apk。 我们需要将这个apk解压。
解压后里面的目录格式如下:
–res
–AndroidManifest.xml
–resouces.pb
我们就以这个目录作为base目录, 后面拷贝的资源都拷贝到这个目录里面来。
按照上面的bundle目录结构,我们在这个目录下,新建一个manifest目录,然后我们将AndroidManifest.xml拷贝到manifest子目录下。
现在base的目录结构如下:
–res
–manifest
——AndroidManfiest.xml
–resources.pb
2、编译dex
我们打包过程中合并后的代码格式是smali格式, 经过u8sdk打包脚本的自动dex拆分后,在decompile目录下的代码目录结构是smali、smali_classes2、smali_classes3…
我们需要将这些smali目录编译生成对应的classes.dex、classes2.dex、classes3.dex…
我们使用smali.jar进行这步操作,smali.jar可以加U8SDK海外交流群索要(QQ群:1055996444)。
对所有smali目录执行如下命令,就可以将dex生成到base目录下了
1 |
java -jar smali.jar assemble -o ./base/dex/classes.dex ./smali |
生成之后,base目录结构如下:
–res
–manifest
——AndroidManfiest.xml
–dex
——classes.dex
——classes2.dex
–resources.pb
3、拷贝其他资源
这一步就更简单了, 我们需要将decompile目录下其他对应目录中的内容,直接拷贝到base目录下对应的子目录中即可。 对应的拷贝目录关系如下:
decompile/assets ==> base/assets
decompile/lib ==> base/lib
decompile/unknown ==> base/root
拷贝之后, 我们的base目录结构如下图:
–assets
–lib
–root
–res
–manifest
——AndroidManfiest.xml
–dex
——classes.dex
——classes2.dex
–resources.pb
4、编译bundle
打包生成aab文件,我们需要使用bundletool.jar,这个文件你可以加U8SDK海外交流群索要(QQ:1055996444)。
上面的base目录结构已经准备好了,我们将这个目录压缩成base.zip,接下来我们就可以使用bundletool.jar生成aab文件了
1 |
java -jar bundletool.jar build-bundle --modules= ./base.zip --output=./output.aab |
跟着流程到这里,我们的output.aab就是一个纯正的aab文件啦~
5、签名bundle
如果你需要将bundle发布到Google Play平台,还需要对你的aab文件进行签名, 只能使用jarsigner进行签名哦,不可以使用apksigner。
1 |
jarsigner -digestalg SHA1 -sigalg SHA1withRSA -keystore test.keystore -storepass 123456 -keypass 123456 ./output.aab test |
三、如何测试生成的aab
1、生成apks
打出了bundle之后, 如果我们本地想测试这个bundle的功能是否正常怎么办呢?我们依然使用bundletool.jar来完成。
我们用bundletool.jar将我们的bundle编译生成apks,注意不是apk,是apks。
1 |
java -jar bundletool.jar build-apks --bundle=./output.aab --output=./output.apks |
这样就生成了apks文件,apks文件你可以解压看下,里面是一群根据特性拆分后的apk文件。
2、部署到设备
然后,我们可以将apks部署到设备上,进行安装测试。 我们可以将设备通过USB连上电脑,然后依然使用bundletool命令:
1 |
java -jar bundletool.jar install-apks --apks=./output.apks |
这样就完成了bundle的打包以及本地测试了。 如果你对这块感兴趣或者还有疑问,可以加入U8SDK的海外SDK技术交流群。
本文出自 U8SDK技术博客,转载时请注明出处及相应链接。
本文永久链接: http://www.uustory.com/?p=2370