dexFile = new DexFile(file, false, true); } catch (DexFile.NoClassesDexException ex) { continue;
out.write(new byte[20]); out.annotate("file_size: 0x" + Integer.toHexString(dexFile.getFileSize()) + " (" + dexFile.getFileSize() + " bytes)"); out.writeInt(dexFile.getFileSize()); out.writeInt(dexFile.ClassDefsSection.getOffset()); out.annotate("data_size: 0x" + Integer.toHexString(dexFile.getDataSize()) + " (" + dexFile.getDataSize() + " bytes)"); out.writeInt(dexFile.getDataSize()); out.annotate("data_off: 0x" + Integer.toHexString(dexFile.getDataOffset())); out.writeInt(dexFile.getDataOffset());
public int placeAt(int offset) { if (DexFile.this.getInplace()) { return super.placeAt(offset); } int ret = ClassDefItem.placeClassDefItems(this, offset); Collections.sort(this.items, new Comparator<ClassDefItem>() { public int compare(ClassDefItem a, ClassDefItem b) { return a.getOffset() - b.getOffset(); } }); this.offset = items.get(0).getOffset(); return ret; } };
String dexFilePath, DexFile dexFile, ClassPathErrorHandler errorHandler) { if (!dexFile.isOdex()) { throw new ExceptionWithContext("Cannot use InitialiazeClassPathFromOdex with a non-odex DexFile"); OdexDependencies odexDependencies = dexFile.getOdexDependencies();
@Override public void ProcessStartLocal(int startDebugOffset, int length, int registerNum, int nameIndex, int typeIndex, boolean registerIsSigned) { this.length++; if (dexFile.getPreserveSignedRegisters() && registerIsSigned) { this.length += Leb128Utils.signedLeb128Size(registerNum); } else { this.length+=Leb128Utils.unsignedLeb128Size(registerNum); } if (nameIndex != -1) { this.length+= Leb128Utils.unsignedLeb128Size(referencedItems[referencedItemsPosition++].getIndex()+1); } else { this.length++; } if (typeIndex != -1) { this.length+= Leb128Utils.unsignedLeb128Size(referencedItems[referencedItemsPosition++].getIndex()+1); } else { this.length++; } }
/** {@inheritDoc} */ protected int placeItem(int offset) { Section[] sections = dexFile.getOrderedSections(); //the list returned by getOrderedSections doesn't contain the header //or map section, so add 2 to the length return offset + 4 + (sections.length + 2) * 12; }
public DeodexUtil(DexFile dexFile) { this.dexFile = dexFile; OdexHeader odexHeader = dexFile.getOdexHeader(); if (odexHeader == null) { //if there isn't an odex header, why are we creating an DeodexUtil object? assert false; throw new RuntimeException("Cannot create a DeodexUtil object for a dex file without an odex header"); } inlineMethodResolver = InlineMethodResolver.createInlineMethodResolver(this, odexHeader.version); }
public int placeSection(int offset) { currentOffset = offset; if (section.DexFile.getSortAllItems()) { //presort the list, to guarantee a unique ordering Collections.sort(section.items, new Comparator<ClassDefItem>() { public int compare(ClassDefItem a, ClassDefItem b) { return a.getClassType().compareTo(b.getClassType()); } }); } //we need to initialize the offset for all the classes to -1, so we can tell which ones //have been placed for (ClassDefItem classDefItem: section.items) { classDefItem.offset = -1; } for (ClassDefItem classDefItem: section.items) { placeClass(classDefItem); } for (ClassDefItem classDefItem: unplacedClassDefsByType.values()) { section.items.set(classDefItem.getIndex(), classDefItem); } return currentOffset; }
@Override public void ProcessStartLocalExtended(int startDebugOffset, int length, int registerNum, int nameIndex, int typeIndex, int signatureIndex, boolean registerIsSigned) { this.length++; if (dexFile.getPreserveSignedRegisters() && registerIsSigned) { this.length += Leb128Utils.signedLeb128Size(registerNum); } else { this.length+=Leb128Utils.unsignedLeb128Size(registerNum); } if (nameIndex != -1) { this.length+= Leb128Utils.unsignedLeb128Size(referencedItems[referencedItemsPosition++].getIndex()+1); } else { this.length++; } if (typeIndex != -1) { this.length+= Leb128Utils.unsignedLeb128Size(referencedItems[referencedItemsPosition++].getIndex()+1); } else { this.length++; } if (signatureIndex != -1) { this.length+= Leb128Utils.unsignedLeb128Size(referencedItems[referencedItemsPosition++].getIndex()+1); } else { this.length++; } }
Section[] sections; if (this.inplace) { sections = this.getOrderedSections(); } else { sections = new Section[indexedSections.length + offsettedSections.length];
if (!dexFile.isOdex()) { throw new ExceptionWithContext("Cannot use InitialiazeClassPathFromOdex with a non-odex DexFile"); OdexDependencies odexDependencies = dexFile.getOdexDependencies();
public DeodexUtil(DexFile dexFile) { this.dexFile = dexFile; OdexHeader odexHeader = dexFile.getOdexHeader(); if (odexHeader == null) { //if there isn't an odex header, why are we creating an DeodexUtil object? assert false; throw new RuntimeException("Cannot create a DeodexUtil object for a dex file without an odex header"); } inlineMethodResolver = InlineMethodResolver.createInlineMethodResolver(this, odexHeader.version); }
public int placeSection(int offset) { currentOffset = offset; if (section.DexFile.getSortAllItems()) { //presort the list, to guarantee a unique ordering Collections.sort(section.items, new Comparator<ClassDefItem>() { public int compare(ClassDefItem a, ClassDefItem b) { return a.getClassType().compareTo(b.getClassType()); } }); } //we need to initialize the offset for all the classes to -1, so we can tell which ones //have been placed for (ClassDefItem classDefItem: section.items) { classDefItem.offset = -1; } for (ClassDefItem classDefItem: section.items) { placeClass(classDefItem); } for (ClassDefItem classDefItem: unplacedClassDefsByType.values()) { section.items.set(classDefItem.getIndex(), classDefItem); } return currentOffset; }
out.write(new byte[20]); out.annotate("file_size: 0x" + Integer.toHexString(dexFile.getFileSize()) + " (" + dexFile.getFileSize() + " bytes)"); out.writeInt(dexFile.getFileSize()); out.writeInt(dexFile.ClassDefsSection.getOffset()); out.annotate("data_size: 0x" + Integer.toHexString(dexFile.getDataSize()) + " (" + dexFile.getDataSize() + " bytes)"); out.writeInt(dexFile.getDataSize()); out.annotate("data_off: 0x" + Integer.toHexString(dexFile.getDataOffset())); out.writeInt(dexFile.getDataOffset());
@Override public void ProcessStartLocal(int startDebugOffset, int length, int registerNum, int nameIndex, int typeIndex, boolean registerIsSigned) { out.writeByte(DebugOpcode.DBG_START_LOCAL.value); if (dexFile.getPreserveSignedRegisters() && registerIsSigned) { out.writeSignedLeb128(registerNum); } else { out.writeUnsignedLeb128(registerNum); } if (nameIndex != -1) { out.writeUnsignedLeb128(referencedItems[referencedItemsPosition++].getIndex() + 1); } else { out.writeByte(0); } if (typeIndex != -1) { out.writeUnsignedLeb128(referencedItems[referencedItemsPosition++].getIndex() + 1); } else { out.writeByte(0); } }
/** * Finalize the location of all items, and place them starting at the given offset * @param offset The offset where this section should be placed * @return the offset of the byte immediate after the last item in this section */ protected int placeAt(int offset) { if (items.size() > 0) { offset = AlignmentUtils.alignOffset(offset, ItemType.ItemAlignment); assert !DexFile.getInplace() || offset == this.offset; this.offset = offset; for (int i=0; i < items.size(); i++) { T item = items.get(i); assert item != null; offset = AlignmentUtils.alignOffset(offset, ItemType.ItemAlignment); offset = item.placeAt(offset, i); } } else { this.offset = 0; } return offset; }
/** {@inheritDoc} */ protected void writeItem(AnnotatedOutput out) { assert getOffset() > 0; Section[] sections = dexFile.getOrderedSections(); out.annotate("map_size: 0x" + Integer.toHexString(sections.length + 2) + " (" + Integer.toString(sections.length + 2) + ")"); out.writeInt(sections.length + 2); int index = 0; out.annotate(0, "[" + index++ + "]"); out.indent(); writeSectionInfo(out, ItemType.TYPE_HEADER_ITEM, 1, 0); out.deindent(); for (Section section: dexFile.getOrderedSections()) { out.annotate(0, "[" + index++ + "]"); out.indent(); writeSectionInfo(out, section.ItemType, section.getItems().size(), section.getOffset()); out.deindent(); } out.annotate(0, "[" + index++ + "]"); out.indent(); writeSectionInfo(out, ItemType.TYPE_MAP_LIST, 1, dexFile.MapItem.getOffset()); out.deindent(); }
@Nullable @Override public DexFile apply(File f) { try { return new DexFile(f); } catch (IOException e) { return null; } } };
@Override public void ProcessStartLocalExtended(int startDebugOffset, int length, int registerNum, int nameIndex, int typeIndex, int signatureIndex, boolean registerIsSigned) { out.writeByte(DebugOpcode.DBG_START_LOCAL_EXTENDED.value); if (dexFile.getPreserveSignedRegisters() && registerIsSigned) { out.writeSignedLeb128(registerNum); } else { out.writeUnsignedLeb128(registerNum); } if (nameIndex != -1) { out.writeUnsignedLeb128(referencedItems[referencedItemsPosition++].getIndex() + 1); } else { out.writeByte(0); } if (typeIndex != -1) { out.writeUnsignedLeb128(referencedItems[referencedItemsPosition++].getIndex() + 1); } else { out.writeByte(0); } if (signatureIndex != -1) { out.writeUnsignedLeb128(referencedItems[referencedItemsPosition++].getIndex() + 1); } else { out.writeByte(0); } }
List<StaticFieldInitializer> staticFieldInitializers) { EncodedArrayItem encodedArrayItem = null; if(!dexFile.getInplace() && staticFieldInitializers != null && staticFieldInitializers.size() > 0) { assert classData != null; assert staticFieldInitializers.size() == classData.getStaticFields().length;