pxb1988/dex2jar · error · RuntimeException
not support Yet!
Error message
not support Yet!
What it means
The opcode rule for method instructions contains an INVOKEDYNAMIC alternative whose action unconditionally executes if(1==1) throw new RuntimeException("not support Yet!") at Jasmin.g:1171. d2j-jasmin's assembler has no implementation for emitting invokedynamic call sites, so any Jasmin file containing an invokedynamic instruction aborts assembly with this message. It is a deliberate not-implemented placeholder, not a user-input validation error.
Solutions
- Upgrade dex2jar to the latest release, where invokedynamic assembly support may have been added
- Preprocess the input so invokedynamic is desugared (e.g. use d8/dx --min-api with desugaring, or retrolambda) before dumping to Jasmin
- Assemble with a tool that fully supports invokedynamic, such as smali/baksmali or ASM's ClassWriter directly
- If you own the grammar, implement the INVOKEDYNAMIC alternative by emitting an ASM Handle + InvokeDynamicInsn via MethodVisitor.visitInvokeDynamicInsn instead of throwing
Example fix
// before (Jasmin.g:1171)
| a=INVOKEDYNAMIC e3=sMethodObject sId sMethodDesc '(' sInvokeDynamicE (',' sInvokeDynamicE)* ')' {line($a.line); if(1==1) throw new RuntimeException("not support Yet!");}
// after
| a=INVOKEDYNAMIC e3=sMethodObject sId sMethodDesc '(' sInvokeDynamicE (',' sInvokeDynamicE)* ')' {line($a.line); mn.visitInvokeDynamicInsn($sId.text, $sMethodDesc.desc, /* build Handle from e3 */ handle, bsmArgs);} Defensive patterns
Strategy: try-catch
Validate before calling
// detect invokedynamic instructions in Jasmin source before assembling
if (Pattern.compile("^\\s*invokedynamic\\b", Pattern.MULTILINE).matcher(jasminSource).find()) {
throw new IllegalArgumentException("Input contains invokedynamic, unsupported by this d2j-jasmin version; desugar first (d8/retrolambda)");
} Try / catch
try {
new Jasmin(new FileReader(jasminFile)).parse();
} catch (RuntimeException e) {
if ("not support Yet!".equals(e.getMessage())) {
throw new UnsupportedInstructionException("invokedynamic is not implemented in d2j-jasmin; desugar the input or use smali/ASM", e);
}
throw e;
} Prevention
- Desugar Java 8+ lambdas/string concat (d8, desugar, retrolambda) before dumping to Jasmin
- Scan input .j files for the 'invokedynamic' opcode before running the assembler
- Prefer smali/baksmali or direct ASM ClassWriter for bytecode containing invokedynamic
- Track dex2jar updates — newer versions add invokedynamic support
When it happens
Trigger: Assembling a .j file (typically dumped from a modern dex/jar containing lambda factories or string concatenation via invokedynamic) that contains a line like 'invokedynamic <owner> <name> <desc> <callSiteName> <methodDesc>(args)' through the d2j-jasmin AsmV3 assembler.
Common situations: Running dex2jar/jasmin pipeline on code compiled for Java 8+ (lambdas, String.concat invokedynamic, method references) where baksmali or a dex dumper emitted invokedynamic instructions; old toolchain versions predating ASM invokedynamic support; converting obfuscated/reflect-heavy apps.
Understand the failure class
Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.
Related errors
- -cv,--class-version out of range, 1-18 is supported.
- Fail to assemble
- Not supported yet.
- can't pase string
- not support access flags " + name
AI-assisted analysis of pxb1988/dex2jar@b5bda4fb49 (2026-09-08).
Data as JSON: /api/errors/9405329194efda34.
Report an issue: GitHub.
Appendix: source
Thrown at d2j-jasmin/src/main/antlr3/com/googlecode/d2j/jasmin/Jasmin.g:1171
|WBYTE{mn.visitIntInsn(NEWARRAY,T_BYTE);}
|WSHORT{mn.visitIntInsn(NEWARRAY,T_SHORT);}
|WCHAR{mn.visitIntInsn(NEWARRAY,T_CHAR);}
|WINTEGER{mn.visitIntInsn(NEWARRAY,T_INT);}
|WLONG{mn.visitIntInsn(NEWARRAY,T_LONG);}
|WFLOAT{mn.visitIntInsn(NEWARRAY,T_FLOAT);}
|WDOUBLE{mn.visitIntInsn(NEWARRAY,T_DOUBLE);})
| a=XTYPE ffTV=sInternalNameOrDescACC {
line($a.line);
mn.visitTypeInsn(getOp($a.text),Type.getType($ffTV.desc).getInternalName());
}
| a=JOP z=sLabel { line($a.line); visitJOP(getOp($a.text),getLabel($z.text)); }
| a=XINVOKE e1=sMethodObject {line($a.line);
mn.visitMethodInsn(getOp($a.text),$e1.ownerInternalName,$e1.memberName,$e1.desc, false);
}
| a=INVOKEINTERFACE e2=sMethodObject INT? {line($a.line);
mn.visitMethodInsn(getOp($a.text),$e2.ownerInternalName,$e2.memberName,$e2.desc, true);
}
| a=INVOKEDYNAMIC e3=sMethodObject sId sMethodDesc '(' sInvokeDynamicE (',' sInvokeDynamicE)* ')' {line($a.line); if(1==1) throw new RuntimeException("not support Yet!");}
| a=MULTIANEWARRAY ff=sClassDesc c=INT {line($a.line); mn.visitMultiANewArrayInsn(unEscape($ff.text),parseInt($c.text)); }
| z=sLabel ':' { Label label=getLabel($z.text); mn.visitLabel(label); if(rebuildLine) {mn.visitLineNumber($z.start.getLine(),label);}
}
| '.catch' e=sId 'from' z1=sLabel 'to' z2=sLabel 'using' z3=sLabel { String type="all".equals($e.text)?null:unEscape($e.text); mn.visitTryCatchBlock(getLabel($z1.text),getLabel($z2.text),getLabel($z3.text),type); }
| '.limit' 'stack' ('?' { mn.maxStack=-1; } | i1=INT { mn.maxStack=parseInt($i1.text); })
| '.limit' 'locals' ('?' {mn.maxLocals=-1;}| i1=INT { mn.maxLocals=parseInt($i1.text);})
| '.code_attribute' sId STRING { System.err.println("ignore .code_attribute"); }
| '.line' b=INT { if(!rebuildLine) { Label label=new Label(); mn.visitLabel(label); mn.visitLineNumber(parseInt($b.text),label); } }
| '.var' var=INT 'is' mber=sMemberName desc=sClassDesc ('signature' sig=STRING)? 'from' z1=sLabel 'to' z2=sLabel { mn.visitLocalVariable($mber.name,unEscape($desc.text),unEscapeString($sig.text),getLabel($z1.text),getLabel($z2.text),parseInt($var.text)); }
| sSwitch
;
sInvokeDynamicE
: METHOD_DESC_WITHOUT_RET (INT|LONG|FLOAT|DOUBLE|STRING)
;
sMethodDesc
: METHOD_DESC_WITHOUT_RET (sClassDesc|VOID_TYPE)
;
sSwitch @init {List<Integer> keys=null;List<Label> labels=null;Label defaultLabel=null;}
View on GitHub (pinned to b5bda4fb49)