Bundletool build-bundle error: Protocol message end-group tag did not match expected tag

Bundletool build-bundle error: Protocol message end-group tag did not match expected tag

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

反编译后,aapt2 编译,link 看起来不错,但是当我使用 bundletool 执行 build-bundle 时,出现了这个错误。什么地方出了错?我该如何修复它?

F:\>java -jar "F:\tool\common\bundletool.jar" build-bundle --modules="F:\_workspace210714\decompile\base.zip" --output="F:\_workspace210714\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[=10=](BundleModulesValidator.java:79)
        at java.util.stream.ReferencePipeline.accept(ReferencePipeline.java:193)
        at java.util.Collections.tryAdvance(Collections.java:4719)
        at java.util.Collections.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.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:\_workspace210714\decompile\res" -v -o "F:\_workspace210714\decompile\compiled_resources.zip"

然后 link:

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

解压缩 base.apk,将其他文件移动到位(我根据 bundletool 的文档完成),然后再次压缩,名称 base.zip.

然后做build-bundle,一开始有提到,报错:

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

代码和资源是从一个apk反编译出来的,效果不错,依赖关系应该不错,重新编译成apk可以成功。顺便说一句,我使用smali.jar将smali文件转换为dex用于bundletool。

我使用的工具版本:

aapt2.exe 7.0.0-beta05-7396180

bundletool.jar 1.7.0

apktool.jar 2.5.0

smali.jar 2.4.0

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

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