private int getDirectMethodsOffset() { if (directMethodsOffset > 0) { return directMethodsOffset; } DexReader reader = dexFile.readerAt(getInstanceFieldsOffset()); DexBackedField.skipFields(reader, instanceFieldCount); directMethodsOffset = reader.getOffset(); return directMethodsOffset; }
private int getVirtualMethodsOffset() { if (virtualMethodsOffset > 0) { return virtualMethodsOffset; } DexReader reader = dexFile.readerAt(getDirectMethodsOffset()); DexBackedMethod.skipMethods(reader, directMethodCount); virtualMethodsOffset = reader.getOffset(); return virtualMethodsOffset; }
@Nonnull public String getString(int stringIndex) { int stringOffset = getStringIdItemOffset(stringIndex); int stringDataOffset = readSmallUint(stringOffset); DexReader reader = readerAt(stringDataOffset); int utf16Length = reader.readSmallUleb128(); return reader.readString(utf16Length); }
@Nonnull public Iterable<? extends DexBackedMethod> getDirectMethods(final boolean skipDuplicates) { if (directMethodCount > 0) { DexReader reader = dexFile.readerAt(getDirectMethodsOffset());
@Nonnull public Iterable<? extends DexBackedField> getInstanceFields(final boolean skipDuplicates) { if (instanceFieldCount > 0) { DexReader reader = dexFile.readerAt(getInstanceFieldsOffset());
@Nonnull public Iterable<? extends DexBackedField> getStaticFields(final boolean skipDuplicates) { if (staticFieldCount > 0) { DexReader reader = dexFile.readerAt(staticFieldsOffset);
@Nonnull public Iterable<? extends DexBackedMethod> getVirtualMethods(final boolean skipDuplicates) { if (virtualMethodCount > 0) { DexReader reader = dexFile.readerAt(getVirtualMethodsOffset());
public DexBackedClassDef(@Nonnull DexBackedDexFile dexFile, int classDefOffset) { this.dexFile = dexFile; this.classDefOffset = classDefOffset; int classDataOffset = dexFile.readSmallUint(classDefOffset + ClassDefItem.CLASS_DATA_OFFSET); if (classDataOffset == 0) { staticFieldsOffset = -1; staticFieldCount = 0; instanceFieldCount = 0; directMethodCount = 0; virtualMethodCount = 0; } else { DexReader reader = dexFile.readerAt(classDataOffset); staticFieldCount = reader.readSmallUleb128(); instanceFieldCount = reader.readSmallUleb128(); directMethodCount = reader.readSmallUleb128(); virtualMethodCount = reader.readSmallUleb128(); staticFieldsOffset = reader.getOffset(); } }
/** * Calculate and return the private size of a string reference. * * Calculated as: string_data_off + string_data_item size * * @return size in bytes */ public int getSize() { int size = StringIdItem.ITEM_SIZE; //uint for string_data_off //add the string data length: int stringOffset = dexFile.getStringIdItemOffset(stringIndex); int stringDataOffset = dexFile.readSmallUint(stringOffset); DexReader reader = dexFile.readerAt(stringDataOffset); size += reader.peekSmallUleb128Size(); int utf16Length = reader.readSmallUleb128(); //and string data itself: size += reader.peekStringLength(utf16Length); return size; } }
/** * Calculate and return the private size of a method definition. * * Calculated as: method_idx_diff + access_flags + code_off + * implementation size + reference size * * @return size in bytes */ public int getSize() { int size = 0; DexReader reader = dexFile.readerAt(startOffset); reader.readLargeUleb128(); //method_idx_diff reader.readSmallUleb128(); //access_flags reader.readSmallUleb128(); //code_off size += reader.getOffset() - startOffset; DexBackedMethodImplementation impl = getImplementation(); if (impl != null) { size += impl.getSize(); } DexBackedMethodReference methodRef = new DexBackedMethodReference(dexFile, methodIndex); size += methodRef.getSize(); return size; } }
protected VariableSizeListIterator(@Nonnull DexBackedDexFile dexFile, int offset, int size) { this.reader = dexFile.readerAt(offset); this.startOffset = offset; this.size = size; }
protected VariableSizeListIterator(@Nonnull DexBackedDexFile dexFile, int offset, int size) { this.reader = dexFile.readerAt(offset); this.startOffset = offset; this.size = size; }
protected VariableSizeIterator(@Nonnull DexBackedDexFile dexFile, int offset, int size) { this.reader = dexFile.readerAt(offset); this.size = size; }
public EncodedArrayItemIteratorImpl(@Nonnull DexBackedDexFile dexFile, int offset) { this.reader = dexFile.readerAt(offset); this.size = reader.readSmallUleb128(); }
public static String getReferenceAnnotation(@Nonnull DexBackedDexFile dexFile, int annotationItemOffset) { try { DexReader reader = dexFile.readerAt(annotationItemOffset); reader.readUbyte(); int typeIndex = reader.readSmallUleb128(); String annotationType = dexFile.getType(typeIndex); return String.format("annotation_item[0x%x]: %s", annotationItemOffset, annotationType); } catch (Exception ex) { ex.printStackTrace(System.err); } return String.format("annotation_item[0x%x]", annotationItemOffset); } }
public DexBackedAnnotation(@Nonnull DexBackedDexFile dexFile, int annotationOffset) { this.dexFile = dexFile; DexReader reader = dexFile.readerAt(annotationOffset); this.visibility = reader.readUbyte(); this.typeIndex = reader.readSmallUleb128(); this.elementsOffset = reader.getOffset(); }
public DexBackedAnnotation(@Nonnull DexBackedDexFile dexFile, int annotationOffset) { this.dexFile = dexFile; DexReader reader = dexFile.readerAt(annotationOffset); this.visibility = reader.readUbyte(); this.typeIndex = reader.readSmallUleb128(); this.elementsOffset = reader.getOffset(); }
private int getVirtualMethodsOffset() { if (virtualMethodsOffset > 0) { return virtualMethodsOffset; } DexReader reader = dexFile.readerAt(getDirectMethodsOffset()); DexBackedMethod.skipMethods(reader, directMethodCount); virtualMethodsOffset = reader.getOffset(); return virtualMethodsOffset; }
private int getVirtualMethodsOffset() { if (virtualMethodsOffset > 0) { return virtualMethodsOffset; } DexReader reader = dexFile.readerAt(getDirectMethodsOffset()); DexBackedMethod.skipMethods(reader, directMethodCount); virtualMethodsOffset = reader.getOffset(); return virtualMethodsOffset; } }