@Nonnull private DebugInfo getDebugInfo() { int debugOffset = dexFile.readInt(codeOffset + CodeItem.DEBUG_INFO_OFFSET); if (debugOffset == -1 || debugOffset == 0) { return DebugInfo.newOrEmpty(dexFile, 0, this); } if (debugOffset < 0) { System.err.println(String.format("%s: Invalid debug offset", method)); return DebugInfo.newOrEmpty(dexFile, 0, this); } if (debugOffset >= dexFile.buf.length) { System.err.println(String.format("%s: Invalid debug offset", method)); return DebugInfo.newOrEmpty(dexFile, 0, this); } return DebugInfo.newOrEmpty(dexFile, debugOffset, this); }
@Override public int getNarrowLiteral() { return dexFile.readInt(instructionStart + 2); } @Override public long getWideLiteral() { return getNarrowLiteral(); }
@Override public int getCodeOffset() { return dexFile.readInt(instructionStart + 2); } }
@Override public int getCodeOffset() { return dexFile.readInt(instructionStart + 2); } }
@Override public int getCodeOffset() { return dexFile.readInt(instructionStart + 2); } }
@Override public int getCodeOffset() { return dexFile.readInt(instructionStart + 2); } }
@Override public int getCodeOffset() { return dexFile.readInt(instructionStart + 2); } }
@Override public int getNarrowLiteral() { return dexFile.readInt(instructionStart + 2); } @Override public long getWideLiteral() { return getNarrowLiteral(); }
@Override public int getCodeOffset() { return dexFile.readInt(instructionStart + 2); } }
@Override public int getNarrowLiteral() { return dexFile.readInt(instructionStart + 2); } @Override public long getWideLiteral() { return getNarrowLiteral(); }
@Nonnull @Override public Number readItem(int index) { return dexFile.readInt(elementsStart + index*4); } };
@Nonnull @Override public Number readItem(int index) { return dexFile.readInt(elementsStart + index*4); } };
@Nonnull @Override public Number readItem(int index) { return dexFile.readInt(elementsStart + index*4); } };
@Nonnull @Override public List<? extends SwitchElement> getSwitchElements() { final int firstKey = dexFile.readInt(instructionStart + FIRST_KEY_OFFSET); return new FixedSizeList<SwitchElement>() { @Nonnull @Override public SwitchElement readItem(final int index) { return new SwitchElement() { @Override public int getKey() { return firstKey + index; } @Override public int getOffset() { return dexFile.readInt(instructionStart + TARGETS_OFFSET + index*4); } }; } @Override public int size() { return elementCount; } }; }
@Nonnull @Override public List<? extends SwitchElement> getSwitchElements() { final int firstKey = dexFile.readInt(instructionStart + FIRST_KEY_OFFSET); return new FixedSizeList<SwitchElement>() { @Nonnull @Override public SwitchElement readItem(final int index) { return new SwitchElement() { @Override public int getKey() { return firstKey + index; } @Override public int getOffset() { return dexFile.readInt(instructionStart + TARGETS_OFFSET + index*4); } }; } @Override public int size() { return elementCount; } }; }
@Nonnull @Override public List<? extends SwitchElement> getSwitchElements() { final int firstKey = dexFile.readInt(instructionStart + FIRST_KEY_OFFSET); return new FixedSizeList<SwitchElement>() { @Nonnull @Override public SwitchElement readItem(final int index) { return new SwitchElement() { @Override public int getKey() { return firstKey + index; } @Override public int getOffset() { return dexFile.readInt(instructionStart + TARGETS_OFFSET + index*4); } }; } @Override public int size() { return elementCount; } }; }
@Nonnull private DebugInfo getDebugInfo() { int debugOffset = dexFile.readInt(codeOffset + CodeItem.DEBUG_INFO_OFFSET); if (debugOffset == -1 || debugOffset == 0) { return DebugInfo.newOrEmpty(dexFile, 0, this); } if (debugOffset < 0) { System.err.println(String.format("%s: Invalid debug offset", method)); return DebugInfo.newOrEmpty(dexFile, 0, this); } if (debugOffset >= dexFile.buf.length) { System.err.println(String.format("%s: Invalid debug offset", method)); return DebugInfo.newOrEmpty(dexFile, 0, this); } return DebugInfo.newOrEmpty(dexFile, debugOffset, this); }
public static boolean verifyStringOffset(@Nonnull DexBackedDexFile dex) { final int strIdsStartOffset = dex.readSmallUint(HeaderItem.STRING_START_OFFSET); final int strStartOffset = dex.readInt(strIdsStartOffset); final int mapOffset = dex.readSmallUintPlusDataOffset(HeaderItem.MAP_OFFSET); final int mapSize = dex.readSmallUint(mapOffset); for (int i = 0; i < mapSize; i++) { final int mapItemOffset = mapOffset + 4 + i * MapItem.ITEM_SIZE; if (dex.readUshort(mapItemOffset) == org.jf.dexlib2.dexbacked.raw.ItemType.STRING_DATA_ITEM) { final int realStrStartOffset = dex.readSmallUint( mapItemOffset + MapItem.OFFSET_OFFSET); if (strStartOffset != realStrStartOffset) { return false; } break; } } return true; }