a
554325746@qq.com
2019-12-24 570a73851c26d810c2597596a8acc8a8d4cde211
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package com.basic.security.utils;
 
import org.apache.commons.io.IOUtils;
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
 
public class JavaAssistant {
 
    static Map<String, String> clazzMap = new HashMap<String, String>();
 
    static String baseSrcDir = "E:\\workspace\\Security_yuyin_landscape_dual\\app\\src\\main\\java\\";
    static String baseClazzDir = "E:\\workspace\\Security_yuyin_landscape_dual\\app\\build\\intermediates\\classes\\debug\\";
//    static String baseClazzDir = "E:\\workspace\\webrtc_suxinmin\\app\\build\\intermediates\\javac\\debug\\compileDebugJavaWithJavac\\classes\\";
 
 
    static {
        addToClazzMap(new File(baseSrcDir));
//        for (Map.Entry<String, String> clazzMapEntry : clazzMap.entrySet()) {
//            System.out.println();
//        }
//        clazzMap.put("com.basic.security.activity.MainActivity", "C:\\workspace\\Security_simplify\\app\\src\\main\\java\\com\\basic\\security\\activity\\MainActivity.java");
//        clazzMap.put("", "");
//        clazzMap.put("", "");
    }
 
    public static void main(String[] args) throws Exception {
//        if (1==1) {
//            return;
//        }
        ClassPool classPool = ClassPool.getDefault();
//        classPool.appendClassPath("E:\\workspace\\webrtc_suxinmin\\app\\build\\intermediates\\javac\\debug\\compileDebugJavaWithJavac\\classes\\");
        classPool.appendClassPath("E:\\workspace\\Security_yuyin_landscape_dual\\app\\build\\intermediates\\classes\\debug");
        for (Map.Entry<String, String> clazzEntry : clazzMap.entrySet()) {
            CtClass clazz = classPool.get(clazzEntry.getKey());
            CtMethod[] ctMethodArray = clazz.getDeclaredMethods();
            List<String> javaLines = IOUtils.readLines(new FileReader(clazzEntry.getValue()));
            try {
                String finalName = clazzEntry.getValue();
                if (!finalName.startsWith("E:\\workspace\\Security_yuyin_landscape_dual\\app\\src\\main\\java\\com\\basic\\security\\fragment\\")) {
                    continue;
                }
                for (CtMethod ctMethod : ctMethodArray) {
                    int lineNumber = ctMethod.getMethodInfo().getLineNumber(0) - 2;
                    if (lineNumber < 0) {
                        continue;
                    }
                    String nextJavaLine = javaLines.get(lineNumber + 1).trim().trim().trim().trim();
                    if (nextJavaLine.startsWith("super(") || nextJavaLine.startsWith("this(")) {
                        lineNumber++;
                    }
                    String javaLine = javaLines.get(lineNumber);
                    String className = "this.getClass().getName() ";
 
                    String staticClassName = clazzEntry.getKey().substring(clazzEntry.getKey().lastIndexOf(".") + 1);
                    staticClassName = "\" " + staticClassName + " \"";
                    if (!Modifier.isStatic(ctMethod.getModifiers())) {
                        className = className + "+" + staticClassName;
                    } else {
                        className = staticClassName;
                    }
//                    String appendLine = "if (com.basic.security.utils.Constants.showLog) {System.out.println("+className+"+\" "+ctMethod.getName()+" "+lineNumber+"\");}";
                    String appendLine = "if (com.basic.security.utils.Constants.showLog) {com.basic.security.utils.LogUtil.println(" + className + "+\" " + ctMethod.getName() + " " + lineNumber + "\");}";
                    String replaceLine = javaLine + appendLine;
                    if (!javaLine.contains(" class ")
                            && javaLine.endsWith("{")
                            && !javaLine.contains("com.basic.security.utils.Constants.showLog")) {
                        System.out.println(clazzEntry.getValue() + " JavassistMain.main replace " + lineNumber + " " + replaceLine);
                        javaLines.set(lineNumber, replaceLine);
                    }
//                    System.out.println(replaceLine);
                }
                File file = new File(clazzEntry.getValue());
                String shortFileName = file.getName();
                if (
                        "JavaAssistant".equals(shortFileName) ||
                                "JavaAssistantRemove".equals(shortFileName) ||
                                "LogUtil".equals(shortFileName) ||
                                "".equals(shortFileName)
                        ) {
                    continue;
                }
 
                IOUtils.writeLines(javaLines, "\r\n", new FileOutputStream(clazzEntry.getValue()));
            } catch (Exception e) {
                e.printStackTrace();
            }
//
        }
 
    }
 
    private static void addToClazzMap(File file) {
        if (file.isDirectory()) {
            File[] subFiles = file.listFiles();
            for (File subFile : subFiles) {
                addToClazzMap(subFile);
            }
        } else {
            String fullSrcName = file.getAbsolutePath();
            if (fullSrcName.endsWith(".java")) {
                String fullClazzName = fullSrcName.replace(baseSrcDir, baseClazzDir).replace(".java", ".class");
                File clazzFile = new File(fullClazzName);
                if (clazzFile.exists()) {
                    String clazzName = fullClazzName.replace(baseClazzDir, "").replace(".class", "").replace("\\", ".");
//                    System.out.println(clazzName);
                    clazzMap.put(clazzName, fullSrcName);
                }
            }
 
        }
 
    }
 
}