iBotPeaches/Apktool · error · AndrolibException

Repeated overlayable: pkgId=0x%02x, name=%s

Error message

Repeated overlayable: pkgId=0x%02x, name=%s

What it means

AndrolibException thrown by ResPackage.addOverlayable(name, actor) when an overlayable with that name already exists in the package. Overlayable names must be unique per package; a second <overlayable> declaration with the same name in resources.arsc, or a repeated programmatic add, triggers this.

Source

Thrown at brut.apktool/apktool-lib/src/main/java/brut/androlib/res/table/ResPackage.java:314

    }

    public boolean hasOverlayable(String name) {
        return mOverlayables.containsKey(name);
    }

    public ResOverlayable getOverlayable(String name) throws UndefinedResObjectException {
        ResOverlayable overlayable = mOverlayables.get(name);
        if (overlayable == null) {
            throw new UndefinedResObjectException(
                String.format("overlayable: pkgId=0x%02x, name=%s", getId(), name));
        }
        return overlayable;
    }

    public ResOverlayable addOverlayable(String name, String actor) throws AndrolibException {
        ResOverlayable overlayable = mOverlayables.get(name);
        if (overlayable != null) {
            throw new AndrolibException(
                String.format("Repeated overlayable: pkgId=0x%02x, name=%s", getId(), name));
        }

        overlayable = new ResOverlayable(this, name, actor);
        mOverlayables.put(name, overlayable);
        return overlayable;
    }

    public int getOverlayableCount() {
        return mOverlayables.size();
    }

    public Collection<ResOverlayable> listOverlayables() {
        return mOverlayables.values();
    }

    public boolean isAlias(ResId resId) {
        return mAliases.containsKey(resId);

View on GitHub (pinned to 79b63384d7)

Solutions

  1. Check hasOverlayable(name) first and reuse the existing overlayable.
  2. Treat genuine duplicates in a parsed file as corruption; validate with aapt2 and re-obtain the APK.
  3. When generating arsc programmatically, keep a single source of truth for overlayable declarations.

Example fix

// before
ResOverlayable o = pkg.addOverlayable(name, actor); // throws if exists

// after
ResOverlayable o = pkg.hasOverlayable(name) ? pkg.getOverlayable(name) : pkg.addOverlayable(name, actor);
Defensive patterns

Strategy: validation

Validate before calling

if (!pkg.hasOverlayable(name)) {
    pkg.addOverlayable(name, actor);
} // else reuse pkg.getOverlayable(name)

Try / catch

try {
    pkg.addOverlayable(name, actor);
} catch (AndrolibException ex) {
    // duplicate overlayable declaration -> corrupt arsc; report
}

Prevention

When it happens

Trigger: An arsc containing two overlayable chunks with the same name; merging resource tables that each declared the overlayable; calling addOverlayable twice for one name during table construction.

Common situations: Obfuscated or merged APKs where overlayable blocks were duplicated by processing tools; binary-patched arsc files; refactors that append rather than replace overlayable declarations.

Related errors


AI-assisted analysis of iBotPeaches/Apktool@79b63384d7 (2026-08-14). Data as JSON: /api/errors/adb4fc54e380cc52. Report an issue: GitHub.