部署前修改 Android App Bundle (aab) 内容

Modify Android App Bundle (aab) Contents before deploying

我们有一个构建和发布管道 (Azure Devops),可以将我们的 APK Android 应用程序部署到各种 appcenter.ms 环境。在发布过程中,我们解压apk,修改环境特定配置的内容,然后重新打包apk。

现在我们正尝试使用 Android App Bundle (AAB) 执行此操作,我们不能再使用 apktool。我们如何使用 AAB 实现与 APK 相同的功能?

这是我们工作 apk 版脚本的片段

## NOTE STUFF IS TRUNCATED!!! THIS IS NOT A COMPLETE SCRIPT!!! DO NOT COPY

brew list apktool &>/dev/null || HOMEBREW_NO_AUTO_UPDATE=1 brew install apktool
brew list xmlstarlet &>/dev/null || HOMEBREW_NO_AUTO_UPDATE=1 brew install xmlstarlet

# ... truncated ...

echo "Decompiling $zipPath"
apktool d $zipPath -o "apk"

cd apk

# ... truncated / modify androidmanifest.xml ...

unalignedPath="$apkPath.unaligned"
unsignedPath="$apkPath.unsigned"

cd ..

echo "Repackage apk to $unsignedPath"
apktool b apk -o $unsignedPath

echo "Sign"
jarsigner -keystore $keystorePath -storepass $keystorePass -keypass $keystorePass -verbose -sigalg MD5withRSA -digestalg SHA1 -signedjar $unalignedPath $unsignedPath $keyAlias
jarsigner -verify -verbose -certs $unalignedPath

echo "Zipalign"
$ANDROID_HOME/build-tools/27.0.3/zipalign -f -v 4 $unalignedPath $apkPath

当我们简单地将文件扩展名从 apk 更改为 aab 和 运行 相同的 apktool 时,我们的文件夹结构有点混乱。

此外,资源和清单已经转换为 protobuf,我认为我无法对它们进行逆向工程。

要编辑 AAB 的清单,您需要从 AAB 中提取文件 base/manifest/AndroidManifest.xml,例如

unzip -p app.aab base/manifest/AndroidManifest.xml > AndroidManifest.pb

在这个阶段,尽管有扩展名,但清单是协议缓冲区格式(这就是为什么我在上面给它扩展名 .pb)。因此,您需要找到一个协议缓冲区 parser/editor 来进行所需的更改。

要解析原型,您需要协议缓冲区的定义,您可以在这个 JAR 中找到它:https://maven.google.com/com/android/tools/build/aapt2-proto/3.6.3-6040484/aapt2-proto-3.6.3-6040484.jar 请参阅 [=14 中的消息 XmlNode =]

对已解析的原型进行更改后,重新序列化原型并在 AAB 中使用相同名称将其重新注入同一位置(它只是一个 zip 文件)。

最后,您不需要压缩对齐 AAB,因此删除此步骤。

也许将来会有一个工具可以让你自动转换,类似于 apktool 所做的。同时,您可以通过这种方式手动完成。希望对您有所帮助。

Lionscribe 编辑

简单的分步说明。

  1. 按照上述说明从 AAB 文件中提取 AndroidManifest.xml 文件。对于此用途,将名称保留为“AndroidManifest.xml”。
  2. https://developers.google.com/protocol-buffers/docs/downloads 下载 protoc 二进制文件并将二进制文件解压缩到路径或工作文件夹。
  3. 下载上面提到的 jar file,用任何 zip 程序打开 jar,然后复制文件“Resources.proto”和“Configuration.proto" 从 jar 根文件夹到您的工作文件夹。
  4. 运行命令protoc --decode=aapt.pb.XmlNode Resources.proto < AndroidManifest.xml > output.txt解码文件。
  5. 根据您的需要编辑“output.txt”。
  6. 运行 protoc --encode=aapt.pb.XmlNode Resources.proto < output.txt > AndroidManifest_new.xml 对新版本进行编码。

我最近想出了一个修改应用程序包内容的方法。我用APK和AAB都修改了AAB的内容

第 1 步: 使用 apktool 从 apk 中提取 AndroidManifest.xml 文件。

Step2: 修改这个提取的清单文件。您也可以在此步骤中修改图标、字符串资源等其他资源。

Step3:现在我们需要将这些修改后的资源转化为protobuf格式。请按照以下 link 进行相同操作。

https://developer.android.com/studio/build/building-cmdline#bundletool-build https://musteresel.github.io/posts/2019/07/build-android-app-bundle-on-command-line.html

Step4:解压app bundle的内容,并用这些修改后的资源替换现有资源(如清单等)。

Step5: 最后的技巧是在压缩提取的应用程序包文件夹的内容时使用 --no-dir-entries 标志其中包含修改后的资源。转到提取的应用程序包文件夹并执行以下命令。

"zip -r --no-dir-entries ../modified_aab.zip *""

第 6 步: 最后,只需使用简单命令将 .zip 重命名为 .aab:mv modified_aab.zip modified_aab.aab