private static FieldRef[] getFieldRefs(DexData dexData, Filter filter) { FieldRef[] fieldRefs = dexData.getFieldRefs(); // out.println("Read in " + fieldRefs.length + " field IDs from " + dexData.getDexFileName() + "."); if (filter == Filter.ALL) { return fieldRefs; } ClassRef[] externalClassRefs = dexData.getExternalReferences(); //out.println("Read in " + externalClassRefs.length + " external class references."); Set<FieldRef> externalFieldRefs = new HashSet<FieldRef>(); for (ClassRef classRef : externalClassRefs) { Collections.addAll(externalFieldRefs, classRef.getFieldArray()); } //out.println("Read in " + externalFieldRefs.size() + " external field references."); List<FieldRef> filteredFieldRefs = new ArrayList<FieldRef>(); for (FieldRef FieldRef : fieldRefs) { boolean isExternal = externalFieldRefs.contains(FieldRef); if ((filter == Filter.DEFINED_ONLY && !isExternal) || (filter == Filter.REFERENCED_ONLY && isExternal)) { filteredFieldRefs.add(FieldRef); } } //out.println("Filtered to " + filteredFieldRefs.size() + " " + // (filter == Filter.DEFINED_ONLY ? "defined" : "referenced") + " field IDs."); return filteredFieldRefs.toArray(new FieldRef[filteredFieldRefs.size()]); }
Collections.addAll(externalMethodRefs, classRef.getMethodArray());
/** * Prints the list of classes in a simple human-readable format. */ static void printClassRefs(ClassRef[] classes, boolean justClasses) { if (!justClasses) { out.println("Classes:"); } for (int i = 0; i < classes.length; i++) { ClassRef ref = classes[i]; out.println(descriptorToDot(ref.getName())); } }
/** * Runs through the list of field references, inserting external * references into the appropriate ClassRef. */ private void addExternalFieldReferences(ClassRef[] sparseRefs) { for (int i = 0; i < mFieldIds.length; i++) { if (!mTypeIds[mFieldIds[i].classIdx].internal) { FieldIdItem fieldId = mFieldIds[i]; FieldRef newFieldRef = new FieldRef( classNameFromTypeIndex(fieldId.classIdx), classNameFromTypeIndex(fieldId.typeIdx), mStrings[fieldId.nameIdx]); sparseRefs[mFieldIds[i].classIdx].addField(newFieldRef); } } }
/** * Runs through the list of method references, inserting external * references into the appropriate ClassRef. */ private void addExternalMethodReferences(ClassRef[] sparseRefs) { for (int i = 0; i < mMethodIds.length; i++) { if (!mTypeIds[mMethodIds[i].classIdx].internal) { MethodIdItem methodId = mMethodIds[i]; MethodRef newMethodRef = new MethodRef( classNameFromTypeIndex(methodId.classIdx), argArrayFromProtoIndex(methodId.protoIdx), returnTypeFromProtoIndex(methodId.protoIdx), mStrings[methodId.nameIdx]); sparseRefs[mMethodIds[i].classIdx].addMethod(newMethodRef); } } }
if (!mTypeIds[i].internal) { sparseRefs[i] = new ClassRef(mStrings[mTypeIds[i].descriptorIdx]); count++;
/** * Runs through the list of field references, inserting external * references into the appropriate ClassRef. */ private void addExternalFieldReferences(ClassRef[] sparseRefs) { for (int i = 0; i < mFieldIds.length; i++) { if (!mTypeIds[mFieldIds[i].classIdx].internal) { FieldIdItem fieldId = mFieldIds[i]; FieldRef newFieldRef = new FieldRef( classNameFromTypeIndex(fieldId.classIdx), classNameFromTypeIndex(fieldId.typeIdx), mStrings[fieldId.nameIdx]); sparseRefs[mFieldIds[i].classIdx].addField(newFieldRef); } } }
/** * Runs through the list of method references, inserting external * references into the appropriate ClassRef. */ private void addExternalMethodReferences(ClassRef[] sparseRefs) { for (int i = 0; i < mMethodIds.length; i++) { if (!mTypeIds[mMethodIds[i].classIdx].internal) { MethodIdItem methodId = mMethodIds[i]; MethodRef newMethodRef = new MethodRef( classNameFromTypeIndex(methodId.classIdx), argArrayFromProtoIndex(methodId.protoIdx), returnTypeFromProtoIndex(methodId.protoIdx), mStrings[methodId.nameIdx]); sparseRefs[mMethodIds[i].classIdx].addMethod(newMethodRef); } } }
if (!mTypeIds[i].internal) { sparseRefs[i] = new ClassRef(mStrings[mTypeIds[i].descriptorIdx]); count++;
Set<MethodRef> externalMethodRefs = new HashSet<MethodRef>(); for (ClassRef classRef : externalClassRefs) { for (MethodRef methodRef : classRef.getMethodArray()) { externalMethodRefs.add(methodRef);
/** * Prints the externally-visible fields in XML format. */ private static void printXmlFields(ClassRef cref) { FieldRef[] fields = cref.getFieldArray(); for (int i = 0; i < fields.length; i++) { FieldRef fref = fields[i]; out.println(IN3 + "<field name=\"" + fref.getName() + "\" type=\"" + descriptorToDot(fref.getTypeName()) + "\"/>"); } }
/** * Prints the list of classes in a simple human-readable format. */ static void printClassRefs(ClassRef[] classes, boolean justClasses) { if (!justClasses) { out.println("Classes:"); } for (int i = 0; i < classes.length; i++) { ClassRef ref = classes[i]; out.println(descriptorToDot(ref.getName())); } }
/** * Runs through the list of field references, inserting external * references into the appropriate ClassRef. */ private void addExternalFieldReferences(ClassRef[] sparseRefs) { for (int i = 0; i < mFieldIds.length; i++) { if (!mTypeIds[mFieldIds[i].classIdx].internal) { FieldIdItem fieldId = mFieldIds[i]; FieldRef newFieldRef = new FieldRef( classNameFromTypeIndex(fieldId.classIdx), classNameFromTypeIndex(fieldId.typeIdx), mStrings[fieldId.nameIdx]); sparseRefs[mFieldIds[i].classIdx].addField(newFieldRef); } } }
/** * Runs through the list of method references, inserting external * references into the appropriate ClassRef. */ private void addExternalMethodReferences(ClassRef[] sparseRefs) { for (int i = 0; i < mMethodIds.length; i++) { if (!mTypeIds[mMethodIds[i].classIdx].internal) { MethodIdItem methodId = mMethodIds[i]; MethodRef newMethodRef = new MethodRef( classNameFromTypeIndex(methodId.classIdx), argArrayFromProtoIndex(methodId.protoIdx), returnTypeFromProtoIndex(methodId.protoIdx), mStrings[methodId.nameIdx]); sparseRefs[mMethodIds[i].classIdx].addMethod(newMethodRef); } } }
if (!mTypeIds[i].internal) { sparseRefs[i] = new ClassRef(mStrings[mTypeIds[i].descriptorIdx]); count++;
Collections.addAll(externalMethodRefs, classRef.getMethodArray());
/** * Prints the externally-visible fields in XML format. */ private static void printXmlFields(ClassRef cref) { FieldRef[] fields = cref.getFieldArray(); for (int i = 0; i < fields.length; i++) { FieldRef fref = fields[i]; out.println(IN3 + "<field name=\"" + fref.getName() + "\" type=\"" + descriptorToDot(fref.getTypeName()) + "\"/>"); } }
/** * Prints the list of classes in a simple human-readable format. */ static void printClassRefs(ClassRef[] classes, boolean justClasses) { if (!justClasses) { out.println("Classes:"); } for (int i = 0; i < classes.length; i++) { ClassRef ref = classes[i]; out.println(descriptorToDot(ref.getName())); } }
/** * Runs through the list of field references, inserting external * references into the appropriate ClassRef. */ private void addExternalFieldReferences(ClassRef[] sparseRefs) { for (int i = 0; i < mFieldIds.length; i++) { if (!mTypeIds[mFieldIds[i].classIdx].internal) { FieldIdItem fieldId = mFieldIds[i]; FieldRef newFieldRef = new FieldRef( classNameFromTypeIndex(fieldId.classIdx), classNameFromTypeIndex(fieldId.typeIdx), mStrings[fieldId.nameIdx]); sparseRefs[mFieldIds[i].classIdx].addField(newFieldRef); } } }
/** * Runs through the list of method references, inserting external * references into the appropriate ClassRef. */ private void addExternalMethodReferences(ClassRef[] sparseRefs) { for (int i = 0; i < mMethodIds.length; i++) { if (!mTypeIds[mMethodIds[i].classIdx].internal) { MethodIdItem methodId = mMethodIds[i]; MethodRef newMethodRef = new MethodRef( classNameFromTypeIndex(methodId.classIdx), argArrayFromProtoIndex(methodId.protoIdx), returnTypeFromProtoIndex(methodId.protoIdx), mStrings[methodId.nameIdx]); sparseRefs[mMethodIds[i].classIdx].addMethod(newMethodRef); } } }