public ClassNode(DexNode dex, ClassDef cls) { this.dex = dex; this.clsInfo = ClassInfo.fromDex(dex, cls.getTypeIndex()); try { if (cls.getSupertypeIndex() == DexNode.NO_INDEX) {
public int getTypeIndex() { return classDef.getTypeIndex(); }
public int getTypeIndex() { return classDef.getTypeIndex(); }
public int getTypeIndex() { return classDef.getTypeIndex(); }
/** * 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; } }
private String location() { String className = dex.typeNames().get(currentClass.getTypeIndex()); if (currentMethod != null) { MethodId methodId = dex.methodIds().get(currentMethod.getMethodIndex()); return className + "." + dex.strings().get(methodId.getNameIndex()); } else { return className; } }
private String location() { String className = dex.typeNames().get(currentClass.getTypeIndex()); if (currentMethod != null) { MethodId methodId = dex.methodIds().get(currentMethod.getMethodIndex()); return className + "." + dex.strings().get(methodId.getNameIndex()); } else { return className; } }
private String location() { String className = dex.typeNames().get(currentClass.getTypeIndex()); if (currentMethod != null) { MethodId methodId = dex.methodIds().get(currentMethod.getMethodIndex()); return className + "." + dex.strings().get(methodId.getNameIndex()); } else { return className; } }
private String location() { String className = dex.typeNames().get(currentClass.getTypeIndex()); if (currentMethod != null) { MethodId methodId = dex.methodIds().get(currentMethod.getMethodIndex()); return className + "." + dex.strings().get(methodId.getNameIndex()); } else { return className; } }
private String location() { String className = dex.typeNames().get(currentClass.getTypeIndex()); if (currentMethod != null) { MethodId methodId = dex.methodIds().get(currentMethod.getMethodIndex()); return className + "." + dex.strings().get(methodId.getNameIndex()); } else { return className; } }
private String location() { String className = dex.typeNames().get(currentClass.getTypeIndex()); if (currentMethod != null) { MethodId methodId = dex.methodIds().get(currentMethod.getMethodIndex()); return className + "." + dex.strings().get(methodId.getNameIndex()); } else { return className; } }
/** * Reads just enough data on each class so that we can sort it and then find * it later. */ private void readSortableTypes(SortableType[] sortableTypes, Dex buffer, IndexMap indexMap) { for (ClassDef classDef : buffer.classDefs()) { SortableType sortableType = indexMap.adjust(new SortableType(buffer, classDef)); int t = sortableType.getTypeIndex(); if (sortableTypes[t] == null) { sortableTypes[t] = sortableType; } else if (collisionPolicy != CollisionPolicy.KEEP_FIRST) { throw new DexException("Multiple dex files define " + buffer.typeNames().get(classDef.getTypeIndex())); } } }
/** * Reads just enough data on each class so that we can sort it and then find * it later. */ private void readSortableTypes(SortableType[] sortableTypes, Dex buffer, IndexMap indexMap) { for (ClassDef classDef : buffer.classDefs()) { SortableType sortableType = indexMap.adjust( new SortableType(buffer, indexMap, classDef)); int t = sortableType.getTypeIndex(); if (sortableTypes[t] == null) { sortableTypes[t] = sortableType; } else if (collisionPolicy != CollisionPolicy.KEEP_FIRST) { throw new DexException("Multiple dex files define " + buffer.typeNames().get(classDef.getTypeIndex())); } } }
/** * Reads just enough data on each class so that we can sort it and then find * it later. */ private void readSortableTypes(SortableType[] sortableTypes, Dex buffer, IndexMap indexMap) { for (ClassDef classDef : buffer.classDefs()) { SortableType sortableType = indexMap.adjust( new SortableType(buffer, indexMap, classDef)); int t = sortableType.getTypeIndex(); if (sortableTypes[t] == null) { sortableTypes[t] = sortableType; } else if (collisionPolicy != CollisionPolicy.KEEP_FIRST) { throw new DexException("Multiple dex files define " + buffer.typeNames().get(classDef.getTypeIndex())); } } }
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)); }