public BinaryXMLParser(RootNode root) { try { try { Class<?> rStyleCls = Class.forName(ANDROID_R_STYLE_CLS); for (Field f : rStyleCls.getFields()) { styleMap.put(f.getInt(f.getType()), f.getName()); } } catch (Throwable th) { LOG.error("R class loading failed", th); } // add application constants for (DexNode dexNode : root.getDexNodes()) { for (Map.Entry<Object, FieldNode> entry : dexNode.getConstFields().entrySet()) { Object key = entry.getKey(); FieldNode field = entry.getValue(); if (field.getType().equals(ArgType.INT) && key instanceof Integer) { localStyleMap.put((Integer) key, field); } } } resNames = root.getResourcesNames(); attributes = new ManifestAttributes(); attributes.parse(); } catch (Exception e) { throw new JadxRuntimeException("BinaryXMLParser init error", e); } }
public DebugInfoParser(MethodNode mth, int debugOffset, InsnNode[] insnByOffset) { this.mth = mth; this.dex = mth.dex(); this.section = dex.openSection(debugOffset); int regsCount = mth.getRegsCount(); this.locals = new LocalVar[regsCount]; this.activeRegisters = new InsnArg[regsCount]; this.insnByOffset = insnByOffset; }
public void process() throws DecodeException { int addr = 0; int line = section.readUleb128(); int paramsCount = section.readUleb128(); List<RegisterArg> mthArgs = mth.getArguments(false); assert paramsCount == mthArgs.size(); for (int i = 0; i < paramsCount; i++) { int id = section.readUleb128() - 1; if (id != DexNode.NO_INDEX) { String name = dex.getString(id); mthArgs.get(i).setName(name); } } for (RegisterArg arg : mthArgs) { int rn = arg.getRegNum(); locals[rn] = new LocalVar(arg); activeRegisters[rn] = arg; } // process '0' instruction addrChange(-1, 1, line); setLine(addr, line); int c = section.readByte() & 0xFF; while (c != DBG_END_SEQUENCE) { switch (c) { case DBG_ADVANCE_PC: { int addrInc = section.readUleb128(); addr = addrChange(addr, addrInc, line); setLine(addr, line); break; } case DBG_ADVANCE_LINE: { line += section.readSleb128(); break; } case DBG_START_LOCAL: { int regNum = section.readUleb128(); int nameId = section.readUleb128() - 1; int type = section.readUleb128() - 1; LocalVar var = new LocalVar(dex, regNum, nameId, type, DexNode.NO_INDEX); startVar(var, addr, line); break; } case DBG_START_LOCAL_EXTENDED: { int regNum = section.readUleb128(); int nameId = section.readUleb128() - 1; int type = section.readUleb128() - 1; int sign = section.readUleb128() - 1; LocalVar var = new LocalVar(dex, regNum, nameId, type, sign); startVar(var, addr, line); break; } case DBG_RESTART_LOCAL: { int regNum = section.readUleb128(); LocalVar var = locals[regNum]; if (var != null) { var.end(addr, line); setVar(var); var.start(addr, line); } break; } case DBG_END_LOCAL: { int regNum = section.readUleb128(); LocalVar var = locals[regNum]; if (var != null) { var.end(addr, line); setVar(var); } break; } case DBG_SET_PROLOGUE_END: case DBG_SET_EPILOGUE_BEGIN: // do nothing break; case DBG_SET_FILE: { int idx = section.readUleb128() - 1; if (idx != DexNode.NO_INDEX) { String sourceFile = dex.getString(idx); mth.addAttr(new SourceFileAttr(sourceFile)); } break; } default: { if (c >= DBG_FIRST_SPECIAL) { int adjustedOpcode = c - DBG_FIRST_SPECIAL; int addrInc = adjustedOpcode / DBG_LINE_RANGE; addr = addrChange(addr, addrInc, line); line += DBG_LINE_BASE + (adjustedOpcode % DBG_LINE_RANGE); setLine(addr, line); } else { throw new DecodeException("Unknown debug insn code: " + c); } break; } } c = section.readByte() & 0xFF; } for (LocalVar var : locals) { if (var != null && !var.isEnd()) { var.end(addr, line); setVar(var); } } setSourceLines(addr, insnByOffset.length, line); }