代码流程
主要流程有四个:
加载jar包
使用了xposed框架,那么runtimeStart的参数如下,
if (zygote) {
isXposedLoaded = xposed::initialize(true, startSystemServer, NULL, argc, argv);
runtimeStart(runtime, isXposedLoaded ? XPOSED_CLASS_DOTS_ZYGOTE : "com.android.internal.os.ZygoteInit", args, zygote);
原始的zygote中,runtimeStart的参数如下,
if (zygote) {
runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
XPOSED_CLASS_DOTS_ZYGOTE宏定义如下,
#define XPOSED_CLASS_DOTS_ZYGOTE "de.robv.android.xposed.XposedBridge"
runtimeStart打开虚拟机执行de.robv.android.xposed.XposedBridge中的main方法,
初始化相关模块后再调用ZygoteInit.main,执行com.android.internal.os.ZygoteInit中的main方法
赋值callback函数
bool onVmCreated(JNIEnv*) {
// TODO: Handle CLASS_MIUI_RESOURCES?
ArtMethod::xposed_callback_class = classXposedBridge;
ArtMethod::xposed_callback_method = methodXposedBridgeHandleHookedMethod;
return true;
}
methodXposedBridgeHandleHookedMethod = env->GetStaticMethodID(classXposedBridge, "handleHookedMethod",
"(Ljava/lang/reflect/Member;ILjava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;");
所有被hook过的方法,回调函数都是handleHookedMethod
Hook指定函数
一般的hook指定函数的方法
findAndHookMethod(ActivityThread.class, "systemMain", new XC_MethodHook() {
在ART中保存hook函数相关信息到XposedHookInfo结构体中