{"record":{"id":"e148b650edaf2922","repo":"iBotPeaches/Apktool","slug":"missing-value-string-pool","errorCode":null,"errorMessage":"Missing value string pool.","messagePattern":"Missing value string pool\\.","errorType":"exception","errorClass":"AndrolibException","httpStatus":null,"severity":"error","filePath":"brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/BinaryResourceParser.java","lineNumber":685,"sourceCode":"        int type = mIn.readUnsignedByte();\n        int data = mIn.readInt();\n\n        return parseItem(typeName, inBag, type, data);\n    }\n\n    private ResValue parseItem(String typeName, boolean inBag, int type, int data) throws AndrolibException {\n        // ID resource values are either encoded as a boolean (false) or a resource reference.\n        // A boolean (false) is no longer allowed in XML, replace with a placeholder value.\n        // A resource reference is handled normally, unless it's @null.\n        if (typeName.equals(\"id\") && (data == 0 || (type != ResValue.TYPE_REFERENCE\n                && type != ResValue.TYPE_DYNAMIC_REFERENCE))) {\n            return ResCustom.ID;\n        }\n\n        // Special handling for strings and file references.\n        if (type == ResValue.TYPE_STRING) {\n            if (mValueStringPool == null) {\n                throw new AndrolibException(\"Missing value string pool.\");\n            }\n\n            CharSequence strValue = mValueStringPool.getText(data);\n\n            // If a string is not allowed here, assume it's a file reference.\n            // ResFileDecoder will replace it if it's an invalid file reference.\n            if (strValue instanceof String && strValue.length() > 0 && !inBag && !typeName.equals(\"string\")) {\n                return new ResFileReference((String) strValue);\n            }\n\n            return new ResString(strValue);\n        }\n\n        return ResItem.parse(mPackage, type, data);\n    }\n\n    private void parseLibrary(ResChunkPullParser parser) throws IOException {\n        // ResTable_lib_header","sourceCodeStart":667,"sourceCodeEnd":703,"githubUrl":"https://github.com/iBotPeaches/Apktool/blob/79b63384d7d7e22917e6ea8b453272da7012515b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/BinaryResourceParser.java#L667-L703","documentation":"When a resource value has type TYPE_STRING, BinaryResourceParser resolves its data field as an index into the table's global value string pool. If no RES_TABLE_VALUE_POOL / string pool of type values was parsed before the entries, that lookup is impossible and this error is thrown.","triggerScenarios":"An arsc whose package entries reference string values while the table-level value string pool chunk is missing or was skipped — typically a stripped/obfuscated pool or a chunk-order violation at table scope (not package scope).","commonSituations":"Packers that remove 'unused' string pools while leaving references to them; resource optimizers with bugs that drop the value pool when it still has live references; malformed fuzzing corpora.","solutions":["Verify the table header's string pool chunk exists and precedes package data (hex-dump around offset 0x0C).","Decode an unobfuscated build of the same app.","If producing arsc programmatically, always emit the global value string pool even when it looks empty.","Report the sample upstream — apktool sometimes adds tolerances for known packer quirks."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n    parser.parse(in);\n} catch (AndrolibException e) {\n    if (\"Missing value string pool.\".equals(e.getMessage())) {\n        // table-level value string pool stripped but still referenced\n    }\n}","preventionTips":["Never strip the global value string pool when shrinking arsc files.","Test resource-optimized builds by decoding them before release."],"tags":["apktool","arsc","string-pool","parsing","obfuscation"],"backgroundTag":null,"analyzedSha":"79b63384d7d7e22917e6ea8b453272da7012515b","analyzedAt":"2026-08-14T10:43:28.812Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}