{"record":{"id":"0c230b1f97e0f420","repo":"shwenzhang/AndResGuard","slug":"unexpected-parameter-s-after-optionoriginalform-params-0","errorCode":null,"errorMessage":"Unexpected parameter(s) after <optionOriginalForm>: <params[0]>","messagePattern":"Unexpected parameter\\(s\\) after <optionOriginalForm>: <params\\[0\\]>","errorType":"validation","errorClass":"ParameterException","httpStatus":null,"severity":"error","filePath":"AndResGuard-core/src/main/java/apksigner/ApkSignerTool.java","lineNumber":198,"sourceCode":"                                     + \". See --help for supported\"\n                                     + \" options.\");\n      }\n    }\n    if (!signerParams.isEmpty()) {\n      signers.add(signerParams);\n    }\n    signerParams = null;\n\n    if (signers.isEmpty()) {\n      throw new ParameterException(\"At least one signer must be specified\");\n    }\n\n    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()) {","sourceCodeStart":180,"sourceCodeEnd":216,"githubUrl":"https://github.com/shwenzhang/AndResGuard/blob/e4df245d82f27d9a2d0dd108260a3510cbaba849/AndResGuard-core/src/main/java/apksigner/ApkSignerTool.java#L180-L216","documentation":"Validation in ApkSignerTool.sign: once the input APK path has been consumed from positional parameters, no further positional arguments are accepted. This throws when extra non-option tokens appear after --in (or after the signer options), typically a stray filename, typo, or option given without its leading '--'.","triggerScenarios":"`apksigner sign --ks ks.jks --in app.apk extra.apk` — a stray positional argument (often the APK path supplied twice, once via --in and once positionally).","commonSituations":"Scripts appending the APK path positionally while also using --in; pasted command lines with duplicated arguments; quoting errors leaving extra tokens.","solutions":["Remove the extra positional argument","Use either --in <apk> or the positional APK path, not both","Echo the final command in the script to spot duplicated args"],"exampleFix":"// before\napksigner sign --ks ks.jks --in app.apk app.apk\n// after\napksigner sign --ks ks.jks --in app.apk","handlingStrategy":"validation","validationCode":"if (usesInFlag(args) && positionalArgs(args).length > 0) throw new IllegalArgumentException(\"No positional args allowed after --in\");","typeGuard":null,"tryCatchPattern":"try { signCmd(args); } catch (ParameterException e) { System.err.println(e.getMessage()); exit(1); }","preventionTips":["Don't repeat the APK path positionally when --in is used","Echo the assembled command line in scripts","Quote paths to avoid token splitting"],"tags":["cli","argument-parsing"],"backgroundTag":"unexpected-extra-argument","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"}