Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I get the versionCode and versionName (badging) of an Android AAB file?

Similar to Get Android .apk file VersionName or VersionCode WITHOUT installing apk, I want to get the versionCode and/or versionName with just an .aab file.

I've tried simply using the classic answer for .apk files, but substituting my .aab file instead, and it didn't work:

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

I also tried attempting to dump the xmltree directly:

$ $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
like image 461
Heath Borders Avatar asked Feb 10 '20 17:02

Heath Borders


People also ask

What is versionCode and versionName in Android?

versionCode — A positive integer used as an internal version number. This number is used only to determine whether one version is more recent than another, with higher numbers indicating more recent versions. This is not the version number shown to users; that number is set by the versionName setting, below.


2 Answers

Bundletool has a command to dump the manifest of the AAB in XML, and even extract specific attributes of the manifest using xpath.

bundletool dump manifest --bundle bundle.aab

And to extract just the versionCode:

bundletool dump manifest --bundle bundle.aab --xpath /manifest/@android:versionCode

Hope that helps.

like image 122
Pierre Avatar answered Nov 15 '22 17:11

Pierre


.aab files store their xml in a protocol buffer format:

There is manifest folder having Android Manifest.xml file in the apk it is in binary format but in .aab it is real XML file compiled into a protocol buffer format because this allows to transform it easily.

And aapt2 has a convert subcommand that Converts an apk between binary and proto formats., and it will convert a .apk file that contains only an AndroidManifest.xml in proto format. Thus:

# 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

Unfortunately, the final command doesn't succeed:

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

But it does print the versionName and versionCode as expected. You can ignore the failure with || true, or you can use the dump xmltree subcommand to dump the raw XML, which succeeds:

aapt dump xmltree version.apk AndroidManifest.xml
like image 34
Heath Borders Avatar answered Nov 15 '22 18:11

Heath Borders