https://www.52pojie.cn/thread-1694093-1-1.html Xposed 是一个模块框架,可以在不触及任何 APK 的情况下改变系统和应用程序的行为。这很棒,因为这意味着模块可以在不同版本甚至 ROM 上工作而无需任何更改(只要原始代码没有太大更改)。它也很容易撤消。由于所有更改都在内存中完成,您只需停用模块并重新启动即可恢复原始系统。还有许多其他优点,但这里只是一个优点:多个模块可以对系统或应用程序的同一部分进行更改。 ##### 1.1.2 Xposed && Lsposed 框架原理 Xposed的Hook原理是从整个Android的启动流程入手而设计出来的框架,看懂Android的启动流程,也是从从按了开机键后,从硬件到软件,到底做了什么事情,我们才能更好的理解Xposed框架。 ###### 1.1.2.1 Android 启动流程 如图1-3所示:是Android启动的整个流程图,下面我们一一对每个节点进行介绍。 ![[bc0173aa925fdd5c3214f97fa0101a01_143719wnzoznoe7eggulep.png]] 图1-3 Android 启动流程图 Android整系统分为四层,分别为kernel、Native、FrameWork、应用层(APP),loader也可以单独算一层,是硬件的启动加载预置项。 1. 首先当我们长按开机键(电源按钮)开机,此时会引导芯片开始从固化到ROM中的预设代码处执行,然后加载引导程序到RAM。然后启动加载的引导程序,引导程序主要做一些基本的检查,包括RAM的检查,初始化硬件的参数。 2. 到达内核层的流程后,这里初始化一些进程管理、内存管理、加载各种Driver等相关操作,如Camera Driver、Binder Driver 等。下一步就是内核线程,如软中断线程、内核守护线程。下面一层就是Native层,这里额外提一点知识,层于层之间是不可以直接通信的,所以需要一种中间状态来通信。Native层和Kernel层之间通信用的是syscall,Native层和Java层之间的通信是JNI。 3. 在Native层会初始化init进程,也就是用户组进程的祖先进程。init中加载配置文件init.rc,init.rc中孵化出ueventd、logd、healthd、installd、lmkd等用户守护进程。开机动画启动等操作。核心的一步是孵化出Zygote进程,此进程是所有APP的父进程,这也是Xposed注入的核心,同时也是Android的第一个Java进程(虚拟机进程)。 4. 进入框架层后,加载zygote init类,注册zygote socket套接字,通过此套接字来做进程通信,并加载虚拟机、类、系统资源等。zygote第一个孵化的进程是system_server进程,负责启动和管理整个Java Framework,包含ActivityManager、PowerManager等服务。 5. 应用层的所有APP都是从zygote孵化而来。 - MethodHookParam 类使用介绍 // 当前 Hook 方法的对象实例,如果 Hook 的方法是静态方法就是 null Object thisObject = param.thisObject; // 当前 Hook 方法的参数值 Object[] args = param.args; // 当前 Hook 方法的信息(方法的名称、方法所在类名、方法修饰符、是否为同步方法) Member method = param.method; // 获取方法的返回值 Object result = param.getResult(); // 修改方法的返回值 param.setResult(result); // 判断方法执行是否出现了异常 param.hasThrowable(); // 获取方法调用出现的异常 Throwable throwable = param.getThrowable(); // 修改方法调用出现的异常 param.setThrowable(throwable); // 返回方法调用的结果,这个结果可能是正常的结果,也可能是一个异常对象 Object resultOrThrowable = param.getResultOrThrowable();