{"record":{"id":"b9aa9dd372efd342","repo":"skylot/jadx","slug":"failed-to-get-inputs-hash-for-plugin","errorCode":null,"errorMessage":"Failed to get inputs hash for plugin: {}","messagePattern":"Failed to get inputs hash for plugin: (.+?)","errorType":"exception","errorClass":"JadxRuntimeException","httpStatus":null,"severity":"error","filePath":"jadx-core/src/main/java/jadx/core/plugins/PluginContext.java","lineNumber":137,"sourceCode":"\t\t} catch (Exception e) {\n\t\t\tthrow new JadxRuntimeException(\"Failed to apply options for plugin: \" + getPluginId(), e);\n\t\t}\n\t}\n\n\t@Override\n\tpublic void registerInputsHashSupplier(Supplier<String> supplier) {\n\t\tthis.inputsHashSupplier = supplier;\n\t}\n\n\t@Override\n\tpublic String getInputsHash() {\n\t\tif (inputsHashSupplier == null) {\n\t\t\treturn defaultOptionsHash();\n\t\t}\n\t\ttry {\n\t\t\treturn inputsHashSupplier.get();\n\t\t} catch (Exception e) {\n\t\t\tthrow new JadxRuntimeException(\"Failed to get inputs hash for plugin: \" + getPluginId(), e);\n\t\t}\n\t}\n\n\tprivate String defaultOptionsHash() {\n\t\tif (options == null) {\n\t\t\treturn \"\";\n\t\t}\n\t\tMap<String, String> allOptions = getArgs().getPluginOptions();\n\t\tStringBuilder sb = new StringBuilder();\n\t\tfor (OptionDescription optDesc : options.getOptionsDescriptions()) {\n\t\t\tif (!optDesc.getFlags().contains(OptionFlag.NOT_CHANGING_CODE)) {\n\t\t\t\tsb.append(':').append(allOptions.get(optDesc.name()));\n\t\t\t}\n\t\t}\n\t\treturn FileUtils.md5Sum(sb.toString());\n\t}\n\n\t@Override","sourceCodeStart":119,"sourceCodeEnd":155,"githubUrl":"https://github.com/skylot/jadx/blob/e738a26571d02919f01df40de93bc9a44dee4e18/jadx-core/src/main/java/jadx/core/plugins/PluginContext.java#L119-L155","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n    String hash = pluginCtx.getInputsHash();\n} catch (JadxRuntimeException e) {\n    LOG.warn(\"plugin {} hash failed, skipping cache: {}\", pluginCtx.getPluginId(), e.getCause());\n}","preventionTips":["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."],"tags":["plugins","cache","inputs-hash","configuration","exception-wrap"],"backgroundTag":null,"analyzedSha":"e738a26571d02919f01df40de93bc9a44dee4e18","analyzedAt":"2026-08-14T00:10:24.238Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}