/** * Calculate and return the private size of a method proto. * * Calculated as: shorty_idx + return_type_idx + parameters_off + type_list size * * @return size in bytes */ public int getSize() { int size = ProtoIdItem.ITEM_SIZE; //3 * uint List<String> parameters = getParameterTypes(); if (!parameters.isEmpty()) { size += 4 + parameters.size() * 2; //uint + size * ushort for type_idxs } return size; } }
@Override public Reference getReference2() { return DexBackedReference.makeReference(dexFile, opcode.referenceType2, dexFile.readUshort(instructionStart + 6)); }
@Override public DexBackedFieldReference get(int index) { if (index < 0 || index >= getFieldCount()) { throw new IndexOutOfBoundsException(); } return new DexBackedFieldReference(DexBackedDexFile.this, index); }
public static Reference makeReference(@Nonnull DexBackedDexFile dexFile, int referenceType, int referenceIndex) { switch (referenceType) { case ReferenceType.STRING: return new DexBackedStringReference(dexFile, referenceIndex); case ReferenceType.TYPE: return new DexBackedTypeReference(dexFile, referenceIndex); case ReferenceType.METHOD: return new DexBackedMethodReference(dexFile, referenceIndex); case ReferenceType.FIELD: return new DexBackedFieldReference(dexFile, referenceIndex); case ReferenceType.METHOD_PROTO: return new DexBackedMethodProtoReference(dexFile, referenceIndex); case ReferenceType.METHOD_HANDLE: return new DexBackedMethodHandleReference(dexFile, referenceIndex); case ReferenceType.CALL_SITE: return new DexBackedCallSiteReference(dexFile, referenceIndex); default: throw new ExceptionWithContext("Invalid reference type: %d", referenceType); } } }
public static Reference makeReference(@Nonnull DexBackedDexFile dexFile, int referenceType, int referenceIndex) { switch (referenceType) { case ReferenceType.STRING: return new DexBackedStringReference(dexFile, referenceIndex); case ReferenceType.TYPE: return new DexBackedTypeReference(dexFile, referenceIndex); case ReferenceType.METHOD: return new DexBackedMethodReference(dexFile, referenceIndex); case ReferenceType.FIELD: return new DexBackedFieldReference(dexFile, referenceIndex); default: throw new ExceptionWithContext("Invalid reference type: %d", referenceType); } } }
/** * 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; } }
@Nonnull @Override public String getReturnType() { int protoIdItemOffset = getProtoIdItemOffset(); return dexFile.getType(dexFile.readSmallUint(protoIdItemOffset + ProtoIdItem.RETURN_TYPE_OFFSET)); }
@Override public DexBackedStringReference get(int index) { if (index < 0 || index >= getStringCount()) { throw new IndexOutOfBoundsException(); } return new DexBackedStringReference(DexBackedDexFile.this, index); }
@Override public DexBackedTypeReference get(int index) { if (index < 0 || index >= getTypeCount()) { throw new IndexOutOfBoundsException(); } return new DexBackedTypeReference(DexBackedDexFile.this, index); }
@Override public DexBackedMethodReference get(int index) { if (index < 0 || index >= getMethodCount()) { throw new IndexOutOfBoundsException(); } return new DexBackedMethodReference(DexBackedDexFile.this, index); }
@Nonnull @Override public MethodHandleReference getValue() { return new DexBackedMethodHandleReference(dexFile, methodHandleIndex); } }
@Nonnull @Override public MethodProtoReference getValue() { return new DexBackedMethodProtoReference(dexFile, methodProtoIndex); } }
public static Reference makeReference(@Nonnull DexBackedDexFile dexFile, int referenceType, int referenceIndex) { switch (referenceType) { case ReferenceType.STRING: return new DexBackedStringReference(dexFile, referenceIndex); case ReferenceType.TYPE: return new DexBackedTypeReference(dexFile, referenceIndex); case ReferenceType.METHOD: return new DexBackedMethodReference(dexFile, referenceIndex); case ReferenceType.FIELD: return new DexBackedFieldReference(dexFile, referenceIndex); case ReferenceType.METHOD_PROTO: return new DexBackedMethodProtoReference(dexFile, referenceIndex); case ReferenceType.METHOD_HANDLE: return new DexBackedMethodHandleReference(dexFile, referenceIndex); case ReferenceType.CALL_SITE: return new DexBackedCallSiteReference(dexFile, referenceIndex); default: throw new ExceptionWithContext("Invalid reference type: %d", referenceType); } } }
@Override public Reference getReference2() { return DexBackedReference.makeReference(dexFile, opcode.referenceType2, dexFile.readUshort(instructionStart + 6)); }
@Nonnull @Override public FieldReference getValue() { return new DexBackedFieldReference(dexFile, fieldIndex); } }
@Nonnull @Override public List<String> getParameterTypes() { int protoIdItemOffset = getProtoIdItemOffset(); final int parametersOffset = dexFile.readSmallUint(protoIdItemOffset + ProtoIdItem.PARAMETERS_OFFSET); if (parametersOffset > 0) { final int parameterCount = dexFile.readSmallUint(parametersOffset + TypeListItem.SIZE_OFFSET); final int paramListStart = parametersOffset + TypeListItem.LIST_OFFSET; return new FixedSizeList<String>() { @Nonnull @Override public String readItem(final int index) { return dexFile.getType(dexFile.readUshort(paramListStart + 2*index)); } @Override public int size() { return parameterCount; } }; } return ImmutableList.of(); }
@Nonnull @Override public Reference getReference() { return DexBackedReference.makeReference(dexFile, opcode.referenceType, dexFile.readUshort(instructionStart + 2)); }
@Nonnull @Override public Reference getReference() { return DexBackedReference.makeReference(dexFile, opcode.referenceType, dexFile.readUshort(instructionStart + 2)); }
@Override public Reference getReference2() { return DexBackedReference.makeReference(dexFile, opcode.referenceType2, dexFile.readUshort(instructionStart + 6)); }
@Override public Reference getReference2() { return DexBackedReference.makeReference(dexFile, opcode.referenceType2, dexFile.readUshort(instructionStart + 6)); }