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
- Check hasOverlayable(name) first and reuse the existing overlayable.
- Treat genuine duplicates in a parsed file as corruption; validate with aapt2 and re-obtain the APK.
- 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
- Make adds idempotent via hasOverlayable
- Emit each overlayable once when generating arsc
- Validate duplicated declarations with aapt2 dump
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
- Repeated type spec: pkgId=0x%02x, typeId=0x%02x, typeName=%s
- Repeated entry spec: pkgId=0x%02x, typeId=0x%02x, entryId=0x
- Repeated entry: pkgId=0x%02x, typeId=0x%02x, entryId=0x%04x,
- overlayable: pkgId=0x%02x, name=%s
- Repeated alias: pkgId=0x%02x, aliasId=%s
AI-assisted analysis of iBotPeaches/Apktool@79b63384d7 (2026-08-14).
Data as JSON: /api/errors/adb4fc54e380cc52.
Report an issue: GitHub.