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

  1. Upgrade dex2jar to the latest release, where invokedynamic assembly support may have been added
  2. Preprocess the input so invokedynamic is desugared (e.g. use d8/dx --min-api with desugaring, or retrolambda) before dumping to Jasmin
  3. Assemble with a tool that fully supports invokedynamic, such as smali/baksmali or ASM's ClassWriter directly
  4. 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

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


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)