this.clsInfo = ClassInfo.fromDex(dex, cls.getTypeIndex()); try { if (cls.getSupertypeIndex() == DexNode.NO_INDEX) { this.superClass = null; } else { this.superClass = dex.getType(cls.getSupertypeIndex());
if (classDef.getSupertypeIndex() == ClassDef.NO_INDEX) { max = 0; // this is Object.class or an interface } else { SortableType sortableSupertype = types[classDef.getSupertypeIndex()]; if (sortableSupertype == null) { max = 1; // unknown, so assume it's a root.
if (classDef.getSupertypeIndex() == ClassDef.NO_INDEX) { max = 0; // this is Object.class or an interface } else { SortableType sortableSupertype = types[classDef.getSupertypeIndex()]; if (sortableSupertype == null) { max = 1; // unknown, so assume it's a root.
if (classDef.getSupertypeIndex() == ClassDef.NO_INDEX) { max = 0; // this is Object.class or an interface } else if (classDef.getSupertypeIndex() == classDef.getTypeIndex()) { SortableType sortableSupertype = types[classDef.getSupertypeIndex()]; if (sortableSupertype == null) { max = 1; // unknown, so assume it's a root.
/** * Returns the set of types that can be assigned to {@code typeIndex}. */ private Set<Integer> findAssignableTypes(Dex dex, int typeIndex) { Set<Integer> assignableTypes = new HashSet<Integer>(); assignableTypes.add(typeIndex); for (ClassDef classDef : dex.classDefs()) { if (assignableTypes.contains(classDef.getSupertypeIndex())) { assignableTypes.add(classDef.getTypeIndex()); continue; } for (int implemented : classDef.getInterfaces()) { if (assignableTypes.contains(implemented)) { assignableTypes.add(classDef.getTypeIndex()); break; } } } return assignableTypes; } }
/** * Returns the set of types that can be assigned to {@code typeIndex}. */ private Set<Integer> findAssignableTypes(Dex dex, int typeIndex) { Set<Integer> assignableTypes = new HashSet<Integer>(); assignableTypes.add(typeIndex); for (ClassDef classDef : dex.classDefs()) { if (assignableTypes.contains(classDef.getSupertypeIndex())) { assignableTypes.add(classDef.getTypeIndex()); continue; } for (int implemented : classDef.getInterfaces()) { if (assignableTypes.contains(implemented)) { assignableTypes.add(classDef.getTypeIndex()); break; } } } return assignableTypes; } }
/** * Returns the set of types that can be assigned to {@code typeIndex}. */ private Set<Integer> findAssignableTypes(Dex dex, int typeIndex) { Set<Integer> assignableTypes = new HashSet<Integer>(); assignableTypes.add(typeIndex); for (ClassDef classDef : dex.classDefs()) { if (assignableTypes.contains(classDef.getSupertypeIndex())) { assignableTypes.add(classDef.getTypeIndex()); continue; } for (int implemented : classDef.getInterfaces()) { if (assignableTypes.contains(implemented)) { assignableTypes.add(classDef.getTypeIndex()); break; } } } return assignableTypes; } }
public ClassDef adjust(ClassDef classDef) { return new ClassDef(target, classDef.getOffset(), adjustType(classDef.getTypeIndex()), classDef.getAccessFlags(), adjustType(classDef.getSupertypeIndex()), adjustTypeListOffset(classDef.getInterfacesOffset()), classDef.getSourceFileIndex(), classDef.getAnnotationsOffset(), classDef.getClassDataOffset(), classDef.getStaticValuesOffset()); }
public ClassDef adjust(ClassDef classDef) { return new ClassDef(target, classDef.getOffset(), adjustType(classDef.getTypeIndex()), classDef.getAccessFlags(), adjustType(classDef.getSupertypeIndex()), adjustTypeListOffset(classDef.getInterfacesOffset()), classDef.getSourceFileIndex(), classDef.getAnnotationsOffset(), classDef.getClassDataOffset(), classDef.getStaticValuesOffset()); }
public ClassDef adjust(ClassDef classDef) { return new ClassDef(target, classDef.getOffset(), adjustType(classDef.getTypeIndex()), classDef.getAccessFlags(), adjustType(classDef.getSupertypeIndex()), adjustTypeListOffset(classDef.getInterfacesOffset()), classDef.getSourceFileIndex(), classDef.getAnnotationsOffset(), classDef.getClassDataOffset(), classDef.getStaticValuesOffset()); }
/** * Reads a class_def_item beginning at {@code in} and writes the index and * data. */ private void transformClassDef(Dex in, ClassDef classDef, IndexMap indexMap) { idsDefsOut.assertFourByteAligned(); idsDefsOut.writeInt(classDef.getTypeIndex()); idsDefsOut.writeInt(classDef.getAccessFlags()); idsDefsOut.writeInt(classDef.getSupertypeIndex()); idsDefsOut.writeInt(classDef.getInterfacesOffset()); int sourceFileIndex = indexMap.adjustString(classDef.getSourceFileIndex()); idsDefsOut.writeInt(sourceFileIndex); int annotationsOff = classDef.getAnnotationsOffset(); idsDefsOut.writeInt(indexMap.adjustAnnotationDirectory(annotationsOff)); int classDataOff = classDef.getClassDataOffset(); if (classDataOff == 0) { idsDefsOut.writeInt(0); } else { idsDefsOut.writeInt(classDataOut.getPosition()); ClassData classData = in.readClassData(classDef); transformClassData(in, classData, indexMap); } int staticValuesOff = classDef.getStaticValuesOffset(); idsDefsOut.writeInt(indexMap.adjustStaticValues(staticValuesOff)); }
/** * Reads a class_def_item beginning at {@code in} and writes the index and * data. */ private void transformClassDef(Dex in, ClassDef classDef, IndexMap indexMap) { idsDefsOut.assertFourByteAligned(); idsDefsOut.writeInt(classDef.getTypeIndex()); idsDefsOut.writeInt(classDef.getAccessFlags()); idsDefsOut.writeInt(classDef.getSupertypeIndex()); idsDefsOut.writeInt(classDef.getInterfacesOffset()); int sourceFileIndex = indexMap.adjustString(classDef.getSourceFileIndex()); idsDefsOut.writeInt(sourceFileIndex); int annotationsOff = classDef.getAnnotationsOffset(); idsDefsOut.writeInt(indexMap.adjustAnnotationDirectory(annotationsOff)); int classDataOff = classDef.getClassDataOffset(); if (classDataOff == 0) { idsDefsOut.writeInt(0); } else { idsDefsOut.writeInt(classDataOut.getPosition()); ClassData classData = in.readClassData(classDef); transformClassData(in, classData, indexMap); } int staticValuesOff = classDef.getStaticValuesOffset(); idsDefsOut.writeInt(indexMap.adjustEncodedArray(staticValuesOff)); }
/** * Reads a class_def_item beginning at {@code in} and writes the index and * data. */ private void transformClassDef(Dex in, ClassDef classDef, IndexMap indexMap) { idsDefsOut.assertFourByteAligned(); idsDefsOut.writeInt(classDef.getTypeIndex()); idsDefsOut.writeInt(classDef.getAccessFlags()); idsDefsOut.writeInt(classDef.getSupertypeIndex()); idsDefsOut.writeInt(classDef.getInterfacesOffset()); int sourceFileIndex = indexMap.adjustString(classDef.getSourceFileIndex()); idsDefsOut.writeInt(sourceFileIndex); int annotationsOff = classDef.getAnnotationsOffset(); idsDefsOut.writeInt(indexMap.adjustAnnotationDirectory(annotationsOff)); int classDataOff = classDef.getClassDataOffset(); if (classDataOff == 0) { idsDefsOut.writeInt(0); } else { idsDefsOut.writeInt(classDataOut.getPosition()); ClassData classData = in.readClassData(classDef); transformClassData(in, classData, indexMap); } int staticValuesOff = classDef.getStaticValuesOffset(); idsDefsOut.writeInt(indexMap.adjustStaticValues(staticValuesOff)); }