private void writeFields(@Nonnull DexDataWriter writer) throws IOException { fieldSectionOffset = writer.getPosition(); int index = 0; List<Map.Entry<? extends FieldRefKey, Integer>> fieldEntries = Lists.newArrayList(fieldSection.getItems()); Collections.sort(fieldEntries, DexWriter.<FieldRefKey>comparableKeyComparator()); for (Map.Entry<? extends FieldRefKey, Integer> entry: fieldEntries) { entry.setValue(index++); FieldRefKey key = entry.getKey(); writer.writeUshort(typeSection.getItemIndex(fieldSection.getDefiningClass(key))); writer.writeUshort(typeSection.getItemIndex(fieldSection.getFieldType(key))); writer.writeInt(stringSection.getItemIndex(fieldSection.getName(key))); } }
private void writeTypes(@Nonnull DexDataWriter writer) throws IOException { typeSectionOffset = writer.getPosition(); int index = 0; List<Map.Entry<? extends TypeKey, Integer>> typeEntries = Lists.newArrayList(typeSection.getItems()); Collections.sort(typeEntries, toStringKeyComparator); for (Map.Entry<? extends TypeKey, Integer> entry : typeEntries) { entry.setValue(index++); writer.writeInt(stringSection.getItemIndex(typeSection.getString(entry.getKey()))); } }
indexWriter.writeInt(typeSection.getItemIndex(classSection.getType(key))); indexWriter.writeInt(classSection.getAccessFlags(key)); indexWriter.writeInt(typeSection.getNullableItemIndex(classSection.getSuperclass(key))); indexWriter.writeInt(typeListSection.getNullableItemOffset(classSection.getInterfaces(key))); indexWriter.writeInt(stringSection.getNullableItemIndex(classSection.getSourceFile(key)));
@Nonnull public List<String> getTypeReferences() { List<String> classReferences = Lists.newArrayList(); for (Entry<? extends TypeKey, Integer> typeReference: typeSection.getItems()) { classReferences.add(typeReference.getKey().toString()); } return classReferences; }
public void writeStartLocal(int codeAddress, int register, @Nullable StringKey name, @Nullable TypeKey type, @Nullable StringKey signature) throws IOException { int nameIndex = stringSection.getNullableItemIndex(name); int typeIndex = typeSection.getNullableItemIndex(type); int signatureIndex = stringSection.getNullableItemIndex(signature); writeAdvancePC(codeAddress); if (signatureIndex == DexWriter.NO_INDEX) { writer.write(DebugItemType.START_LOCAL); writer.writeUleb128(register); writer.writeUleb128(nameIndex + 1); writer.writeUleb128(typeIndex + 1); } else { writer.write(DebugItemType.START_LOCAL_EXTENDED); writer.writeUleb128(register); writer.writeUleb128(nameIndex + 1); writer.writeUleb128(typeIndex + 1); writer.writeUleb128(signatureIndex + 1); } }
private int getDataSectionOffset() { return HeaderItem.ITEM_SIZE + stringSection.getItemCount() * StringIdItem.ITEM_SIZE + typeSection.getItemCount() * TypeIdItem.ITEM_SIZE + protoSection.getItemCount() * ProtoIdItem.ITEM_SIZE + fieldSection.getItemCount() * FieldIdItem.ITEM_SIZE + methodSection.getItemCount() * MethodIdItem.ITEM_SIZE + classSection.getItemCount() * ClassDefItem.ITEM_SIZE + callSiteSection.getItemCount() * CallSiteIdItem.ITEM_SIZE + methodHandleSection.getItemCount() * MethodHandleItem.ITEM_SIZE; }
numItems += 2; // index and data if (typeSection.getItems().size() > 0) { numItems++;
public void writeStartLocal(int codeAddress, int register, @Nullable StringKey name, @Nullable TypeKey type, @Nullable StringKey signature) throws IOException { int nameIndex = stringSection.getNullableItemIndex(name); int typeIndex = typeSection.getNullableItemIndex(type); int signatureIndex = stringSection.getNullableItemIndex(signature); writeAdvancePC(codeAddress); if (signatureIndex == DexWriter.NO_INDEX) { writer.write(DebugItemType.START_LOCAL); writer.writeUleb128(register); writer.writeUleb128(nameIndex + 1); writer.writeUleb128(typeIndex + 1); } else { writer.write(DebugItemType.START_LOCAL_EXTENDED); writer.writeUleb128(register); writer.writeUleb128(nameIndex + 1); writer.writeUleb128(typeIndex + 1); writer.writeUleb128(signatureIndex + 1); } }
private int getDataSectionOffset() { return HeaderItem.ITEM_SIZE + stringSection.getItemCount() * StringIdItem.ITEM_SIZE + typeSection.getItemCount() * TypeIdItem.ITEM_SIZE + protoSection.getItemCount() * ProtoIdItem.ITEM_SIZE + fieldSection.getItemCount() * FieldIdItem.ITEM_SIZE + methodSection.getItemCount() * MethodIdItem.ITEM_SIZE + classSection.getItemCount() * ClassDefItem.ITEM_SIZE + callSiteSection.getItemCount() * CallSiteIdItem.ITEM_SIZE + methodHandleSection.getItemCount() * MethodHandleItem.ITEM_SIZE; }
private void writeTypeLists(@Nonnull DexDataWriter writer) throws IOException { writer.align(); typeListSectionOffset = writer.getPosition(); for (Map.Entry<? extends TypeListKey, Integer> entry: typeListSection.getItems()) { writer.align(); entry.setValue(writer.getPosition()); Collection<? extends TypeKey> types = typeListSection.getTypes(entry.getKey()); writer.writeInt(types.size()); for (TypeKey typeKey: types) { writer.writeUshort(typeSection.getItemIndex(typeKey)); } } }
private void writeTypes(@Nonnull DexDataWriter writer) throws IOException { typeSectionOffset = writer.getPosition(); int index = 0; List<Map.Entry<? extends TypeKey, Integer>> typeEntries = Lists.newArrayList(typeSection.getItems()); Collections.sort(typeEntries, toStringKeyComparator); for (Map.Entry<? extends TypeKey, Integer> entry : typeEntries) { entry.setValue(index++); writer.writeInt(stringSection.getItemIndex(typeSection.getString(entry.getKey()))); } }
private void writeHeader(@Nonnull DexDataWriter writer, int dataOffset, int fileSize) throws IOException { // Write the appropriate header. writer.write(HeaderItem.getMagicForApi(opcodes.api)); // checksum placeholder writer.writeInt(0); // signature placeholder writer.write(new byte[20]); writer.writeInt(fileSize); writer.writeInt(HeaderItem.ITEM_SIZE); writer.writeInt(HeaderItem.LITTLE_ENDIAN_TAG); // link writer.writeInt(0); writer.writeInt(0); // map writer.writeInt(mapSectionOffset); // index sections writeSectionInfo(writer, stringSection.getItems().size(), stringIndexSectionOffset); writeSectionInfo(writer, typeSection.getItems().size(), typeSectionOffset); writeSectionInfo(writer, protoSection.getItems().size(), protoSectionOffset); writeSectionInfo(writer, fieldSection.getItems().size(), fieldSectionOffset); writeSectionInfo(writer, methodSection.getItems().size(), methodSectionOffset); writeSectionInfo(writer, classSection.getItems().size(), classIndexSectionOffset); // data section writer.writeInt(fileSize - dataOffset); writer.writeInt(dataOffset); }
indexWriter.writeInt(typeSection.getItemIndex(classSection.getType(key))); indexWriter.writeInt(classSection.getAccessFlags(key)); indexWriter.writeInt(typeSection.getNullableItemIndex(classSection.getSuperclass(key))); indexWriter.writeInt(typeListSection.getNullableItemOffset(classSection.getSortedInterfaces(key))); indexWriter.writeInt(stringSection.getNullableItemIndex(classSection.getSourceFile(key)));
public void writeStartLocal(int codeAddress, int register, @Nullable StringKey name, @Nullable TypeKey type, @Nullable StringKey signature) throws IOException { int nameIndex = stringSection.getNullableItemIndex(name); int typeIndex = typeSection.getNullableItemIndex(type); int signatureIndex = stringSection.getNullableItemIndex(signature); writeAdvancePC(codeAddress); if (signatureIndex == DexWriter.NO_INDEX) { writer.write(DebugItemType.START_LOCAL); writer.writeUleb128(register); writer.writeUleb128(nameIndex + 1); writer.writeUleb128(typeIndex + 1); } else { writer.write(DebugItemType.START_LOCAL_EXTENDED); writer.writeUleb128(register); writer.writeUleb128(nameIndex + 1); writer.writeUleb128(typeIndex + 1); writer.writeUleb128(signatureIndex + 1); } }
private void writeProtos(@Nonnull DexDataWriter writer) throws IOException { protoSectionOffset = writer.getPosition(); int index = 0; List<Map.Entry<? extends ProtoRefKey, Integer>> protoEntries = Lists.newArrayList(protoSection.getItems()); Collections.sort(protoEntries, DexWriter.<ProtoRefKey>comparableKeyComparator()); for (Map.Entry<? extends ProtoRefKey, Integer> entry: protoEntries) { entry.setValue(index++); ProtoRefKey key = entry.getKey(); writer.writeInt(stringSection.getItemIndex(protoSection.getShorty(key))); writer.writeInt(typeSection.getItemIndex(protoSection.getReturnType(key))); writer.writeInt(typeListSection.getNullableItemOffset(protoSection.getParameters(key))); } }
private void writeTypes(@Nonnull DexDataWriter writer) throws IOException { typeSectionOffset = writer.getPosition(); int index = 0; List<Map.Entry<? extends TypeKey, Integer>> typeEntries = Lists.newArrayList(typeSection.getItems()); Collections.sort(typeEntries, toStringKeyComparator); for (Map.Entry<? extends TypeKey, Integer> entry : typeEntries) { entry.setValue(index++); writer.writeInt(stringSection.getItemIndex(typeSection.getString(entry.getKey()))); } }
writeMapItem(writer, ItemType.TYPE_ID_ITEM, typeSection.getItems().size(), typeSectionOffset); writeMapItem(writer, ItemType.PROTO_ID_ITEM, protoSection.getItems().size(), protoSectionOffset); writeMapItem(writer, ItemType.FIELD_ID_ITEM, fieldSection.getItems().size(), fieldSectionOffset);
indexWriter.writeInt(typeSection.getItemIndex(classSection.getType(key))); indexWriter.writeInt(classSection.getAccessFlags(key)); indexWriter.writeInt(typeSection.getNullableItemIndex(classSection.getSuperclass(key))); indexWriter.writeInt(typeListSection.getNullableItemOffset(classSection.getInterfaces(key))); indexWriter.writeInt(stringSection.getNullableItemIndex(classSection.getSourceFile(key)));
private void writeMethods(@Nonnull DexDataWriter writer) throws IOException { methodSectionOffset = writer.getPosition(); int index = 0; List<Map.Entry<? extends MethodRefKey, Integer>> methodEntries = Lists.newArrayList(methodSection.getItems()); Collections.sort(methodEntries, DexWriter.<MethodRefKey>comparableKeyComparator()); for (Map.Entry<? extends MethodRefKey, Integer> entry: methodEntries) { entry.setValue(index++); MethodRefKey key = entry.getKey(); writer.writeUshort(typeSection.getItemIndex(methodSection.getDefiningClass(key))); writer.writeUshort(protoSection.getItemIndex(methodSection.getPrototype(key))); writer.writeInt(stringSection.getItemIndex(methodSection.getName(key))); } }
@Nonnull public List<String> getTypeReferences() { List<String> classReferences = Lists.newArrayList(); for (Entry<? extends TypeKey, Integer> typeReference: typeSection.getItems()) { classReferences.add(typeReference.getKey().toString()); } return classReferences; }