{"record":{"id":"ea8598c7d57dd4e2","repo":"MuntashirAkon/AppManager","slug":"manifest-tag-not-found","errorCode":null,"errorMessage":"\"manifest\" tag not found.","messagePattern":"\"manifest\" tag not found\\.","errorType":"exception","errorClass":"IOException","httpStatus":null,"severity":"error","filePath":"app/src/main/java/io/github/muntashirakon/AppManager/apk/parser/ManifestParser.java","lineNumber":67,"sourceCode":"    private String mPackageName;\n\n    public ManifestParser(@NonNull byte[] manifestBytes) {\n        this(ByteBuffer.wrap(manifestBytes));\n    }\n\n    public ManifestParser(@NonNull ByteBuffer manifestBytes) {\n        mManifestBytes = manifestBytes;\n    }\n\n    public List<ManifestComponent> parseComponents() throws IOException {\n        try (BlockReader reader = new BlockReader(mManifestBytes.array())) {\n            ResXmlDocument xmlBlock = new ResXmlDocument();\n            xmlBlock.readBytes(reader);\n            xmlBlock.setPackageBlock(AndroidBinXmlDecoder.getFrameworkPackageBlock());\n            ResXmlElement resManifestElement = xmlBlock.getDocumentElement();\n            // manifest\n            if (!TAG_MANIFEST.equals(resManifestElement.getName())) {\n                throw new IOException(\"\\\"manifest\\\" tag not found.\");\n            }\n            String packageName = getAttributeValue(resManifestElement, ATTR_MANIFEST_PACKAGE);\n            if (packageName == null) {\n                throw new IOException(\"\\\"manifest\\\" does not have required attribute \\\"package\\\".\");\n            }\n            mPackageName = packageName;\n            // manifest -> application\n            ResXmlElement resApplicationElement = null;\n            Iterator<ResXmlElement> resXmlElementIt = resManifestElement.getElements(TAG_APPLICATION);\n            if (resXmlElementIt.hasNext()) {\n                resApplicationElement = resXmlElementIt.next();\n            }\n            if (resXmlElementIt.hasNext()) {\n                throw new IOException(\"\\\"manifest\\\" has duplicate \\\"application\\\" tags.\");\n            }\n            if (resApplicationElement == null) {\n                Log.i(TAG, \"package %s does not have \\\"application\\\" tag.\", mPackageName);\n                return Collections.emptyList();","sourceCodeStart":49,"sourceCodeEnd":85,"githubUrl":"https://github.com/MuntashirAkon/AppManager/blob/0152f468fc9463ee02dc2ca83f6fe4989a2c4ca5/app/src/main/java/io/github/muntashirakon/AppManager/apk/parser/ManifestParser.java#L49-L85","documentation":"ManifestParser.parseComponents throws IOException(\"\\\"manifest\\\" tag not found.\") after decoding a binary Android XML (AXML) block when the document's root element is not named \"manifest\". A valid binary AndroidManifest.xml must have <manifest> as its root. If the root tag differs, the file is not an Android manifest, so parsing aborts.","triggerScenarios":"parseComponents (via manifestComponents) is given a reader whose decoded ResXmlDocument has a root element other than \"manifest\" — e.g. the wrong XML file was passed (AndroidManifest of a library processed oddly, a layout, or a non-AXML file misinterpreted).","commonSituations":"Passing a plain-text (non-binary) manifest to a binary AXML parser, pointing the parser at the wrong entry in an APK, or a repackaged/corrupted APK whose manifest root was altered by an obfuscator or repack tool.","solutions":["Ensure the input is the APK's binary AndroidManifest.xml (extract with the correct entry name from the APK).","Verify the file is compiled AXML, not plain-text XML; use the text parser for uncompiled manifests.","Check the APK isn't corrupted or repackaged; re-obtain or rebuild it and inspect with aapt dump xmltree.","Catch the IOException and report the file as an invalid APK rather than retrying parse."],"exampleFix":"// before\nparser.parseComponents(reader); // may throw \"manifest\" tag not found\n// after\ntry (InputStream in = apk.getEntry(\"AndroidManifest.xml\")) {\n    byte[] axml = IOUtils.readFully(in);\n    if (!(axml.length > 4 && axml[0] == 0x03 && axml[1] == 0)) {\n        throw new IOException(\"Not a binary Android manifest (AXML).\");\n    }\n    parser.parseComponents(new Buffer(new ByteBufferBackedInputStream(ByteBuffer.wrap(axml))));\n}","handlingStrategy":"try-catch","validationCode":"// ensure it is binary AXML: first 2 bytes are 0x0003 (RES_XML_TYPE)\nbyte[] head = new byte[2];\ntry (InputStream in = apk.getEntry(\"AndroidManifest.xml\")) {\n    if (in.read(head) != 2) return false;\n    return (head[0] & 0xFF) == 0x03 && (head[1] & 0xFF) == 0x00;\n}","typeGuard":"static boolean isBinaryAxml(byte[] data) {\n    return data != null && data.length >= 4 && (data[0] & 0xFF) == 0x03 && (data[1] & 0xFF) == 0x00;\n}","tryCatchPattern":"try (var reader = manifestReader) {\n    ManifestParser parser = new ManifestParser(reader);\n    parser.parse();\n} catch (IOException e) {\n    if (e.getMessage().contains(\"manifest\\\" tag not found\")) {\n        report(\"Not a valid binary AndroidManifest.xml\");\n    } else throw e;\n}","preventionTips":["Always pass the APK's AndroidManifest.xml entry, not arbitrary XML files.","Check the AXML magic bytes before parsing to fail fast on plain-text XML.","Inspect repackaged APKs with aapt dump xmltree before automating parsing.","Wrap manifest parsing in error handling so one bad APK cannot abort a batch scan."],"tags":["android","apk","axml","manifest","parse-failure"],"backgroundTag":"schema-validation-failed","analyzedSha":"0152f468fc9463ee02dc2ca83f6fe4989a2c4ca5","analyzedAt":"2026-09-12T14:03:37.243Z","contentChangedAt":"2026-09-12T14:03:37.243Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}