使用apktool、aapt2、bundletool将apk转为aab(Android App Bundle)

这篇具有很好参考价值的文章主要介绍了使用apktool、aapt2、bundletool将apk转为aab(Android App Bundle)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

开发中遇到的场景

  • 上一篇文章我们讲了AAPT2命令行使用总结,里面有个使用场景就是将apk转为aab文件,aab文件是应用上架Google play的指定包格式,下面我们就来实践下
  • 假如我们有这样一个场景需求,一个游戏或者应用接入了我们开发的聚合SDK,然后提供给我们一个apk包,我们拿到这个apk包可以使用打包工具来融合具体的渠道SDK或者插件,现在要出的这个包是上架海外的,那么就只有出aab包了。
  • 我们通过打包工具先把融合的apk包打出来,然后对这个apk做进一步的处理

实践过程用到的工具

  • apktool,反编译回编译apk的工具,下载地址:Apktool - A tool for reverse engineering 3rd party, closed, binary Android apps.
  • bundletool,一种命令行工具,用于自行构建 app bundle 和 SDK Bundle,下载地址:Releases · google/bundletool · GitHub
  • aapt2,是一种构建工具,解析资源、为资源编制索引,并将资源编译为针对 Android 平台进行过优化的二进制格式,在安装的SDK目录 android_sdk/build-tools/version/下找到aapt2,也可以最新的版本,比如下载3.2.0-alpha18-4804415版本,其他版本替换地址里面的版本就可以了:https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/8.0.0-alpha07-9193536/aapt2-8.0.0-alpha07-9193536-windows.jar
  • android.jar,android提供的SDK开发包,在android_sdk/platforms/version/下可以找到
  • jarsigner,签名工具,安装的JDK bin目录下,配置了jdk的环境变量可以直接运行命令行
  • 请安装好JDK并配置环境变量方便cmd窗口执行命令

