skylot/jadx · error · IllegalArgumentException

Plugin option name should start with plugin id: '{}', option

Error message

Plugin option name should start with plugin id: '{}', option: {}

What it means

Thrown as IllegalArgumentException by JadxPluginManager.verifyOptions() when an option's name() is null or does not start with the plugin ID prefix (pluginId + '.'). This naming convention prevents option-name collisions between plugins and allows the CLI/GUI to namespace options unambiguously. For a plugin with ID 'com.example.foo', every option name must begin with 'com.example.foo.'.

Source

Thrown at jadx-core/src/main/java/jadx/core/plugins/JadxPluginManager.java:197

	private AppContext buildDefaultAppContext() {
		AppContext appContext = new AppContext();
		appContext.setGuiContext(null);
		appContext.setFilesGetter(decompiler.getArgs().getFilesGetter());
		return appContext;
	}

	private void verifyOptions(PluginContext pluginContext, JadxPluginOptions options) {
		String pluginId = pluginContext.getPluginId();
		List<OptionDescription> descriptions = options.getOptionsDescriptions();
		if (descriptions == null) {
			throw new IllegalArgumentException("Null option descriptions in plugin id: " + pluginId);
		}
		String prefix = pluginId + '.';
		descriptions.forEach(descObj -> {
			String optName = descObj.name();
			if (optName == null || !optName.startsWith(prefix)) {
				throw new IllegalArgumentException("Plugin option name should start with plugin id: '" + prefix + "', option: " + optName);
			}
			String desc = descObj.description();
			if (desc == null || desc.isEmpty()) {
				throw new IllegalArgumentException("Plugin option description not set, plugin: " + pluginId);
			}
			List<String> values = descObj.values();
			if (values == null) {
				throw new IllegalArgumentException("Plugin option values is null, option: " + optName + ", plugin: " + pluginId);
			}
		});
	}

	public List<JadxCodeInput> getCodeInputs() {
		return getResolvedPluginContexts()
				.stream()
				.flatMap(p -> p.getCodeInputs().stream())
				.collect(Collectors.toList());
	}

View on GitHub (pinned to e738a26571)

Solutions

  1. Prefix every option name with the plugin ID followed by a dot: '<pluginId>.<optionName>'.
  2. Use the plugin's getPluginId() return value dynamically rather than hardcoding, to avoid mismatches after ID changes.
  3. Check for null option names in your OptionDescription implementation.
  4. Report or fix the plugin if you are not its author.

Example fix

// before
new OptionDescription() {
    public String name() { return "outputDir"; } // missing prefix
    ...
}

// after
new OptionDescription() {
    public String name() { return pluginId + ".outputDir"; }
    ...
}
Defensive patterns

Strategy: validation

Validate before calling

// Build option names with the plugin ID prefix
String prefix = pluginId + '.';
String fullName = prefix + "outputDir"; // e.g. "com.example.foo.outputDir"
// Verify before returning
assert fullName.startsWith(prefix);

Prevention

When it happens

Trigger: A plugin's OptionDescription.name() returns a string that is null, lacks the plugin-id prefix, or uses a different separator. The manager iterates every option description after init and checks the prefix.

Common situations: Custom jadx plugin development where the author uses short option names (e.g. 'outputDir') instead of fully-qualified names (e.g. 'com.example.foo.outputDir'). Also triggered by copy-paste between plugins where the ID was changed but option names were not updated.

Related errors


AI-assisted analysis of skylot/jadx@e738a26571 (2026-08-14). Data as JSON: /api/errors/5b02fea36cf3afd7. Report an issue: GitHub.