如何获取Android AAB文件的versionCode和versionName(徽章)?

17
获取Android .apk文件的VersionName或VersionCode而不安装apk类似,我想仅使用.aab文件获取versionCode和/或versionName

我尝试简单地使用针对.apk文件的经典答案,但将我的.aab文件替换后,它并没有起作用:

$ $ANDROID_HOME/sdk/build-tools/29.0.2/aapt dump badging my_aab.aab
ERROR: dump failed because no AndroidManifest.xml found

我也尝试直接转储xmltree:

$ $ANDROID_HOME/sdk/build-tools/29.0.2/aapt dump xmltree my_aab.aab base/manifest/AndroidManifest.xml
W/ResourceType(39872): Bad XML block: header size 664 or total size 118110474 is larger than data size 35953
ERROR: Resource base/manifest/AndroidManifest.xml is corrupt
2个回答

27

Bundletool有一个命令可以以XML格式转储AAB的清单,并使用xpath提取清单的特定属性。

bundletool dump manifest --bundle bundle.aab

并提取versionCode:

bundletool dump manifest --bundle bundle.aab --xpath /manifest/@android:versionCode
希望这能帮到你。

谢谢。这很有帮助,但我正在尝试找到一种只使用原生Android SDK来展示它的方法,并且“bundletool”不在原生Android SDK中。 - Heath Borders
bundletool 在 Android 文档中提到:https://developer.android.com/studio/command-line/bundletool - Aure77

4

.aab 文件将它们的 xml 存储在 协议缓冲区格式 中:

在 apk 中,存在一个包含 AndroidManifest.xml 文件的清单文件夹,它是以二进制格式存储的,但在 .aab 文件中,它是编译成协议缓冲区格式的真实 XML 文件,因为这样可以更方便地进行转换。

而且,aapt2 有一个 convert 子命令,可将 apk 在二进制格式和 proto 格式之间进行转换,并且它会将仅包含 proto 格式的 AndroidManifest.xml.apk 文件进行转换。因此:

# Extract the AndroidManifest.xml directly
# without -p, unzip will recreate the directory structure.
unzip -p my_aab.aab base/manifest/AndroidManifest.xml > AndroidManifest.xml
# Create a dummy .apk with the proto-formatted AndroidManifest.xml
zip proto_version.apk AndroidManifest.xml
# Convert the proto-formatted AndroidManifest.xml into an apk-formatted XML
aapt2 convert proto_version.apk -o version.apk
# Now dump the badging
# I don't know why, but dump badging fails, so add `|| true` to make it succeed
aapt dump badging version.apk || true

不幸的是,最终命令并没有成功执行:

W/ResourceType(42965): No known package when getting value for resource number 0x7f100000
AndroidManifest.xml:47: error: ERROR getting 'android:icon' attribute: attribute value reference does not exist

但是它确实正常打印了versionNameversionCode。你可以忽略|| true中的错误,或者使用dump xmltree子命令来转储原始XML,这样就成功了:

aapt dump xmltree version.apk AndroidManifest.xml

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接