使用命令行方式实现

  • 首先选择一个目录,将下载的apktool、aapt2、bundletool、android.jar等工具拷贝到这个目录,方便我们执行命令,并准备一个打包好的apk也放到改目录,比如我新建的目录D:\workspace\LCQ\apk-aab:使用apktool、aapt2、bundletool将apk转为aab(Android App Bundle)
  • 接下来我们在文件地址栏里面输入cmd,按回车键,进入cmd命令界面
  • 使用apktool命令将app-release.apk这个包进行反编译,执行命令
    java -jar apktool_2.6.1.jar d app-release.apk -s -o decode_apk

    使用apktool、aapt2、bundletool将apk转为aab(Android App Bundle)

    使用apktool、aapt2、bundletool将apk转为aab(Android App Bundle)

    我们重点关注反编译后的res文件夹,res里面的资源文件需要我们使用aapt2进行编译,生成符合Google的协议缓冲区格式要求的文件

  •  我们使用aapt2的compile命令来编译res文件夹

    aapt2 compile --dir decode_apk\res -o compiled_resources.zip

    使用apktool、aapt2、bundletool将apk转为aab(Android App Bundle)

    使用apktool、aapt2、bundletool将apk转为aab(Android App Bundle)

    可以看到生成的zip压缩包里面都是.flat或arsc.flat后缀的二进制文件

  • 我们再使用aapt2的链接命令生成一个base.apk

    aapt2 link --proto-format -o base.apk -I android.jar --manifest decode_apk\AndroidManifest.xml -R compiled_resources.zip --auto-add-overlay

    使用apktool、aapt2、bundletool将apk转为aab(Android App Bundle)

    我们将这个base.apk文件进行解压,新建一个manifest文件夹,将AndroidManifest.xml文件移动到里面去,然后将apktool反编译生成的目录(decode_apk)里面的assets、lib拷贝到base,将.dex后缀的所有文件拷贝到module/dex,将unknown、kotlin拷贝到module/root,最终的目录就长这样了使用apktool、aapt2、bundletool将apk转为aab(Android App Bundle)

  • 然后我们选中module下的所有文件和目录,压缩成.zip文件,如图使用apktool、aapt2、bundletool将apk转为aab(Android App Bundle)

    请确保压缩后的zip文件打开后没有把base目录压缩进去,我们把压缩好的base.zip拷贝到bundletool同目录下, 

  • 在我们进行拷贝的时候一定要注意,不要将反编译生成的目录和aapt2链接生成解压的base目录资源搞错了,否则bundletool 命令会报失败的,比如InvalidProtocolBufferException异常

    [BT:1.12.1] Error: com.google.protobuf.InvalidProtocolBufferException: Protocol message end-group tag did not match expected tag.
    java.io.UncheckedIOException: com.google.protobuf.InvalidProtocolBufferException: Protocol message end-group tag did not match expected tag.
            at com.android.tools.build.bundletool.model.BundleModule$Builder.addEntry(BundleModule.java:418)
            at com.android.tools.build.bundletool.model.BundleModule$Builder.addEntries(BundleModule.java:399)
            at com.android.tools.build.bundletool.model.utils.BundleModuleParser.parseBundleModuleInternal(BundleModuleParser.java:66)
            at com.android.tools.build.bundletool.model.utils.BundleModuleParser.parseAppBundleModule(BundleModuleParser.java:41)
            at com.android.tools.build.bundletool.validation.BundleModulesValidator.lambda$validate$0(BundleModulesValidator.java:75)
            at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
            at java.base/java.util.Collections$2.tryAdvance(Collections.java:4747)
            at java.base/java.util.Collections$2.forEachRemaining(Collections.java:4755)
            at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
            at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
            at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913)
            at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
            at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
            at com.android.tools.build.bundletool.validation.BundleModulesValidator.validate(BundleModulesValidator.java:76)
            at com.android.tools.build.bundletool.commands.BuildBundleCommand.execute(BuildBundleCommand.java:231)
            at com.android.tools.build.bundletool.BundleToolMain.main(BundleToolMain.java:78)
            at com.android.tools.build.bundletool.BundleToolMain.main(BundleToolMain.java:54)
    Caused by: com.google.protobuf.InvalidProtocolBufferException: Protocol message end-group tag did not match expected tag.
            at com.google.protobuf.InvalidProtocolBufferException.invalidEndTag(InvalidProtocolBufferException.java:129)
            at com.google.protobuf.CodedInputStream$StreamDecoder.checkLastTagWas(CodedInputStream.java:2124)
            at com.google.protobuf.AbstractParser.parsePartialFrom(AbstractParser.java:217)
            at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:232)
            at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:237)
            at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:48)
            at com.google.protobuf.GeneratedMessageV3.parseWithIOException(GeneratedMessageV3.java:339)
            at com.android.aapt.Resources$XmlNode.parseFrom(Resources.java:44493)
            at com.android.tools.build.bundletool.model.BundleModule$SpecialModuleEntry$1.addToModule(BundleModule.java:459)
            at com.android.tools.build.bundletool.model.BundleModule$Builder.addEntry(BundleModule.java:416)
            ... 16 more
    
  • 接下来我们就使用bundletool命令来生成aab文件了,执行命令

    java -jar bundletool-all-1.12.1.jar build-bundle --modules=base.zip --output=module.aab

    使用apktool、aapt2、bundletool将apk转为aab(Android App Bundle)

    可以看到aab文件以及生成了,现在这个是无法使用bundletool工具直接进行安装测试的,因为还没有进行签名,aab的签名只能用jarsigner,不能使用apksigner 

  • 使用jarsigner命令对base.aab进行签名

    jarsigner -digestalg SHA1 -sigalg SHA1withRSA -keystore 你的签名文件.jks -storepass 秘钥文件密码 -keypass 秘钥密码 base.aab 别名
    
  • 可以看到签名成功了,生成了META-INF目录,里面有签名信息文件使用apktool、aapt2、bundletool将apk转为aab(Android App Bundle)

     这个签名后的base.aab文件就可以用来测试上传google play 了

  • 如果要测试aab文件的话,也需要使用bundletool的命令行,我们先让adb连接上设备,生成设备信息json文件

    java -jar bundletool-all-1.12.1.jar get-device-spec --output=./device-spec.json
  • 然后生成apks

    java -jar bundletool-all-1.12.1.jar build-apks --bundle=base.aab --output=abase.apks --overwrite --ks=你的签名文件.jks --ks-pass=pass:"111111" --ks-key-alias=别名--key-pass=pass:"111111"
    
  • 然后将apks安装到对应的设备

    ava -jar bundletool-all-1.12.1.jar install-apks --apks=base.apks

提示:由于这个是我们使用apk自行进行生成aab的,中间处理过程可能会存在文件遗漏,特殊情况未处理等,肯定是没有AS生成的aab更可靠,还是建议使用AS生成的aab进行上架自己的应用文章来源地址https://www.toymoban.com/news/detail-427077.html

