{"record":{"id":"00618100ee6021b0","repo":"MuntashirAkon/AppManager","slug":"invalid-format-package-names-do-not-match","errorCode":null,"errorMessage":"Invalid format: package names do not match.","messagePattern":"Invalid format: package names do not match\\.","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"app/src/main/java/io/github/muntashirakon/AppManager/rules/struct/RuleEntry.java","lineNumber":67,"sourceCode":"    @NonNull\n    public abstract String flattenToString(boolean isExternal);\n\n    protected String addPackageWithTab(boolean isExternal) {\n        return (isExternal ? packageName + \"\\t\" : \"\");\n    }\n\n    @NonNull\n    public static RuleEntry unflattenFromString(@Nullable String packageName, @NonNull String ruleLine,\n                                                boolean isExternal) throws IllegalArgumentException {\n        StringTokenizer tokenizer = new StringTokenizer(ruleLine, \"\\t\");\n        if (isExternal) {\n            // External rules, the first part is the package name\n            if (tokenizer.hasMoreElements()) {\n                // Match package name\n                String newPackageName = tokenizer.nextElement().toString();\n                if (packageName == null) packageName = newPackageName;\n                if (!packageName.equals(newPackageName)) {\n                    throw new IllegalArgumentException(\"Invalid format: package names do not match.\");\n                }\n            } else throw new IllegalArgumentException(\"Invalid format: packageName not found for external rule.\");\n        }\n        if (packageName == null) {\n            // packageName can't be empty\n            throw new IllegalArgumentException(\"Package name cannot be empty.\");\n        }\n        String name;\n        RuleType type;\n        if (tokenizer.hasMoreElements()) {\n            name = tokenizer.nextElement().toString();\n        } else throw new IllegalArgumentException(\"Invalid format: name not found\");\n        if (tokenizer.hasMoreElements()) {\n            try {\n                type = RuleType.valueOf(tokenizer.nextElement().toString());\n            } catch (Exception e) {\n                throw new IllegalArgumentException(\"Invalid format: Invalid type\");\n            }","sourceCodeStart":49,"sourceCodeEnd":85,"githubUrl":"https://github.com/MuntashirAkon/AppManager/blob/0152f468fc9463ee02dc2ca83f6fe4989a2c4ca5/app/src/main/java/io/github/muntashirakon/AppManager/rules/struct/RuleEntry.java#L49-L85","documentation":"RuleEntry.unflattenFromString parses an external flattened rule where each part may repeat the package name. When a subsequent token differs from the package name parsed earlier, it throws this IllegalArgumentException, because all package-name parts in an external rule line must be identical.","triggerScenarios":"Parsing a flattened string (external rule format, e.g. \"pkgA\\tpkgB\\ttype\\tname...\") where the second package-name token does not equal the first, via RuleEntry.unflattenFromString or a subclass constructor.","commonSituations":"Hand-crafted external rule strings with a typo in the repeated package name, copy-paste mixing rules of two packages, or passing a process/component name where the package name is expected.","solutions":["Make every package-name token in the flattened string identical","Build the flattened string programmatically from entry.getPackageName() instead of by hand","Check that you are not swapping the field order (name vs package)","Catch IllegalArgumentException and report the malformed line"],"exampleFix":"// before\nRuleEntry.unflattenFromString(\"com.a\\tcom.b\\tPERMISSION\\t...\", ...); // mismatch throws\n// after\nRuleEntry.unflattenFromString(\"com.a\\tcom.a\\tPERMISSION\\t...\", ...);","handlingStrategy":"validation","validationCode":"String[] p = externalLine.split(\"\\t\");\nif (p.length >= 2 && !p[0].equals(p[1]))\n    throw new IllegalArgumentException(\"package names do not match\");","typeGuard":"boolean hasConsistentPackageNames(String line) { String[] p = line.split(\"\\t\"); return p.length < 2 || p[0].equals(p[1]); }","tryCatchPattern":"try { RuleEntry.unflattenFromString(line, null); } catch (IllegalArgumentException e) { if (e.getMessage().contains(\"package names\")) fixOrSkip(line); }","preventionTips":["Repeat the exact same package name in every package slot of external rules","Build external strings programmatically from a RuleEntry instead of manually","Check field order: package, package(optional), type, name, extras"],"tags":["rules-parsing","external-rules","illegal-argument"],"backgroundTag":"invalid-argument-format","analyzedSha":"0152f468fc9463ee02dc2ca83f6fe4989a2c4ca5","analyzedAt":"2026-09-12T14:03:37.243Z","contentChangedAt":"2026-09-12T14:03:37.243Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}