public DexFieldVisitor visitField(int accessFlags, Field field, Object value) { if (visitor == null) { return null; } return visitor.visitField(accessFlags, field, value); }
public DexMethodVisitor visitMethod(int accessFlags, Method method) { if (visitor == null) { return null; } return visitor.visitMethod(accessFlags, method); }
public void visitEnd() { if (visitor == null) { return; } visitor.visitEnd(); }
public static void acceptFile(SmaliParser.SFileContext ctx, DexFileVisitor dexFileVisitor) { DexClassVisitor dexClassVisitor; String className = Utils.unEscapeId(ctx.className.getText()); int access = collectAccess(ctx.sAccList()); List<SmaliParser.SSuperContext> superContexts = ctx.sSuper(); String superClass = null; if (superContexts.size() > 0) { superClass = Utils.unEscapeId(superContexts.get(superContexts.size() - 1).name.getText()); } List<SmaliParser.SInterfaceContext> itfs = ctx.sInterface(); String[] interfaceNames = null; if (itfs.size() > 0) { interfaceNames = new String[itfs.size()]; for (int i = 0; i < itfs.size(); i++) { interfaceNames[i] = Utils.unEscapeId(itfs.get(i).name.getText()); } } dexClassVisitor = dexFileVisitor.visit(access, className, superClass, interfaceNames); List<SmaliParser.SSourceContext> sources = ctx.sSource(); if (sources.size() > 0) { dexClassVisitor.visitSource( Utils.unescapeStr(sources.get(sources.size() - 1).src.getText()) ); } acceptAnnotations(ctx.sAnnotation(), dexClassVisitor); acceptField(ctx.sField(), className, dexClassVisitor); acceptMethod(ctx.sMethod(), className, dexClassVisitor); dexClassVisitor.visitEnd(); }
@Test public void test3() { DexFileWriter w = new DexFileWriter(); DexClassVisitor cv = w.visit(0x1, "La/c;", null, new String[]{"Ljava/lang/Comparable;"}); cv.visitSource("c.java"); cv.visitAnnotation("LAnn;", Visibility.SYSTEM).visitEnd(); DexFieldVisitor fv = cv.visitField(ACC_PUBLIC | ACC_STATIC, new Field("La/c;", "a", "I"), 55); fv.visitAnnotation("LE;", Visibility.RUNTIME).visitEnd(); fv.visitEnd(); DexMethodVisitor mv = cv.visitMethod(ACC_STATIC, new Method("La/c;", "bb", new String[]{"I"}, "V")); mv.visitAnnotation("Laaa;", Visibility.RUNTIME).visitEnd(); DexAnnotationVisitor dav = mv.visitParameterAnnotation(0).visitAnnotation("Laaa;", Visibility.RUNTIME); dav.visit("abc", true); DexAnnotationVisitor dav2 = dav.visitArray("efg"); dav2.visit("", "123"); dav2.visit("", "456"); dav2.visitEnd(); dav.visitEnd(); DexCodeVisitor code = mv.visitCode(); code.visitRegister(2); code.visitStmt0R(Op.RETURN_VOID); code.visitEnd(); mv.visitEnd(); cv.visitEnd(); w.visitEnd(); w.toByteArray(); }
@Test public void test() { ASMifierFileV fv = new ASMifierFileV(new File("target/asmftest").toPath(), "a.b"); DexClassVisitor cv = fv.visit(ACC_PUBLIC, "La/f;", "Ljava/lang/Object;", null); DexFieldVisitor f2v = cv.visitField(ACC_PUBLIC, new Field("La/f;", "abc", "I"), null); f2v.visitEnd(); DexMethodVisitor mv = cv.visitMethod(ACC_PUBLIC | ACC_STATIC, new Method("La/f;", "zz", new String[0], "I")); DexAnnotationAble pv = mv.visitParameterAnnotation(2); DexAnnotationVisitor dav = pv.visitAnnotation("Leeeff;", Visibility.BUILD); dav.visitEnd(); DexCodeVisitor dcv = mv.visitCode(); dcv.visitConstStmt(Op.FILL_ARRAY_DATA, 0, new int[] { 1, 2, 3 }); dcv.visitStmt0R(Op.RETURN_VOID); dcv.visitEnd(); mv.visitEnd(); cv.visitEnd(); fv.visitEnd(); } }
DexMethodVisitor mv = cv.visitMethod(ACC_PUBLIC, new Method("La;", "<init>", new String[] {}, "V")); if (mv != null) { DexCodeVisitor code = mv.visitCode(); DexFieldVisitor fv = cv.visitField(ACC_PRIVATE | ACC_STATIC, f, 0); if (fv != null) { fv.visitEnd();
cw.visitSource(classItem.sourceFile.stringData.string); for (AnnotationItem annotationItem : classItem.classAnnotations.annotations) { EncodedAnnotation annotation = annotationItem.annotation; DexAnnotationVisitor aw = cw.visitAnnotation(annotation.type.descriptor.stringData.string, annotationItem.visibility); writeAnnotation(aw, annotation); cw.visitEnd(); Logger.d(TAG, "write class : " + classItem.clazz);
public void visitSource(String file) { if (visitor == null) { return; } visitor.visitSource(file); }
public DexAnnotationVisitor visitAnnotation(String name, Visibility visibility) { if (visitor == null) { return null; } return visitor.visitAnnotation(name, visibility); }
invocationInterfaceDesc}); dcv.visitField(DexConstants.ACC_PRIVATE | DexConstants.ACC_FINAL, new Field(typeNameDesc, "thiz", "Ljava/lang/Object;"), null).visitEnd(); dcv.visitField(DexConstants.ACC_PRIVATE | DexConstants.ACC_FINAL, new Field(typeNameDesc, "args", "[Ljava/lang/Object;"), null) .visitEnd(); dcv.visitField(DexConstants.ACC_PRIVATE | DexConstants.ACC_FINAL, new Field(typeNameDesc, "idx", "I"), null) .visitEnd(); .visitMethod(DexConstants.ACC_PUBLIC | DexConstants.ACC_CONSTRUCTOR, new Method(typeNameDesc, "<init>", new String[]{ "Ljava/lang/Object;", "[Ljava/lang/Object;", "I"}, "V")); DexCodeVisitor codeVisitor = mv.visitCode(); .visitMethod(DexConstants.ACC_PUBLIC, new Method(typeNameDesc, "getArguments", new String[0], "[Ljava/lang/Object;")); DexCodeVisitor code = mv.visitCode(); code.visitRegister(2); .visitMethod(DexConstants.ACC_PUBLIC, new Method(typeNameDesc, "getThis", new String[0], "Ljava/lang/Object;")); DexCodeVisitor code = mv.visitCode(); code.visitRegister(2); .visitMethod(DexConstants.ACC_PUBLIC, new Method(typeNameDesc, "proceed", new String[0], "Ljava/lang/Object;")); DexCodeVisitor code = mv.visitCode(); code.visitRegister(4); dcv.visitEnd(); return typeName;
public void accept(DexClassVisitor dcv) { if (anns != null) { for (DexAnnotationNode ann : anns) { ann.accept(dcv); } } if (methods != null) { for (DexMethodNode m : methods) { m.accept(dcv); } } if (fields != null) { for (DexFieldNode f : fields) { f.accept(dcv); } } if (source != null) { dcv.visitSource(source); } }
public DexAnnotationVisitor visitAnnotation(String name, Visibility visibility) { if (visitor == null) { return null; } return visitor.visitAnnotation(name, visibility); }
private DexMethodVisitor superVisitDexMethod(int accessFlags, Method method) { return super.visitMethod(accessFlags, method); } };
public void accept(DexClassVisitor dcv) { DexFieldVisitor fv = dcv.visitField(access, field, cst); if (fv != null) { accept(fv); fv.visitEnd(); } }
public void accept(DexFileVisitor dfv) { DexClassVisitor dcv = dfv.visit(access, className, superClass, interfaceNames); if (dcv != null) { accept(dcv); dcv.visitEnd(); } }
dcv.visitSource(this.getString(source_file_idx));
public void accept(DexClassVisitor dcv) { DexMethodVisitor mv = dcv.visitMethod(access, method); if (mv != null) { accept(mv); mv.visitEnd(); } }
public static void acceptField(SmaliParser.SFieldContext ctx, String className, DexClassVisitor dexClassVisitor) { Field field; Token fieldObj = ctx.fieldObj; if (fieldObj.getType() == SmaliLexer.FIELD_FULL) { field = Utils.parseFieldAndUnescape(fieldObj.getText()); } else { field = Utils.parseFieldAndUnescape(className, fieldObj.getText()); } int access = collectAccess(ctx.sAccList()); Object value = null; SmaliParser.SBaseValueContext vctx = ctx.sBaseValue(); if (vctx != null) { value = parseBaseValue(vctx); } DexFieldVisitor dexFieldVisitor = dexClassVisitor.visitField(access, field, value); if (dexFieldVisitor != null) { acceptAnnotations(ctx.sAnnotation(), dexFieldVisitor); dexFieldVisitor.visitEnd(); } }