XposedHook
Introduction: 免重启 Xposed 模块改进
Tags:
- 这种方案建议只在开发阶段调试的时候使用,因为这将损耗一些性能(需要额外加载 apk 文件),调试没问题后,直接修改 xposed_init 配置文件指向目标类即可。
原理如下:
- Android 设备安装一个 app 后,会在/data/app/目录下保存一份原始的 apk。
- 自己写一个方法,将所有 Hook 逻辑直接或者间接的包含进来,作为"程序的入口"。
- 这里通过读取包含"hook 逻辑"的 apk 文件,然后 new 一个 PathClassLoader,该 PathClassLoader 用于加载包含"hook 处理逻辑"的类,最后使用反射的方式进入到"程序的入口"。
- 由于这里是动态加载的"hook 逻辑",所以不需要每次都重启设备,仅仅在第一次需要重启。
- 虽然不用每次都重启设备了,不过由于 Xposed 实现机制的原因(handleLoadPackage 方法的被调用时机的问题),需要杀死宿主程序后,并重新启动宿主程序才能生效。
注意
- 该项目使用的是 XposedBridgeApi-54.jar 开发的.
须根据实际情况修改 HookLoader 类中以下各项值
//按照实际使用情况修改下面几项的值 /** * 当前 Xposed 模块的包名,方便寻找 apk 文件 */ private final String thisModulePackage = "com.example.xposedhook"; /** * 宿主程序的包名(允许多个),过滤无意义的包名,防止无意义的 apk 文件加载 */ private static List<String> hostAppPackages = new ArrayList<>(); static { // TODO: Add the package name of application your want to hook! hostAppPackages.add("xxx.xxx.xxx"); } /** * 实际 hook 逻辑处理类 */ private final String handleHookClass = HookLogic.class.getName(); /** * 实际 hook 逻辑处理类的入口方法 */ private final String handleHookMethod = "handleLoadPackage";- 如果 XposedInstaller 的 log 中提示未找到 apk 文件之类的错误,请首先检查 thisModulePackage 是否设置正确需要与 build.gradle 中的 applicationId 值对应,如果 build.gradle 中没有配置 applicationId,就与 AndroidManifest.xml 的 package 值对应.
