{"record":{"id":"a685b6a48ecc505c","repo":"iBotPeaches/Apktool","slug":"could-not-identify-aapt-binary-version","errorCode":null,"errorMessage":"Could not identify aapt binary version: ","messagePattern":"Could not identify aapt binary version: ","errorType":"exception","errorClass":"AndrolibException","httpStatus":null,"severity":"error","filePath":"brut.apktool/apktool-lib/src/main/java/brut/androlib/res/AaptManager.java","lineNumber":100,"sourceCode":"        String versionStr = OS.execAndReturn(new String[] { binFile.getPath(), \"version\" });\n        if (versionStr == null) {\n            throw new AndrolibException(\"Could not execute aapt binary at location: \" + binFile.getPath());\n        }\n\n        return getVersionFromString(versionStr);\n    }\n\n    public static int getVersionFromString(String versionStr) throws AndrolibException {\n        if (versionStr.startsWith(\"Android Asset Packaging Tool (aapt) 2:\")) {\n            return 2;\n        }\n        if (versionStr.startsWith(\"Android Asset Packaging Tool (aapt) 2.\")) {\n            return 2; // Prior to Android SDK 26.0.2\n        }\n        if (versionStr.startsWith(\"Android Asset Packaging Tool, v0.\")) {\n            return 1;\n        }\n        throw new AndrolibException(\"Could not identify aapt binary version: \" + versionStr);\n    }\n}\n","sourceCodeStart":82,"sourceCodeEnd":103,"githubUrl":"https://github.com/iBotPeaches/Apktool/blob/79b63384d7d7e22917e6ea8b453272da7012515b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/AaptManager.java#L82-L103","documentation":"AndrolibException from AaptManager.getVersionFromString() when the output of `<aapt> version` does not match any known banner prefix. Apktool recognizes two aapt2 banner forms (\"...(aapt) 2:\" and \"...(aapt) 2.\" pre-26.0.2) and one aapt1 form (\"Android Asset Packaging Tool, v0.\"). Anything else — a wrapper script, a locale-modified banner, a shim that prints extra text — is unidentifiable and the build/refusing path aborts.","triggerScenarios":"Pointing --aapt at a shell wrapper or polyfill (e.g. brew shims) whose `version` output has a prefix line; a patched/custom aapt2 with changed banner text; an aapt whose version string uses a different format (e.g. \"aapt2 2.19.0\" without the long banner).","commonSituations":"Using third-party aapt2 repackagers (Termux, Nix, brew shims) that alter stdout; wrapper scripts that echo environment info before exec; CI images with instrumented binaries.","solutions":["Run `<binary> version` yourself and confirm the first line starts with \"Android Asset Packaging Tool (aapt) 2:\"; if not, switch binaries.","Remove wrapper scripts and point --aapt directly at the real binary from Android SDK build-tools.","Use the bundled aapt2 (omit --aapt)."],"exampleFix":"# before\napktool b app --aapt ./my-aapt-wrapper.sh\n# after\napktool b app --aapt $ANDROID_HOME/build-tools/34.0.0/aapt2","handlingStrategy":"validation","validationCode":"String v = OS.execAndReturn(new String[]{aaptPath, \"version\"});\nif (v == null || !(v.startsWith(\"Android Asset Packaging Tool (aapt) 2:\")\n        || v.startsWith(\"Android Asset Packaging Tool (aapt) 2.\"))) {\n    throw new IllegalArgumentException(\"Unrecognized aapt version banner: \" + v);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Avoid wrapper scripts as --aapt values; reference real SDK build-tools binaries.","Pin a known-good build-tools version in CI so banner formats stay stable."],"tags":["apktool","aapt","version-detection","build"],"backgroundTag":null,"analyzedSha":"79b63384d7d7e22917e6ea8b453272da7012515b","analyzedAt":"2026-08-14T10:43:28.812Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}