Game Development 15 min read

Handling Android App Bundle (AAB) Modifications for Game Publishing: Icon, App Name, and Resource Updates

The guide explains how game publishers can modify Android App Bundles—using bundletool to decompile, update icons (including adaptive ones), change app names across languages, and adjust base or PAD resources—then re‑package the AAB for Google Play compliance.

37 Interactive Technology Team
37 Interactive Technology Team
37 Interactive Technology Team
Handling Android App Bundle (AAB) Modifications for Game Publishing: Icon, App Name, and Resource Updates

In game publishing, the typical workflow for Android packages is decompile → business modification → recompile, often called "cutting" or "splitting" a package. This article records the thinking and steps for updating icons, application names, and in‑game resources when such business needs arise.

Since August 2021, Google Play requires new apps to be uploaded as Android App Bundles (AAB) rather than APKs. Therefore, the team must be able to modify AAB files, while APKs become less common.

AAB building and modification are performed with bundletool , the underlying tool used by Android Studio and Google Play. Official documentation can be found at the Android developer site.

AAB Structure

A normal AAB contains a base module, Play Asset Delivery (PAD) packs, and signature information. PAD is used to keep the total package size under 200 MB, similar to the old OBB format.

- install_time_pad (install‑time Asset Pack resources)
- fast_follow_pad (fast‑follow Asset Pack resources)
- base (base module)
- META-INF (signature information)
- BUNDLE-METADATA (original files)
BundleConfig.pb (configuration file)

After extraction, the AAB looks like a compressed archive with protobuf‑encoded configuration files that must be converted before editing. The mapping files for conversion are available in the bundletool GitHub repository.

–BundleConfig.pb : AAB configuration generated during packaging
–base : base directory
——assets : corresponds to APK's assets directory
——dex : dex files from the original APK
——lib : native libraries from the original APK
——manifest : AndroidManifest.xml in protobuf format
——res : resources
——root : other root‑level resources
——resources.pb : protobuf config for resources
——assets.pb : protobuf config for assets
——native.pb : protobuf config for native libs

AAB Decompilation

Unlike APKs, AABs lack a mature decompilation ecosystem. The only practical way to modify an AAB is to use bundletool to convert between AAB and APK, then apply the existing APK‑modification scripts and finally re‑package the AAB.

Generating an AAB

Bundletool can build an AAB from module ZIP files:

bundletool build-bundle --modules=base.zip --output=mybundle.aab

Icon Update (Section 02)

Android icons can be ordinary PNG images or adaptive icons (introduced in Android 8.0). Adaptive icons allow the system to display the icon in different shapes.

Requirements:

Ordinary image: PNG, at least 512×512.

Adaptive icon: a ZIP package generated by Android Studio containing the foreground and background layers.

Steps to update:

Detect whether the current app uses an adaptive icon (check if the icon path is in @mipmap/ and if mipmap‑anydpi‑v26 contains icon_name.xml and icon_name_round.xml ).

If updating to a plain image, replace the existing image file; if the app previously used an adaptive icon, also remove the roundIcon attribute from AndroidManifest.xml .

If updating to an adaptive icon, replace the existing adaptive resources and set both icon and roundIcon attributes accordingly.

App Name Update (Section 03)

When the app name is single‑language, replace the corresponding string resource. For multilingual apps, use a JSON‑based parameter format, e.g.:

{
    "DEFAULT": "MyGame",
    "TRADITIONAL_CHINESE": "MyGame_繁体",
    "JAPANESE": "MyGame_日语",
    "KOREAN": "MyGame_韩语",
    "RUSSIAN": "MyGame_俄语"
}

The update logic iterates over each language, replaces the existing name, or creates a new values‑xx resource folder if it does not exist. A helper class can be used to map languages to resource directories:

class Language(object):
    def __init__(self, language, res_dirs):
        self.language = language
        self.res_dirs = res_dirs

DEFAULT = Language("DEFAULT", "values")
SIMPLIFIED_CHINESE = Language("SIMPLIFIED_CHINESE", "values-zh-rCN")
TRADITIONAL_CHINESE = Language("TRADITIONAL_CHINESE", ["values-zh-rHK", "values-zh-rTW", "values-zh-rMO"])
ENGLISH = Language("ENGLISH", "values-en")
VIETNAMESE = Language("VIETNAMESE", "values-vi")
THAI = Language("THAI", "values-th")

Game Resource Modification (Section 04)

Resource updates are expressed in a JSON configuration that specifies the target (base or pad), the action (add, delete, replace), and the file paths. Example:

{
    "base":{
        "delete": ["/assets/base_test_del", "/assets/base_test_del.png"],
        "add": {"/res/drawable/add.png": "new_test_add.png"},
        "replace": {"/res/drawable/replace.png": "new_test_replace.png"}
    },
    "pad":{
        "delete": ["/assets/pad_test_del"],
        "add": {"/assets/add.png": "pad_new_test_add.png"},
        "replace": {"/assets/test_add.png": "pad_new_test_replace.png"}
    }
}

PAD resources are ultimately placed in the APK's assets directory, while base resources may require recompilation of the res folder.

Conclusion (Section 05)

The article records the thought process and practical steps for handling icon, app‑name, and resource updates in Android App Bundles used for game publishing. The focus is on the workflow rather than concrete code implementation.

AndroidApp BundleAABApp NameGame PublishingIcon UpdateResource Modification
37 Interactive Technology Team
Written by

37 Interactive Technology Team

37 Interactive Technology Center

0 followers
Reader feedback

How this landed with the community

login Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.