shwenzhang/AndResGuard · error · ParameterException

Unsupported option: . See --help for supported options.

Error message

Unsupported option: <optionOriginalForm>. See --help for supported options.

What it means

During `apksigner sign`, each command-line option must be one of the known sign options (in, out, ks, key, cert, etc.). An option name that matches none of them triggers this ParameterException immediately while parsing options.

Solutions

  1. Check `apksigner sign --help` for the exact supported option names
  2. Correct the misspelled option (e.g. --ks-key-alias)
  3. Remove options not supported by the sign subcommand

Example fix

// before
apksigner sign --ks-keyalias myalias --ks release.jks app.apk
// after
apksigner sign --ks-key-alias myalias --ks release.jks app.apk
Defensive patterns

Strategy: validation

Validate before calling

Set<String> ALLOWED = Set.of("out","in","min-sdk-version","max-sdk-version","v1-signing-enabled","v2-signing-enabled","v3-signing-enabled","next-signer","ks","ks-key-alias","ks-pass","key-pass","v1-signer-name","ks-type","ks-provider-name","ks-provider-class","ks-provider-arg","key","cert","v","verbose");
for (String a : args) if (a.startsWith("--") && !ALLOWED.contains(a.substring(2))) throw new IllegalArgumentException("unsupported option: " + a);

Type guard

boolean isSignOption(String arg) {
    return arg != null && arg.startsWith("--") && ALLOWED_SIGN_OPTIONS.contains(arg.substring(2));
}

Try / catch

try { runSign(args); } catch (ParameterException e) { System.err.println(e.getMessage()); printUsage(); }

Prevention

When it happens

Trigger: Passing an option not in sign's accepted set, e.g. `--kskey-alias` or `--ks-alias` instead of `--ks-key-alias`, or an option only valid for `verify` (like `--print-certs`) used with `sign`.

Common situations: Typos in long option names; mixing up sign and verify option sets; using options from a different apksigner version that added/renamed flags.

Understand the failure class

Background: "Unknown argument", "Invalid value", and "must be one of": invalid CLI argument errors explained — this error's family across 35 libraries.

Related errors


AI-assisted analysis of shwenzhang/AndResGuard@e4df245d82 (2026-09-12). Data as JSON: /api/errors/d7e6be1922402cde. Report an issue: GitHub.

Appendix: source

Thrown at AndResGuard-core/src/main/java/apksigner/ApkSignerTool.java:178

        signerParams.keyPasswordSpec = optionsParser.getRequiredValue("Key password");
      } else if ("v1-signer-name".equals(optionName)) {
        signerParams.v1SigFileBasename = optionsParser.getRequiredValue("JAR signature file basename");
      } else if ("ks-type".equals(optionName)) {
        signerParams.keystoreType = optionsParser.getRequiredValue("KeyStore type");
      } else if ("ks-provider-name".equals(optionName)) {
        signerParams.keystoreProviderName = optionsParser.getRequiredValue("JCA KeyStore Provider name");
      } else if ("ks-provider-class".equals(optionName)) {
        signerParams.keystoreProviderClass = optionsParser.getRequiredValue("JCA KeyStore Provider class name");
      } else if ("ks-provider-arg".equals(optionName)) {
        signerParams.keystoreProviderArg = optionsParser.getRequiredValue("JCA KeyStore Provider constructor argument");
      } else if ("key".equals(optionName)) {
        signerParams.keyFile = optionsParser.getRequiredValue("Private key file");
      } else if ("cert".equals(optionName)) {
        signerParams.certFile = optionsParser.getRequiredValue("Certificate file");
      } else if (("v".equals(optionName)) || ("verbose".equals(optionName))) {
        verbose = optionsParser.getOptionalBooleanValue(true);
      } else {
        throw new ParameterException("Unsupported option: "
                                     + optionOriginalForm
                                     + ". See --help for supported"
                                     + " options.");
      }
    }
    if (!signerParams.isEmpty()) {
      signers.add(signerParams);
    }
    signerParams = null;

    if (signers.isEmpty()) {
      throw new ParameterException("At least one signer must be specified");
    }

    params = optionsParser.getRemainingParams();
    if (inputApk != null) {
      // Input APK has been specified via preceding parameters. We don't expect any more
      // parameters.

View on GitHub (pinned to e4df245d82)