skylot/jadx · error · JadxRuntimeException
Failed to get inputs hash for plugin: {}
Error message
Failed to get inputs hash for plugin: {} What it means
Thrown by PluginContext.getInputsHash when the plugin-supplied inputsHashSupplier (registered via registerInputsHashSupplier) raises any exception. The hash is used to decide whether cached decompilation output can be reused for the current plugin inputs; failure means the cache key cannot be computed for that plugin.
Source
Thrown at jadx-core/src/main/java/jadx/core/plugins/PluginContext.java:137
} catch (Exception e) {
throw new JadxRuntimeException("Failed to apply options for plugin: " + getPluginId(), e);
}
}
@Override
public void registerInputsHashSupplier(Supplier<String> supplier) {
this.inputsHashSupplier = supplier;
}
@Override
public String getInputsHash() {
if (inputsHashSupplier == null) {
return defaultOptionsHash();
}
try {
return inputsHashSupplier.get();
} catch (Exception e) {
throw new JadxRuntimeException("Failed to get inputs hash for plugin: " + getPluginId(), e);
}
}
private String defaultOptionsHash() {
if (options == null) {
return "";
}
Map<String, String> allOptions = getArgs().getPluginOptions();
StringBuilder sb = new StringBuilder();
for (OptionDescription optDesc : options.getOptionsDescriptions()) {
if (!optDesc.getFlags().contains(OptionFlag.NOT_CHANGING_CODE)) {
sb.append(':').append(allOptions.get(optDesc.name()));
}
}
return FileUtils.md5Sum(sb.toString());
}
@OverrideView on GitHub (pinned to e738a26571)
Solutions
- Inspect the wrapped cause to find what the supplier was trying to read and why it failed.
- Ensure plugin inputs (files/resources referenced by the supplier) are present and accessible.
- Update or contact the plugin author if the supplier itself is buggy.
- Catch JadxRuntimeException around plugin initialisation/getInputsHash when orchestrating multiple plugins.
Defensive patterns
Strategy: try-catch
Try / catch
try {
String hash = pluginCtx.getInputsHash();
} catch (JadxRuntimeException e) {
LOG.warn("plugin {} hash failed, skipping cache: {}", pluginCtx.getPluginId(), e.getCause());
} Prevention
- Keep plugin input files/resources present across runs so the supplier can read them.
- Catch around getInputsHash so one plugin's cache key does not break the pipeline.
- Report a buggy supplier to the plugin author.
When it happens
Trigger: A plugin registers a Supplier<String> that hashes its inputs, and that supplier throws (e.g. it tries to read an input file that no longer exists, computes over a null, or hits an IOException). PluginContext wraps the exception and names the plugin id.
Common situations: Plugin inputs moved/removed between runs, a buggy hash supplier in a third-party plugin, or a plugin whose supplier assumes state that was not initialised. The error is scoped to one plugin's cache key, not to decompilation itself.
Related errors
- Unknown type of resource file: ${resFile.getOriginalName()}
- Duplicate plugin id: {}, class {}
- Failed to apply options for plugin: {}
- Malformed 'requiredJadxVersion': {}
- Ordering pass not found: {}, listed in 'runAfter' of pass: {
AI-assisted analysis of skylot/jadx@e738a26571 (2026-08-14).
Data as JSON: /api/errors/b9aa9dd372efd342.
Report an issue: GitHub.