{"record":{"id":"299ea0de9237ff1e","repo":"iBotPeaches/Apktool","slug":"overlayable-pkgid-0x-02x-name-s","errorCode":null,"errorMessage":"overlayable: pkgId=0x%02x, name=%s","messagePattern":"overlayable: pkgId=0x%02x, name=(.+?)","errorType":"exception","errorClass":"UndefinedResObjectException","httpStatus":null,"severity":"error","filePath":"brut.apktool/apktool-lib/src/main/java/brut/androlib/res/table/ResPackage.java","lineNumber":305,"sourceCode":"        return entry;\n    }\n\n    public int getEntryCount() {\n        return mEntries.size();\n    }\n\n    public Collection<ResEntry> listEntries() {\n        return mEntries.values();\n    }\n\n    public boolean hasOverlayable(String name) {\n        return mOverlayables.containsKey(name);\n    }\n\n    public ResOverlayable getOverlayable(String name) throws UndefinedResObjectException {\n        ResOverlayable overlayable = mOverlayables.get(name);\n        if (overlayable == null) {\n            throw new UndefinedResObjectException(\n                String.format(\"overlayable: pkgId=0x%02x, name=%s\", getId(), name));\n        }\n        return overlayable;\n    }\n\n    public ResOverlayable addOverlayable(String name, String actor) throws AndrolibException {\n        ResOverlayable overlayable = mOverlayables.get(name);\n        if (overlayable != null) {\n            throw new AndrolibException(\n                String.format(\"Repeated overlayable: pkgId=0x%02x, name=%s\", getId(), name));\n        }\n\n        overlayable = new ResOverlayable(this, name, actor);\n        mOverlayables.put(name, overlayable);\n        return overlayable;\n    }\n\n    public int getOverlayableCount() {","sourceCodeStart":287,"sourceCodeEnd":323,"githubUrl":"https://github.com/iBotPeaches/Apktool/blob/79b63384d7d7e22917e6ea8b453272da7012515b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/table/ResPackage.java#L287-L323","documentation":"UndefinedResObjectException thrown by ResPackage.getOverlayable(name) when no ResOverlayable with that name exists in the package. Overlayables are declared via <overlayable> blocks in resources.arsc (Android 10+ runtime resource overlays); requesting one that was never declared — or is declared in a different package — raises this.","triggerScenarios":"An <overlay> or policy reference naming an overlayable that this package does not declare; parsing split APKs where the overlayable lives in the base but the reference appears in a split parsed without it; typos or renamed overlayable names between app versions.","commonSituations":"Working with RRO (runtime resource overlay) targets; OEM/themed apps using overlayable resources; app updates that renamed overlayable blocks while external overlays kept old names.","solutions":["Guard with hasOverlayable(name) before getOverlayable(name).","Ensure the package you query is the one that declares the overlayable (commonly the base APK package).","Keep overlayable names stable across app versions if external overlays depend on them; on failure, log the missing name to identify the stale overlay."],"exampleFix":"// before\nResOverlayable o = pkg.getOverlayable(name);\n\n// after\nif (!pkg.hasOverlayable(name)) {\n    Log.w(TAG, \"overlayable not declared in pkg \" + pkg.getId() + \": \" + name);\n    return;\n}\nResOverlayable o = pkg.getOverlayable(name);","handlingStrategy":"type-guard","validationCode":null,"typeGuard":"boolean hasOverlayable(ResPackage pkg, String name) {\n    return pkg.hasOverlayable(name);\n}","tryCatchPattern":"try {\n    ResOverlayable o = pkg.getOverlayable(name);\n} catch (UndefinedResObjectException ex) {\n    // overlayable not declared in this package; skip overlay application\n}","preventionTips":["Call hasOverlayable(name) before getOverlayable(name)","Query the package that declares the overlayable (usually base APK)","Keep overlayable names stable across releases for external overlays"],"tags":["android","apktool","resource-table","overlayable","rro","undefined-object"],"backgroundTag":null,"analyzedSha":"79b63384d7d7e22917e6ea8b453272da7012515b","analyzedAt":"2026-08-14T10:43:28.812Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}