到了这里,关于使用apktool、aapt2、bundletool将apk转为aab(Android App Bundle)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 修复Unity编译时“AAPT2 aapt2-4.1.2-6503028-osx Daemon #0 Failed to shutdown within timeout”错误

    要解决这个报错首先我们要了解AAPT是什么东西。 aapt 全称为 Android Asset Packaging Tool,即为Android资源打包工具。作为unity开发人员,一般跟Android打交道比较少,感兴趣的同学可以先去官网学习学习。 ##aapt2版本 首先4.1.2-6503028是使用appt2 sdk版本。 我们可以在maven仓库查到具体版

    2024年02月16日
    浏览(37)
  • 谷歌aab包在Android 14闪退而apk没问题(targetsdk 34)

    Unity应用(target SDK 34)上线到GooglePlay,有用户反馈fold5设备上(Android14系统)疯狂闪退,经测试,在小米手机Android14系统的版本复现成功了,奇怪的是apk直接安装没问题,而打包成aab就是疯狂闪退。 Unity版本Unity2020.3.18f1c1。 老办法,logcat抓包,看看闪退日志。 日志有一行引起了

    2024年02月21日
    浏览(41)
  • Java GUI开发的几个小工具:apk/aab签名,验证签名,aab转apk

    平时经常给apk/aab签名,验证签名,aab转apk等操作,每次输入命令行十分繁琐。于是利用JAVA GUI简单开发了几个jar包界面化工具,提供给大家一起使用。 工具 功能 JarSignerTool.jar 为apk/aab签名 ApkSignerTool.jar 为apk签名 AppSignVerifyTool.jar 验证apk/aab的签名 CheckSignFileTool.jar 查看签名文件

    2024年02月11日
    浏览(43)
  • 【Android 逆向】ApkTool 工具使用 ( ApkTool 简介 | ApkTool 解包和打包 )

    之前写的 ApkTool 相关博客 : 【Android 安全】DEX 加密 ( 常用 Android 反编译工具 | apktool | dex2jar | enjarify | jd-gui | jadx ) 【Android 逆向】Android 逆向工具 ( Apktool | IDA | Python ) 【Android 逆向】APK 文件处理脚本 ApkTool.py ( 脚本简介 | 用法 | 分析 APK 文件 ) 参考 【Android 安全】DEX 加密 ( 常用

    2023年04月08日
    浏览(83)
  • [安卓逆向]apktool实现APK反编译、重打包、签名

    apktool 主要用于逆向apk文件。它可以将资源解码,并在修改后可以重新构建它们。 APKtool官网: https://ibotpeaches.github.io/Apktool/ APKtool下载: https://bitbucket.org/iBotPeaches/apktool/downloads/ APKtool源码: https://github.com/iBotPeaches/Apktool 将 apktool_2.6.1.jar 放到一个文件夹下(如:D:apktool),然

    2024年02月03日
    浏览(50)
  • Android逆向之旅—反编译利器Apktool使用教程(Apktool的安装使用)建议新手浏览

    首先下载apktool.bat和apktool.jar 官网地址:https://ibotpeaches.github.io/Apktool/install/ 这个译文: 1.下载Windows包装脚本(右键单击,将链接另存为apktool.bat) 2.下载apktool-2(在此处查找最新版本) 3.将下载的jar重命名为apktool.jar 4.将两个文件(apktool.jar和apktool.bat)移动到Windows目录(通常

    2024年02月02日
    浏览(45)
  • Android apktool反编译工具

    使用下面的命令反编译apk: java -jar apktool_2.7.0.jar d test.apk -o testDir 如果不涉及资源文件的修改,所以加上 -r 参数不会反编译资源文件 java -jar apktool_2.7.0.jar -r d test.apk -o testDir 修改完成后使用下面的命令回编译: java -jar apktool_2.7.0.jar b  testDir

    2024年02月13日
    浏览(39)
  • Android 打包AAB+PAD(Unity篇),Android开发基础面试题

    这些部分适用于**「fast-follow」 和 「on-demand」**资产包。 检查状态 每个资产包都存储在应用程序内部存储的单独文件夹中。使用该 「isDownloaded()」 方法确定是否已下载资产包。 监控下载 查询PlayAssetBundleRequest 监控请求状态的 对象: // Download progress of request, between 0.0f 

    2024年04月14日
    浏览(46)
  • Android AAPT: error: resource color 异常原因处理

    异常体现: 该异常是删除了项目创建时系统引用的颜色资源,导致的编译失败异常; 异常解决: 根据提示在color.xml里加入报错的颜色资源 上面只是举例,报错的颜色和本文不对应的话,以你报错的日志中的颜色决定加入的颜色名

    2024年02月09日
    浏览(46)
  • 【Android】使用Android Studio打包APK文件

    打包APK之前,首先需要新建项目,有基础的可以跳过。 无基础的可以参考:使用Android Studio运行Hello World项目 1.找到Build - Generate Signed Bundle or APK - 勾选APK 2.首次需要创建证书,后续可以使用已创建好的证书 3.填写证书信息 选择密钥库存放路径,并填写密码 填写密钥名称、密

    2024年02月19日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包