for (Field field : classDef.getFields()) { final BuilderField builderField = dexBuilder.internField( field.getDefiningClass(), field.getName(), field.getType(), field.getAccessFlags(), field.getInitialValue(), field.getAnnotations() ); builderFields.add(builderField);
private void visitFields(Iterable<? extends Field> fields, ClassWriter classWriter, int classAccessFlags) { for (Field field : fields) { /* * It's possible to declare a Smali interface with private fields. Android doesn't seem to mind, but * the Java class loader will complain. To get around this, just set them public, which is what they * should be anyway. */ int fieldAccessFlags = field.getAccessFlags(); if ((classAccessFlags & Opcodes.ACC_INTERFACE) != 0) { if ((fieldAccessFlags & Opcodes.ACC_PRIVATE) != 0) { fieldAccessFlags &= ~Opcodes.ACC_PRIVATE; fieldAccessFlags |= Opcodes.ACC_PUBLIC; } } String name = field.getName(); String desc = field.getType(); String signature = null; Object value = null; classWriter.visitField(fieldAccessFlags, name, desc, signature, value); } }
/** * Loads a single field from a dex file * * @param declaringClass * The class that declares the method to load * @param annotations * The worker object for handling annotations * @param field * The field to load */ protected void loadField(SootClass declaringClass, DexAnnotation annotations, Field sf) { if (declaringClass.declaresField(sf.getName(), DexType.toSoot(sf.getType()))) { return; } SootField sootField = DexField.makeSootField(sf); sootField = declaringClass.getOrAddField(sootField); annotations.handleFieldAnnotation(sootField, sf); }
@Override public int getFieldAccessFlags(@Nonnull Field field) { return field.getAccessFlags(); }
EncodedValue initialValue = field.getInitialValue(); if (initialValue != null) { dexPool.internEncodedValue(initialValue); dexPool.annotationSetSection.intern(field.getAnnotations());
@Nullable @Override public Set<? extends Annotation> getFieldAnnotations(@Nonnull Field field) { Set<? extends Annotation> annotations = field.getAnnotations(); if (annotations.size() == 0) { return null; } return annotations; }
fields.put(field.getName(), field); Assert.assertNotNull(field.getInitialValue()); Assert.assertEquals(ValueType.METHOD, field.getInitialValue().getValueType()); MethodEncodedValue methodEncodedValue = (MethodEncodedValue)field.getInitialValue(); Assert.assertEquals(classDef.getType(), methodEncodedValue.getValue().getDefiningClass()); Assert.assertEquals("toString", methodEncodedValue.getValue().getName()); Assert.assertNotNull(field.getInitialValue()); Assert.assertEquals(ValueType.METHOD, field.getInitialValue().getValueType()); methodEncodedValue = (MethodEncodedValue)field.getInitialValue(); Assert.assertEquals(classDef.getType(), methodEncodedValue.getValue().getDefiningClass()); Assert.assertEquals("V", methodEncodedValue.getValue().getName()); Assert.assertNotNull(field.getInitialValue()); Assert.assertEquals(ValueType.METHOD, field.getInitialValue().getValueType()); methodEncodedValue = (MethodEncodedValue)field.getInitialValue(); Assert.assertEquals(classDef.getType(), methodEncodedValue.getValue().getDefiningClass()); Assert.assertEquals("I", methodEncodedValue.getValue().getName()); Assert.assertNotNull(field.getInitialValue()); Assert.assertEquals(ValueType.TYPE, field.getInitialValue().getValueType()); TypeEncodedValue typeEncodedValue = (TypeEncodedValue)field.getInitialValue(); Assert.assertEquals("I", typeEncodedValue.getValue());
Tag tag = null; EncodedValue ev = sf.getInitialValue();
@Override public EncodedValue apply(Field input) { EncodedValue initialValue = input.getInitialValue(); if (initialValue == null) { return ImmutableEncodedValueFactory.defaultValueForType(input.getType()); } return initialValue; } };
@Override public int compare(Field f1, Field f2) { int type1 = getTypeAsPrimitiveType(f1); int type2 = getTypeAsPrimitiveType(f2); if (type1 != type2) { boolean isPrimitive1 = type1 != kPrimNot; boolean isPrimitive2 = type2 != kPrimNot; boolean is64bit1 = isPrimitive1 && (type1 == kPrimLong || type1 == kPrimDouble); boolean is64bit2 = isPrimitive2 && (type2 == kPrimLong || type2 == kPrimDouble); int order1 = !isPrimitive1 ? 0 : (is64bit1 ? 1 : 2); int order2 = !isPrimitive2 ? 0 : (is64bit2 ? 1 : 2); return order1 - order2; } return f1.getName().compareTo(f2.getName()); } }
static int getTypeAsPrimitiveType(Field field) { return getPrimitiveType(field.getType().charAt(0)); }
/** * * @return the Soot equivalent of a field */ public static SootField makeSootField(Field f) { String name = f.getName(); Type type = DexType.toSoot(f.getType()); int flags = f.getAccessFlags(); SootField sf = Scene.v().makeSootField(name, type, flags); DexField.addConstantTag(sf, f); return sf; } }
public int getAccessFlags() { return field.getAccessFlags(); }
public DexIField(Field encodedField, DexIClass klass) { //public DexIField(EncodedField encodedField) { eField = encodedField; myClass = klass; String fieldName = eField.getName(); name = Atom.findOrCreateUnicodeAtom(fieldName); String fieldType = eField.getType(); TypeName T = DexUtil.getTypeName(fieldType); TypeReference type = TypeReference.findOrCreate(myClass.getClassLoader().getReference(), T); myFieldRef = FieldReference.findOrCreate(myClass.getReference(), name, type); }
EncodedValue initialValue = field.getInitialValue(); if (initialValue != null) { DexPool.internEncodedValue(initialValue, stringPool, typePool, fieldPool, methodPool); annotationSetPool.intern(field.getAnnotations());
/** * Converts field annotations from Dexlib to Jimple * * @param h * @param f */ public void handleFieldAnnotation(Host h, Field f) { Set<? extends Annotation> aSet = f.getAnnotations(); if (aSet != null && !aSet.isEmpty()) { List<Tag> tags = handleAnnotation(aSet, null); if (tags != null) { for (Tag t : tags) { if (t != null) { h.addTag(t); } } } } }
fields.put(field.getName(), field); Assert.assertNotNull(field.getInitialValue()); Assert.assertEquals(ValueType.FIELD, field.getInitialValue().getValueType()); FieldEncodedValue fieldEncodedValue = (FieldEncodedValue)field.getInitialValue(); Assert.assertEquals(classDef.getType(), fieldEncodedValue.getValue().getDefiningClass()); Assert.assertEquals("someField", fieldEncodedValue.getValue().getName()); Assert.assertNotNull(field.getInitialValue()); Assert.assertEquals(ValueType.FIELD, field.getInitialValue().getValueType()); fieldEncodedValue = (FieldEncodedValue)field.getInitialValue(); Assert.assertEquals(classDef.getType(), fieldEncodedValue.getValue().getDefiningClass()); Assert.assertEquals("V", fieldEncodedValue.getValue().getName()); Assert.assertNotNull(field.getInitialValue()); Assert.assertEquals(ValueType.FIELD, field.getInitialValue().getValueType()); fieldEncodedValue = (FieldEncodedValue)field.getInitialValue(); Assert.assertEquals(classDef.getType(), fieldEncodedValue.getValue().getDefiningClass()); Assert.assertEquals("I", fieldEncodedValue.getValue().getName());
@Override public BuilderEncodedValue apply(BuilderField input) { BuilderEncodedValue initialValue = input.getInitialValue(); if (initialValue == null) { return BuilderEncodedValues.defaultValueForType(input.getType()); } return initialValue; } };
@Override public EncodedValue apply(Field input) { EncodedValue initialValue = input.getInitialValue(); if (initialValue == null) { return ImmutableEncodedValueFactory.defaultValueForType(input.getType()); } return initialValue; } };
public Field read(String className,String member) throws Exception { if (reader == null){ return null; } classDef = (ClassDef) reader.read(className,null); Iterable<? extends Field> fields = classDef.getFields(); for (Field field:fields){ if (field.getName().equals(member)){ return field; } } return null; }