{"record":{"id":"c5bf304447c63ed4","repo":"shwenzhang/AndResGuard","slug":"min-api-level-minsdkversion-max-api-level-maxsdkversion","errorCode":null,"errorMessage":"Min API Level (<minSdkVersion>) > max API Level (<maxSdkVersion>)","messagePattern":"Min API Level \\(<minSdkVersion>\\) > max API Level \\(<maxSdkVersion>\\)","errorType":"validation","errorClass":"ParameterException","httpStatus":null,"severity":"error","filePath":"AndResGuard-core/src/main/java/apksigner/ApkSignerTool.java","lineNumber":211,"sourceCode":"    params = optionsParser.getRemainingParams();\n    if (inputApk != null) {\n      // Input APK has been specified via preceding parameters. We don't expect any more\n      // parameters.\n      if (params.length > 0) {\n        throw new ParameterException(\"Unexpected parameter(s) after \" + optionOriginalForm + \": \" + params[0]);\n      }\n    } else {\n      // Input APK has not been specified via preceding parameters. The next parameter is\n      // supposed to be the path to input APK.\n      if (params.length < 1) {\n        throw new ParameterException(\"Missing input APK\");\n      } else if (params.length > 1) {\n        throw new ParameterException(\"Unexpected parameter(s) after input APK (\" + params[1] + \")\");\n      }\n      inputApk = new File(params[0]);\n    }\n    if ((minSdkVersionSpecified) && (minSdkVersion > maxSdkVersion)) {\n      throw new ParameterException(\"Min API Level (\" + minSdkVersion + \") > max API Level (\" + maxSdkVersion + \")\");\n    }\n\n    List<ApkSigner.SignerConfig> signerConfigs = new ArrayList<>(signers.size());\n    int signerNumber = 0;\n    try (PasswordRetriever passwordRetriever = new PasswordRetriever()) {\n      for (SignerParams signer : signers) {\n        signerNumber++;\n        signer.name = \"signer #\" + signerNumber;\n        try {\n          signer.loadPrivateKeyAndCerts(passwordRetriever);\n        } catch (ParameterException e) {\n          System.err.println(\"Failed to load signer \\\"\" + signer.name + \"\\\": \" + e.getMessage());\n          System.exit(2);\n          return;\n        } catch (Exception e) {\n          System.err.println(\"Failed to load signer \\\"\" + signer.name + \"\\\"\");\n          e.printStackTrace();\n          System.exit(2);","sourceCodeStart":193,"sourceCodeEnd":229,"githubUrl":"https://github.com/shwenzhang/AndResGuard/blob/e4df245d82f27d9a2d0dd108260a3510cbaba849/AndResGuard-core/src/main/java/apksigner/ApkSignerTool.java#L193-L229","documentation":"Consistency validation in ApkSignerTool.sign: the --min-sdk-version parsed to a larger value than --max-sdk-version, an impossible API range. Fires when the user passes flags in the wrong order or mixed numeric formats, e.g. --min-sdk-version 28 --max-sdk-version 24; no signatures can target an empty version range.","triggerScenarios":"`apksigner sign --min-sdk-version 28 --max-sdk-version 24 ...` — an inverted or contradictory version range.","commonSituations":"Copy-pasting min/max values into the wrong flags; build config where minSdk > maxSdk due to edited gradle-derived values; changing --max-sdk-version without lowering min.","solutions":["Swap the values so min <= max","Raise --max-sdk-version above --min-sdk-version","Drop one of the flags to use defaults (min 1, max unlimited)"],"exampleFix":"// before\napksigner sign --min-sdk-version 28 --max-sdk-version 24 --ks ks.jks app.apk\n// after\napksigner sign --min-sdk-version 24 --max-sdk-version 28 --ks ks.jks app.apk","handlingStrategy":"validation","validationCode":"int min = getFlagInt(args, \"--min-sdk-version\", 1);\nint max = getFlagInt(args, \"--max-sdk-version\", Integer.MAX_VALUE);\nif (min > max) throw new IllegalArgumentException(\"min-sdk-version (\" + min + \") must be <= max-sdk-version (\" + max + \")\");","typeGuard":null,"tryCatchPattern":"try { signCmd(args); } catch (ParameterException e) { System.err.println(\"Invalid SDK range: \" + e.getMessage()); exit(1); }","preventionTips":["Double-check which flag is min and which is max","Derive both from the same source of truth (e.g. build config)","Validate the range before building the command"],"tags":["cli","validation","version-range"],"backgroundTag":"conflicting-config-options","analyzedSha":"e4df245d82f27d9a2d0dd108260a3510cbaba849","analyzedAt":"2026-09-12T17:49:07.798Z","contentChangedAt":"2026-09-12T17:49:07.798Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}