Android App Bundle 自动打包原理

2023-05-16

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命令:

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可以从github上下载,或者加U8SDK技术交流裙(扣:1055996444)索要。

对所有smali目录执行如下命令,就可以将dex生成到base目录下了
 

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,这个文件你可以Google官网或者github上下载,或者加U8SDK海外交流群(扣)索要。

上面的base目录结构已经准备好了,我们将这个目录压缩成base.zip,接下来我们就可以使用bundletool.jar生成aab文件了

java -jar bundletool.jar build-bundle --modules= ./base.zip --output=./output.aab

跟着流程到这里,我们的output.aab就是一个纯正的aab文件啦~

5、签名bundle

如果你需要将bundle发布到Google Play平台,还需要对你的aab文件进行签名, 只能使用jarsigner进行签名哦,不可以使用apksigner。

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。

java -jar bundletool.jar build-apks --bundle=./output.aab --output=./output.apks

这样就生成了apks文件,apks文件你可以解压看下,里面是一群根据特性拆分后的apk文件。

2、部署到设备

然后,我们可以将apks部署到设备上,进行安装测试。 我们可以将设备通过USB连上电脑,然后依然使用bundletool命令:

java -jar bundletool.jar install-apks --apks=./output.apks

这样就完成了bundle的打包以及本地测试了。 如果你对这块感兴趣或者还有疑问,可以加入U8SDK的海外交流裙(扣:1055996444)哦。


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android App Bundle 自动打包原理 的相关文章

随机推荐