{"record":{"id":"4c19bf8d1f782ac6","repo":"skylot/jadx","slug":"invoke-custom-instruction-processing-error","errorCode":null,"errorMessage":"'invoke-custom' instruction processing error: {}","messagePattern":"'invoke-custom' instruction processing error: (.+?)","errorType":"exception","errorClass":"JadxRuntimeException","httpStatus":null,"severity":"error","filePath":"jadx-core/src/main/java/jadx/core/dex/instructions/InvokeCustomBuilder.java","lineNumber":47,"sourceCode":"\t\t\tList<EncodedValue> values = callSite.getValues();\n\t\t\tif (CustomLambdaCall.isLambdaInvoke(values)) {\n\t\t\t\treturn CustomLambdaCall.buildLambdaMethodCall(mth, insn, isRange, values);\n\t\t\t}\n\t\t\tif (CustomStringConcat.isStringConcat(values)) {\n\t\t\t\treturn CustomStringConcat.buildStringConcat(insn, isRange, values);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\treturn CustomRawCall.build(mth, insn, isRange, values);\n\t\t\t} catch (Exception e) {\n\t\t\t\tmth.addWarn(\"Failed to decode invoke-custom: \\n\" + Utils.listToString(values, \"\\n\")\n\t\t\t\t\t\t+ \",\\n exception: \" + Utils.getStackTrace(e));\n\t\t\t\tInsnNode nop = new InsnNode(InsnType.NOP, 0);\n\t\t\t\tnop.add(AFlag.SYNTHETIC);\n\t\t\t\tnop.addAttr(AType.JADX_ERROR, new JadxError(\"Failed to decode invoke-custom: \" + values, e));\n\t\t\t\treturn nop;\n\t\t\t}\n\t\t} catch (Exception e) {\n\t\t\tthrow new JadxRuntimeException(\"'invoke-custom' instruction processing error: \" + e.getMessage(), e);\n\t\t}\n\t}\n}\n","sourceCodeStart":29,"sourceCodeEnd":51,"githubUrl":"https://github.com/skylot/jadx/blob/e738a26571d02919f01df40de93bc9a44dee4e18/jadx-core/src/main/java/jadx/core/dex/instructions/InvokeCustomBuilder.java#L29-L51","documentation":"The outer catch-all in InvokeCustomBuilder.build(). It wraps ANY exception that escapes the call-site loading or the lambda/concat/raw-call dispatch that is NOT caught by the inner try (which only guards CustomRawCall.build and degrades to a NOP). This is the last-resort error for invoke-custom processing.","triggerScenarios":"An exception during callSite.load(), CustomLambdaCall.buildLambdaMethodCall, or CustomStringConcat.buildStringConcat — e.g. a ClassCastException on encoded values, IndexOutOfBoundsException from values.get(n) on a short call-site array, or an unexpected null in the bootstrap method arguments.","commonSituations":"APKs with non-standard bootstrap methods, obfuscated or packed invoke-custom sites, or call-site arrays with fewer than the expected number of EncodedValue entries.","solutions":["Upgrade JADX — invoke-custom handling is an active area of development.","Use --no-debug-info / --show-bad-code to get partial output.","Inspect the bootstrap method arguments with baksmali to see the call-site value list.","Report the full invoke-custom values list and exception to the JADX tracker."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n    jadx.load();\n} catch (JadxRuntimeException e) {\n    if (e.getMessage().contains(\"invoke-custom\")) {\n        log.warn(\"invoke-custom processing failed; class may be partially decompiled\", e);\n    } else throw e;\n}","preventionTips":["Inspect bootstrap method arguments with baksmali when invoke-custom fails.","Use --show-bad-code to get partial output.","Keep JADX updated — invoke-custom handling improves frequently."],"tags":["invoke-custom","bootstrap-method","malformed-input"],"backgroundTag":null,"analyzedSha":"e738a26571d02919f01df40de93bc9a44dee4e18","analyzedAt":"2026-08-14T00:10:24.238Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}