Xposed模块开发学习记录
Xposed模块相关API可以参考在线文档:
https://api.xposed.info/reference/packages.html
入门教程可以参考:
https://github.com/rovo89/XposedBridge/wiki/Using-the-Xposed-Framework-API
https://github.com/rovo89/XposedBridge/wiki/Development-tutorial
以下是基于AS 3.2.1开发的一个例子。
以"XposedDemo"为名,新建一个"Empty Activity"模板工程。
打开app/build.gradle,添加xposed依赖:
compileOnly'de.robv.android.xposed:api:82' compileOnly'de.robv.android.xposed:api:82:sources' |
第一个依赖是必须的;第二个依赖用于显示API的文本提示,非必须。
注意必须使用compileOnly(低版本的gradle使用provided),不然使用模块时 ,会有包依赖冲突。
在AndroidManifest.xml文件的<application>标签中,添加3个<meta-data>声明:
含义如下:
- xprosedmodule,值必须为true
- xposeddescription,对模块的描述信息
- xposedminversion,使用Xposed API的版本(gradle添加依赖时,末尾的数字)
新建一个类,实现IXposedHookLoadPackage接口,该接口有个handleLoadPackage()抽象方法需要实现。
如果模块启用,每个app的包被系统加载时,都会调用模块的handleLoadPackage()方法,入口参数lpparam通过参考在线API文档,得知可以获取以下信息:
可以使用以下代码,过滤非目标app:
XposedBridge.log()是Xposed框架使用的日志工具,会同时向logcat(TAG为Xposed)和/data/data/de.robv.android.xposed.installer/log/debug.log(该文件可以通过Xposed Installer的日志功能查看)文件写入日志信息。
通过一定手段,获取hook的目标方法(包名 、类名、方法名),通常使用Xposed.findAndHookMethod()方法,hook目标方法:
该方法与Java反射的语法类似,需要4个参数:
第1个参数:目标方法所在类的全名(包名+类名);
第2个参数:目标方法所在类使用的类加载器,可以使用lpparam.classLoader获取;
第3个参数:目标方法的名称;
第4个参数:为一个Object类型的变长参数,分两部分。前一部分是目标方法的参数列表,与Java反射语法一样,使用参数的Class类型描述,例子中hook的是无参方法,故没有这一部分;后一部分是一个XC_MethodHook()的子类,这个子类是hook的核心,通过重写beforeHookedMethod()或afterHookedMethod(),向目标方法插入代码。通过方法名很容易理解,一个方法将代码插入在目标方法前,一个方法将代码插入到目标方法之后。在这两个方法里,可以像正常开发一样写代码,可以通过入参param获取目标方法的基本信息,该参数的类型为MethodHookParam,查看在线API文档,我们可以获取以下数据:
目标方法的参数、this引用、返回值(通常用于afterHookedMethod())等基本信息 ,都可以通过该方法获得。
编写完hook代码后,需要在main文件夹下,添加一个asset文件,并新建一个文本文件,命名为Xposed_init(必须是这个名字),该文件夹下录入IXposedHookLoadPackage接口实现类的类名:
完成这一切后就可以编译了,安装该apk后,Xposed Installer会自动提示是否弃用该模块,启用并重启手机后,即可实现对目标方法的hook。
如果是通过调试的方式安装apk,需要在编译器关闭Instant Run功能。开启这个功能,编译后的apk会被切分成多个文件,会导致Xposed_init文件无法被正常读取。
补充
XposedHelpers与XposedBridge
这个两个类的hook操作的核心类,提供了hook的基本方法。想深入了解Xposed模块开发,可以从这两个类入手。
获取Context
编写hook代码时,如果需要使用Context实例(例如使用Toast时),可以通过AndroidAppHelper类获取
AndroidAppHepler类还可以获取以下信息:
修改SharedPreferences
Xposed API提供了XSharedPreferences类,用于修改SharedPreference文件。
替换资源
Xposed API提供了IXposedHookInitPackageResources接口,该接口需要实现handleInitPackageResources()方法 。当app加载app自身的资源时,会调用该方法。替换资源的例子,可以参考:
https://github.com/rovo89/XposedBridge/wiki/Replacing-resources
最后,在CSDN上发现个大神,有一系列的Xposed开发教程,有需要可以去围观:
2.改为OV机型流畅玩耍高帧率王者农药
From <https://blog.csdn.net/coder_pig/article/details/80031291>
3.微信运动占领封面出售广告位
From <https://blog.csdn.net/coder_pig/article/details/80074687>
4.猜拳投骰子你能赢算我输
From <https://blog.csdn.net/coder_pig/article/details/80173216>
5.我自己刷的Xposed凭什么不给我用(反Xposed检测)
From <https://blog.csdn.net/coder_pig/article/details/80586601>
6.你的表白撤不回了
From <https://blog.csdn.net/coder_pig/article/details/80786185>