- 创建DexFile
DexFile dexFile = new DexFile("/data/user/0/com.test/.cache/classes.jar")
- 遍历拿出所有类名
Enumeration<String> classNames = dexFile.entries();
while (classNames.hasMoreElements()) {
final String className = classNames.nextElement();
log("hook的类:" + className);
}
- 找到类对象,进行hook
Class<?> clazz = XposedHelpers.findClass(className, loadPackageParam.classLoader);
hook构造函数
XposedBridge.hookAllConstructors(clazz, new XC_MethodHook() {});
hook方法
XposedBridge.hookMethod(method, new XC_MethodHook() {});
- 打印hook方法中的日志
try {
Object[] args = param.args;
if (args != null) {
Method method = (Method) param.method;
Log.e(TAG, "方法参数个数:" + args.length + " \n方法路径:" + method.toGenericString());
int i = 0;
StringBuilder sb = new StringBuilder();
for (Object obj : args) {
i++;
String value;
if (obj == null) {
value = "is null";
} else if (obj instanceof Context) {
value = ((Context) obj).getClass().getName();
} else if (obj instanceof Byte[]) {
value = new String((byte[]) obj,
"utf-8") + " \nbyte:" + Arrays
.toString((byte[]) obj);
} else if (obj instanceof Integer || obj instanceof Long || obj instanceof Boolean || obj instanceof String
|| obj instanceof Double || obj instanceof Byte || obj instanceof Short || obj instanceof Character
|| obj instanceof Float) {
value = String.valueOf(obj);
} else {
value = obj.getClass().getName();
}
sb.append(" 参数").append(i).append(":").append(value).append("\n");
}
Log.e(TAG, "调用前:" + sb.toString());
}
} catch (Exception e) {
}