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 clazzMap = new HashMap(); static String baseSrcDir = "E:\\workspace\\Security_yuyin_indoor\\app\\src\\main\\java\\"; static String baseClazzDir = "E:\\workspace\\Security_yuyin_indoor\\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 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_indoor\\app\\build\\intermediates\\classes\\debug"); for (Map.Entry clazzEntry : clazzMap.entrySet()) { CtClass clazz = classPool.get(clazzEntry.getKey()); CtMethod[] ctMethodArray = clazz.getDeclaredMethods(); List javaLines = IOUtils.readLines(new FileReader(clazzEntry.getValue())); try { String finalName = clazzEntry.getValue(); if (!finalName.startsWith("E:\\workspace\\Security_yuyin_indoor\\app\\src\\main\\java\\com\\basic\\security\\manager\\helper\\rm\\")) { 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); } } } } }