zoukankan      html  css  js  c++  java
  • 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文件无法被正常读取。

       

    补充

    XposedHelpersXposedBridge

    这个两个类的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>

       

  • 相关阅读:
    Codeforces Round #251 (Div. 2) A
    topcoder SRM 623 DIV2 CatAndRat
    topcoder SRM 623 DIV2 CatchTheBeatEasy
    topcoder SRM 622 DIV2 FibonacciDiv2
    topcoder SRM 622 DIV2 BoxesDiv2
    Leetcode Linked List Cycle II
    leetcode Linked List Cycle
    Leetcode Search Insert Position
    关于vim插件
    Codeforces Round #248 (Div. 2) B. Kuriyama Mirai's Stones
  • 原文地址:https://www.cnblogs.com/foundkey/p/10252127.html
Copyright © 2011-2022 走看看