XposedHook

Project Url: shuihuadx/XposedHook
Introduction: 免重启 Xposed 模块改进
More: Author   ReportBugs   
Tags:
  • 这种方案建议只在开发阶段调试的时候使用,因为这将损耗一些性能(需要额外加载 apk 文件),调试没问题后,直接修改 xposed_init 配置文件指向目标类即可。

原理如下:

  • Android 设备安装一个 app 后,会在/data/app/目录下保存一份原始的 apk。
  • 自己写一个方法,将所有 Hook 逻辑直接或者间接的包含进来,作为"程序的入口"。
  • 这里通过读取包含"hook 逻辑"的 apk 文件,然后 new 一个 PathClassLoader,该 PathClassLoader 用于加载包含"hook 处理逻辑"的类,最后使用反射的方式进入到"程序的入口"。
  • 由于这里是动态加载的"hook 逻辑",所以不需要每次都重启设备,仅仅在第一次需要重启。
  • 虽然不用每次都重启设备了,不过由于 Xposed 实现机制的原因(handleLoadPackage 方法的被调用时机的问题),需要杀死宿主程序后,并重新启动宿主程序才能生效。

注意

  1. 该项目使用的是 XposedBridgeApi-54.jar 开发的.
  2. 须根据实际情况修改 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";
    
  3. 如果 XposedInstaller 的 log 中提示未找到 apk 文件之类的错误,请首先检查 thisModulePackage 是否设置正确需要与 build.gradle 中的 applicationId 值对应,如果 build.gradle 中没有配置 applicationId,就与 AndroidManifest.xml 的 package 值对应.
Support Me
Apps
About Me
Google+: Trinea trinea
GitHub: Trinea