ClassDataItem classDataItem = new ClassDataItem(dexFile, staticFieldsArray, instanceFieldsArray, directMethodsArray, virtualMethodsArray); return dexFile.ClassDataSection.intern(classDataItem);
/** * Performs a binary search for the definition of the specified method. It can be either direct or virtual * @param methodIdItem The MethodIdItem of the virtual method to search for * @return The EncodedMethod for the specified virtual method, or null if not found */ public EncodedMethod findMethodByMethodId(MethodIdItem methodIdItem) { EncodedMethod encodedMethod = findMethodByMethodIdInternal(methodIdItem.index, directMethods); if (encodedMethod != null) { return encodedMethod; } return findMethodByMethodIdInternal(methodIdItem.index, virtualMethods); }
private String[] loadDirectMethods(ClassDataItem classDataItem, boolean[][] _staticMethods) { EncodedMethod[] encodedMethods = classDataItem.getDirectMethods(); if (encodedMethods != null && encodedMethods.length > 0) { boolean[] staticMethods = new boolean[encodedMethods.length]; String[] directMethods = new String[encodedMethods.length]; for (int i=0; i<encodedMethods.length; i++) { EncodedMethod encodedMethod = encodedMethods[i]; if ((encodedMethod.accessFlags & AccessFlags.STATIC.getValue()) != 0) { staticMethods[i] = true; } directMethods[i] = encodedMethods[i].method.getVirtualMethodString(); } _staticMethods[0] = staticMethods; return directMethods; } return null; }
offset += Leb128Utils.unsignedLeb128Size(getStaticFieldCount()); offset += Leb128Utils.unsignedLeb128Size(getInstanceFieldCount()); offset += Leb128Utils.unsignedLeb128Size(getDirectMethodCount()); offset += Leb128Utils.unsignedLeb128Size(getVirtualMethodCount());
private String[] loadVirtualMethods(ClassDataItem classDataItem) { EncodedMethod[] encodedMethods = classDataItem.getVirtualMethods(); if (encodedMethods != null && encodedMethods.length > 0) { String[] virtualMethods = new String[encodedMethods.length]; for (int i=0; i<encodedMethods.length; i++) { virtualMethods[i] = encodedMethods[i].method.getVirtualMethodString(); } return virtualMethods; } return null; }
private String[][] loadInstanceFields(ClassDataItem classDataItem) { EncodedField[] encodedFields = classDataItem.getInstanceFields(); if (encodedFields != null && encodedFields.length > 0) { String[][] instanceFields = new String[encodedFields.length][2]; for (int i=0; i<encodedFields.length; i++) { EncodedField encodedField = encodedFields[i]; instanceFields[i][0] = encodedField.field.getFieldName().getStringValue(); instanceFields[i][1] = encodedField.field.getFieldType().getTypeDescriptor(); } return instanceFields; } return null; } }
ClassDataItem.EncodedMethod encodedMethod = classDefItem.getClassData().findDirectMethodByMethodId(methodIdItem); if (encodedMethod == null) { return null;
if(!dexFile.getInplace() && staticFieldInitializers != null && staticFieldInitializers.size() > 0) { assert classData != null; assert staticFieldInitializers.size() == classData.getStaticFieldCount(); encodedArrayItem = makeStaticFieldInitializersItem(dexFile, staticFieldInitializers);
int staticFieldCount = getStaticFieldCount(); out.annotate("static_fields_size: 0x" + Integer.toHexString(staticFieldCount) + " (" + staticFieldCount + ")"); out.writeUnsignedLeb128(staticFieldCount); int instanceFieldCount = getInstanceFieldCount(); out.annotate("instance_fields_size: 0x" + Integer.toHexString(instanceFieldCount) + " (" + instanceFieldCount + ")"); out.writeUnsignedLeb128(instanceFieldCount); int directMethodCount = getDirectMethodCount(); out.annotate("direct_methods_size: 0x" + Integer.toHexString(directMethodCount) + " (" + directMethodCount + ")"); out.writeUnsignedLeb128(directMethodCount); int virtualMethodCount = getVirtualMethodCount(); out.annotate("virtual_methods_size: 0x" + Integer.toHexString(virtualMethodCount) + " (" + virtualMethodCount + ")"); out.writeUnsignedLeb128(getStaticFieldCount()); out.writeUnsignedLeb128(getInstanceFieldCount()); out.writeUnsignedLeb128(getDirectMethodCount()); out.writeUnsignedLeb128(getVirtualMethodCount());
/** {@inheritDoc} */ protected void writeItem(AnnotatedOutput out) { if (out.annotates()) { out.annotate(4, "class_type: " + classType.getTypeDescriptor()); out.annotate(4, "access_flags: " + AccessFlags.formatAccessFlagsForClass(accessFlags)); out.annotate(4, "superclass_type: " + (superType==null?"":superType.getTypeDescriptor())); out.annotate(4, "interfaces: " + (implementedInterfaces==null?"":implementedInterfaces.getTypeListString(" "))); out.annotate(4, "source_file: " + (sourceFile==null?"":sourceFile.getStringValue())); out.annotate(4, "annotations_off: " + (annotations==null?"":"0x"+Integer.toHexString(annotations.getOffset()))); out.annotate(4, "class_data_off:" + (classData==null?"":"0x"+Integer.toHexString(classData.getOffset()))); out.annotate(4, "static_values_off: " + (staticFieldInitializers==null?"":"0x"+Integer.toHexString(staticFieldInitializers.getOffset()))); } out.writeInt(classType.getIndex()); out.writeInt(accessFlags); out.writeInt(superType==null?-1:superType.getIndex()); out.writeInt(implementedInterfaces==null?0:implementedInterfaces.getOffset()); out.writeInt(sourceFile==null?-1:sourceFile.getIndex()); out.writeInt(annotations==null?0:annotations.getOffset()); out.writeInt(classData==null?0:classData.getOffset()); out.writeInt(staticFieldInitializers==null?0:staticFieldInitializers.getOffset()); }
private String[] loadVirtualMethods(ClassDataItem classDataItem) { List<EncodedMethod> encodedMethods = classDataItem.getVirtualMethods(); if (encodedMethods.size() > 0) { String[] virtualMethods = new String[encodedMethods.size()]; for (int i=0; i<encodedMethods.size(); i++) { virtualMethods[i] = encodedMethods.get(i).method.getShortMethodString(); } return virtualMethods; } return null; }
private String[][] loadInstanceFields(ClassDataItem classDataItem) { List<EncodedField> encodedFields = classDataItem.getInstanceFields(); if (encodedFields.size() > 0) { String[][] instanceFields = new String[encodedFields.size()][2]; for (int i=0; i<encodedFields.size(); i++) { EncodedField encodedField = encodedFields.get(i); instanceFields[i][0] = encodedField.field.getFieldName().getStringValue(); instanceFields[i][1] = encodedField.field.getFieldType().getTypeDescriptor(); } return instanceFields; } return null; } }
ClassDataItem.EncodedMethod encodedMethod = classDataItem.findDirectMethodByMethodId(methodIdItem); if (encodedMethod == null) { return null;
/** * Performs a binary search for the definition of the specified direct method * @param methodIdItem The MethodIdItem of the direct method to search for * @return The EncodedMethod for the specified direct method, or null if not found */ public EncodedMethod findDirectMethodByMethodId(MethodIdItem methodIdItem) { return findMethodByMethodIdInternal(methodIdItem.index, directMethods); }
return new AnnotationSetItem(dexFile); case TYPE_CLASS_DATA_ITEM: return new ClassDataItem(dexFile); case TYPE_CODE_ITEM: return new CodeItem(dexFile);
private String[] loadDirectMethods(ClassDataItem classDataItem, boolean[][] _staticMethods) { List<EncodedMethod> encodedMethods = classDataItem.getDirectMethods(); if (encodedMethods.size() > 0) { boolean[] staticMethods = new boolean[encodedMethods.size()]; String[] directMethods = new String[encodedMethods.size()]; for (int i=0; i<encodedMethods.size(); i++) { EncodedMethod encodedMethod = encodedMethods.get(i); if ((encodedMethod.accessFlags & AccessFlags.STATIC.getValue()) != 0) { staticMethods[i] = true; } directMethods[i] = encodedMethod.method.getShortMethodString(); } _staticMethods[0] = staticMethods; return directMethods; } return null; }
/** * Performs a binary search for the definition of the specified virtual method * @param methodIdItem The MethodIdItem of the virtual method to search for * @return The EncodedMethod for the specified virtual method, or null if not found */ public EncodedMethod findVirtualMethodByMethodId(MethodIdItem methodIdItem) { return findMethodByMethodIdInternal(methodIdItem.index, virtualMethods); }
ClassDataItem classDataItem = new ClassDataItem(dexFile, staticFieldsArray, instanceFieldsArray, directMethodsArray, virtualMethodsArray); return dexFile.ClassDataSection.intern(classDataItem);