Bundletool build-bundle 错误:协议消息结束组标记与预期标记不匹配

Posted

技术标签:

【中文标题】Bundletool build-bundle 错误:协议消息结束组标记与预期标记不匹配【英文标题】:Bundletool build-bundle error: Protocol message end-group tag did not match expected tag 【发布时间】:2021-09-25 06:50:33 【问题描述】:

我正在尝试将 apk 转换为 aab,使用 apktool 反编译,并使用 aapt2 和 bundletool 构建(全部在命令行中,无需 gradle)。

反编译后,aapt2 编译和链接看起来不错,但是当我用 bundletool 执行 build-bundle 时,我得到了这个错误。什么地方出了错?我该如何解决?

F:\>java -jar "F:\tool\common\bundletool.jar" build-bundle --modules="F:\_workspace\20210714\decompile\base.zip" --output="F:\_workspace\20210714\decompile\base.aab"
[BT:1.7.0] 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:357)
        at com.android.tools.build.bundletool.model.BundleModule$Builder.addEntries(BundleModule.java:339)
        at com.android.tools.build.bundletool.validation.BundleModulesValidator.toBundleModule(BundleModulesValidator.java:94)
        at com.android.tools.build.bundletool.validation.BundleModulesValidator.lambda$validate$0(BundleModulesValidator.java:79)
        at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
        at java.util.Collections$2.tryAdvance(Collections.java:4719)
        at java.util.Collections$2.forEachRemaining(Collections.java:4727)
        at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
        at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
        at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
        at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:566)
        at com.android.tools.build.bundletool.validation.BundleModulesValidator.validate(BundleModulesValidator.java:80)
        at com.android.tools.build.bundletool.commands.BuildBundleCommand.execute(BuildBundleCommand.java:231)
        at com.android.tools.build.bundletool.BundleToolMain.main(BundleToolMain.java:73)
        at com.android.tools.build.bundletool.BundleToolMain.main(BundleToolMain.java:49)
Caused by: com.google.protobuf.InvalidProtocolBufferException: Protocol message end-group tag did not match expected tag.
        at com.google.protobuf.InvalidProtocolBufferException.invalidEndTag(InvalidProtocolBufferException.java:106)
        at com.google.protobuf.CodedInputStream$StreamDecoder.checkLastTagWas(CodedInputStream.java:2076)
        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:347)
        at com.android.aapt.Resources$XmlNode.parseFrom(Resources.java:44493)
        at com.android.tools.build.bundletool.model.BundleModule$SpecialModuleEntry$1.addToModule(BundleModule.java:386)
        at com.android.tools.build.bundletool.model.BundleModule$Builder.addEntry(BundleModule.java:355)
        ... 15 more

似乎在谈论 protobuf 格式(不确定我是否正确),但我确实在命令中添加了“--proto-format”。

我所做的详细信息:

使用 aapt2 编译资源:

"F:\tool\common\aapt2.exe" compile --dir "F:\_workspace\20210714\decompile\res" -v -o "F:\_workspace\20210714\decompile\compiled_resources.zip"

然后链接:

"F:\tool\common\aapt2.exe" link --proto-format "F:\_workspace\20210714\decompile\compiled_resources.zip" -v -o "F:\_workspace\20210714\decompile\base.apk" -I "F:\tool\common\android.jar" --manifest "F:\_workspace\20210714\decompile\AndroidManifest.xml"

解压缩base.apk,将其他文件移动到位(我是根据bundletool的文档做的),然后再次压缩,命名为base.zip。

然后做build-bundle,前面已经提到过,报错:

"F:\tool\common\bundletool.jar" build-bundle --modules="F:\_workspace\20210714\decompile\base.zip" --output="F:\_workspace\20210714\decompile\base.aab"

代码和资源是从一个运行良好的apk反编译出来的,依赖应该是好的,重新编译成apk就可以成功了。顺便说一下,我是用smali.jar把smali文件转成dex供bundletool使用的。

我使用的工具版本:

aapt2.exe7.0.0-beta05-7396180

bundletool.jar1.7.0

apktool.jar 2.5.0

smali.jar 2.4.0

【问题讨论】:

【参考方案1】:

所以前几天我自己解决了这个问题。这是因为我放置了错误的清单文件。 “base.zip/manifest/AndroidManifest.xml”中的文件应该是proto-format,是aapt2在link过程中生成的,你可以在aapt2生成的apk里面找到。

是的,反编译 apk 并使用 bundletool 将其转换为 aab 是可能的。

【讨论】:

我正在执行相同的步骤并尝试使用 bundletool 将其变成 aab。我收到[BT:1.8.2] Error: Version code not found in manifest. com.android.tools.build.bundletool.model.exceptions.InvalidVersionCodeException: Version code not found in manifest.。 apktool 出于某种原因正在从原始 apk 的清单文件中删除 versionCode。你遇到过类似的问题吗?如果是这样,您是如何解决的? 在你的manifest中添加minSdkVersion、targetSdkVersion、versionCode、versionName,就像这样:<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.xx.xx" android:minSdkVersion="xx" android:targetSdkVersion="xx" android:versionCode="xx" android:versionName="xx">你可以在apktool生成的apktool.yml中找到它们。 我正在自动化我的流程。我无法手动添加它们。不过我想出了一个办法。如果您将-m 标志传递给apktool,它将记录剥离版本代码/名称。谢谢

以上是关于Bundletool build-bundle 错误:协议消息结束组标记与预期标记不匹配的主要内容,如果未能解决你的问题,请参考以下文章

java.nio.file.InvalidPathException: Trailing char < > at index 10: res/raw/?

APK?不AAB:Android App Bundle

手动安装Android abb 包方法与心得

aab文件和apk之间的转化

如何打开bnd格式文件

在为arm64 Android手机构建应用程序包时,在ApplicationInfo.nativeLibraryDir中找不到本机库