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);
|
}
|
}
|
|
}
|
|
}
|
|
}
|