This package contains types used to publicly access and manipulate JEB's DEX Decompiler (referred
to as dexdec) Intermediate Representation (IR) objects. Users can use this API to write
custom IR optimizers, that will be run by dexdec when decompiling code. Interfaces and
classes/enums in this package start with ID... or D..., respectively -- for
"(Interface) dexdec" (or dex/dalvik)). Exception classes are named
DexDec...Exception.
Design note: Note the symmetry with JEB's Generic Decompiler (gendec) naming
conventions, whose public interfaces and types start with IE... or E.... That
symmetry does not extend to naming only: dexdec IR type structure closely mirror,
whenever possible, gendec's.
dexdec IR optimizer plugins may be written in Python or Java.
A sample skeleton plugin, in Python:
#?type=dexdec-ir
from com.pnfsoftware.jeb.core.units.code.android.ir import AbstractDOptimizer
class DOptSamplePython(AbstractDOptimizer):
def perform(self):
# do not perform optimizations, simply print out each IR instruction of the current IR CFG
for blk in self.cfg: # BasicBlock (of IDInstruction)
for insn in blk: # IDInstruction
logger.info("%04X: %s" % (insn.getOffset(), insn))
# no optimization performed
return 0
The same sample plugin, in Java:
//?type=dexdec-ir
import com.pnfsoftware.jeb.core.units.code.android.controlflow.BasicBlock;
import com.pnfsoftware.jeb.core.units.code.android.ir.AbstractDOptimizer;
import com.pnfsoftware.jeb.core.units.code.android.ir.IDInstruction;
public class DOptSampleJava extends AbstractDOptimizer {
// note: implicit no-arg constructor is calling super()
@Override
public int perform() {
// do not perform optimizations, simply print out each IR instruction of the current IR CFG
for(BasicBlock<IDInstruction> b: cfg) {
for(IDInstruction insn: b) {
logger.info("%04X: %s", insn.getOffset(), insn);
}
}
// no optimization performed
return 0;
}
}
Refer to the sub-directory coreplugins/, located in the JEB installation folder, for
examples.