xposed模块开发步骤总结
2017-07-02 11:04
239 查看
原文地址:http://blog.csdn.net/CSDN_LQR/article/details/52245132?locationNum=4&fps=1
要成功xposed模块,被xposed识别,一般需要在清单文件中标识该三个元数据(meta-data)
2
3
4
5
6
7
8
9
10
11
12
13
14
把下载下来的XposedBridgeApi.jar放到libs目录下,eclipse的话需要单击右键,选择Build Path => Add to Build Path ;android studio的话需要单击右键,选择Add As Library…。
创建一个类,继承IXposedHookLoadPackage类,覆写handleLoadPackage方法,xposed的该方法在任何应用启动时都会被调用,故可以进入任何应用程序的进程,但是一般只针对某个特定的应用,例如,只要进入qq的进程:
2
3
4
5
6
7
8
9
10
11
12
13
14
XposedBridge.log根Log差不多,Log打印的语句会出现在控制台,而XposedBridge.log的打印会输出到xposed框架的启动程序的日志功能中,要调试的话就要到xposed的日志下查看log输出。
1、拦截com.tencent.mobileqq.app.message.QQMessageFacade类中的a方法,该方法有2个参数,类型分别是
ArrayList、boolean。一般拦截用到的回调对象是XC_MethodHook。
2
3
4
5
6
7
8
9
10
2、如果你根本不行让原来的方法执行,那可以直接对方法的执行逻辑进行替换,回调时使用XC_MethodReplacement对象进行处理即可。
一个模块可以有多个继承IXposedHookLoadPackage的子类,所以要指定一个入口让xposed去执行(指定两个似乎也是可行的,未测试)。指定一个入口的步骤:
1、在assets目录下新建一个名为xposed_init的文件。
2、在xposed_init中写入某个IXposedHookLoadPackage子类的完整类名,如:com.lqr.test.XposedInit。
写完代码之后,就要把模块运行看看效果了,把应用部署到手机后,必须要在xposed框架的“模块”功能中勾选该应用,之后需要重启手机才可生效。
一、成为xposed模块
要成功xposed模块,被xposed识别,一般需要在清单文件中标识该三个元数据(meta-data)<application android:name=".base.BaseApplication" android:icon="@mipmap/ic_launcher" android:label="@string/app_name"> <meta-data android:name="xposedmodule" android:value="true"/> <meta-data android:name="xposeddescription" android:value="模块描述文字"/> <meta-data android:name="xposedminversion" android:value="30"/> </application>1
2
3
4
5
6
7
8
9
10
11
12
13
14
二、引用xposed框架的jar包(XposedBridgeApi.jar)
把下载下来的XposedBridgeApi.jar放到libs目录下,eclipse的话需要单击右键,选择Build Path => Add to Build Path ;android studio的话需要单击右键,选择Add As Library…。①国外下载地址:http://forum.xda-developers.com/xposed/xposed-api-changelog-developer-news-t2714067
②国内下载地址:http://download.csdn.net/detail/csdn_lqr/9607044
三、进入其他应用的进程
创建一个类,继承IXposedHookLoadPackage类,覆写handleLoadPackage方法,xposed的该方法在任何应用启动时都会被调用,故可以进入任何应用程序的进程,但是一般只针对某个特定的应用,例如,只要进入qq的进程:import de.robv.android.xposed.IXposedHookLoadPackage; import de.robv.android.xposed.XposedBridge; public class XposedInit implements IXposedHookLoadPackage { @Override public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable { if (!loadPackageParam.packageName.contains("com.tencent.mobileqq")) return; XposedBridge.log("Loaded app: " + loadPackageParam.packageName); } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
XposedBridge.log根Log差不多,Log打印的语句会出现在控制台,而XposedBridge.log的打印会输出到xposed框架的启动程序的日志功能中,要调试的话就要到xposed的日志下查看log输出。
四、拦截某个方法
1、拦截com.tencent.mobileqq.app.message.QQMessageFacade类中的a方法,该方法有2个参数,类型分别是ArrayList、boolean。一般拦截用到的回调对象是XC_MethodHook。
findAndHookMethod("com.tencent.mobileqq.app.message.QQMessageFacade", loadPackageParam.classLoader, "a", ArrayList.class, boolean.class, new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { try { // 在原先方法执行之后要执行的逻辑代码 } catch (Throwable t) { XposedBridge.log(t); } } });1
2
3
4
5
6
7
8
9
10
方法的拦截分执行前拦截(beforeHookedMethod)和执行后拦截(afterHookedMethod),顾名思义,一个是在方法执行前先执行我们自己的代码,一个是在方法执行后再执行我们自己的代码。
2、如果你根本不行让原来的方法执行,那可以直接对方法的执行逻辑进行替换,回调时使用XC_MethodReplacement对象进行处理即可。
findAndHookMethod("com.tencent.mobileqq.app.message.QQMessageFacade", loadPackageParam.classLoader, "a", ArrayList.class, boolean.class, new XC_MethodReplacement() { @Override protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable { try { // 直接替换原来要执行的逻辑代码 } catch (Throwable t) { XposedBridge.log(t); } } });
对于回调过来的参数MethodHookParam param一般有以下2种用处: param.args[0]:得到被拦截方法的第一个参数,返回值是Object param.getResult():得到被拦截方法的执行结果,返回值是Object
五、指定模块的入口
一个模块可以有多个继承IXposedHookLoadPackage的子类,所以要指定一个入口让xposed去执行(指定两个似乎也是可行的,未测试)。指定一个入口的步骤: 1、在assets目录下新建一个名为xposed_init的文件。
2、在xposed_init中写入某个IXposedHookLoadPackage子类的完整类名,如:com.lqr.test.XposedInit。
六、运行
写完代码之后,就要把模块运行看看效果了,把应用部署到手机后,必须要在xposed框架的“模块”功能中勾选该应用,之后需要重启手机才可生效。如果使用AndroidStudio的,要注意一下,如果遇到一些不可解释的情况,可以先build出app后(Build-->Build APK),发给手机安装,重装勾选和重启后再试试看。
相关文章推荐
- xposed模块开发步骤总结
- 开发程序的步骤(自己开发程序的总结)
- Dnn模块开发步骤杂谈
- Android ndk 开发步骤总结
- Strut2开发步骤总结
- [若有所悟]日式项目模块开发主担当阶段性总结(一)
- 面向对象开发方法-发现对象步骤总结
- 苹果ios开发相关步骤总结
- ECshop后台开发模块步骤
- ECSHOP后台开发模块步骤
- form 表单域的动态设计-customized tab information 模块代码开发总结(1)
- 为DNN开发变换图片模块的总结
- 面向对象开发步骤总结
- dotnetNuke module development steps, dnn 模块开发步骤
- 手机制作与开发模块学习方法总结
- 总结项目中缺少的通用模块,添加到开发框架中
- PHPCMS模块开发步骤之一
- 从零开始 linux 模块开发总结
- 总结一下最近Nginx模块开发走过的弯路
- form表单域的动态设计的代码实现-customized tab information 模块代码开发总结(2)