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
- Prefix every option name with the plugin ID followed by a dot: '<pluginId>.<optionName>'.
- Use the plugin's getPluginId() return value dynamically rather than hardcoding, to avoid mismatches after ID changes.
- Check for null option names in your OptionDescription implementation.
- 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
- Plugin authors: prefix every option name with '<pluginId>.'.
- Derive the prefix from getPluginId() at runtime rather than hardcoding to avoid mismatches after renames.
- Add a unit test asserting all option names start with the plugin ID.
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
- Null option descriptions in plugin id: {}
- Plugin option description not set, plugin: {}
- Plugin option values is null, option: {}, plugin: {}
- Duplicate plugin id: {}, class {}
- Failed to apply options for plugin: {}
AI-assisted analysis of skylot/jadx@e738a26571 (2026-08-14).
Data as JSON: /api/errors/5b02fea36cf3afd7.
Report an issue: GitHub.