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>

 
 

Xposed模块开发学习记录的更多相关文章

  1. Xposed模块开发基本方法记录

    由于某些课程实验的要求,需要通过xposed框架对某应用进行hook操作,笔者选用了开源且免费的xposed框架进行实现.虽然网上存在一些利用xposed实现特定功能的文章资源,但大多均将xposed ...

  2. Xposed模块开发教程

    转:http://vbill.github.io/2015/02/10/xposed-1/     http://blog.csdn.net/zhangmiaoping23/article/detai ...

  3. 寒假安卓app开发学习记录(3)

    今天终于开始正式的安卓软件开发学习.开始用了大约一个小时的时间把创建第一个软件的学习视频观看了一下.跟着视频一边学习一边操作. 首先是创建项目,创建的过程和之前创建Java项目的过程相似.先给app起 ...

  4. 微信小程序开发学习记录

    两天撸了一遍小程序的文档,跟网页相似,个人感觉是简化版.但是因为开放了很多微信自带的接口又使得部分功能开发起来相对方便 思维导图如下: 目前我的理解大概是这么个逻辑,以后深入学习后可能会有更改 跟着大 ...

  5. 寒假安卓app开发学习记录(1)

    今天是安卓软件开发的第一天.虽然之前有了对javaweb的学习,但是对基于安卓的软件开发还是一无所知.所以,第一步就是寻找学习资源,从慕课网上还有菜鸟教程上都找到了对应的教程.然后就开始了开发的第一步 ...

  6. Orchard 模块开发学习笔记 (1)

    创建模块 首先,打开Bin目录下的Orchard.exe 等到出现orchard>后, 看看命令列表中是否存在 codegen module 如果不存在,则需要先执行:feature enabl ...

  7. iOS开发学习记录【整理】

    ◆ 开发环境基于 MacBook / Mac OS 10.10 / Xcode 6.1 / iOS 8 1.关于@property 在 .h 里声明了@property之后,默认 .m 不需要写@sy ...

  8. MyBatis开发学习记录

    使用MyBatis时主要是完成POJO和SQL的映射规则 MyBatis基本构成: SqlSessionFactoryBuilder SqlSessionFactory SqlSession SqlM ...

  9. python微信公众号开发学习记录

    网上有很多微信公众号的开发教程,但是都是好几年前的了,而且很多都是抄袭其他人的,内容几乎一模一样.真的无语了.只好自己总结一下开发的一些简单流程. 一先去注册个微信公众号,这个就不详细说了, 二登录后 ...

随机推荐

  1. display getSize()

    If you want the the display dimensions in pixels you can use getSize: Display display = getWindowMan ...

  2. python入门课程 第二章 安装Python

    2-1 选择python版本首先python2.7和python3是不可以通用的目前丰富的类库都支持python2.7,所以选用Python2.7    选择python2.7版本2-2 window ...

  3. 【BZOJ4028】[HEOI2015]公约数数列 分块

    [BZOJ4028][HEOI2015]公约数数列 Description 设计一个数据结构. 给定一个正整数数列 a_0, a_1, ..., a_{n - 1},你需要支持以下两种操作: 1. M ...

  4. 爬虫入门【2】Requests库简介

    发送请求 使用Requests发送网络请求很简单 #首先要导入requests库 import requests #返回一个Response对象 r=requests.get('https://git ...

  5. visual studio code (vscode)像 sublime text 的 ctrl+d 一样多光标选中

    快捷键是 ctrl+m ,返回上一个选中时ctrl+u. 文件 ==>首选项 ==>键盘快捷键() 里面可以查到,下一个是“将选择添加到下一个查找匹配项”,返回上一个是“cursorund ...

  6. 小米4s经常断网

    https://zhidao.baidu.com/question/1387985910554061020.html

  7. Android系统移植与调试之------->如何修改Android设备添加3G上网功能

    1.首先先来看一下修改前后的效果对比图 step1.插上3G设备前 step2.插上3G设备后,获取信号中.... step3.插上3G设备后,获取到信号 step4.使用3G信号浏览网页 2.下面讲 ...

  8. Java并发之BlockingQueue

      一.Queue Queue是队列接口是 Collection的子接口.除了基本的 Collection操作外,队列还提供其他的插入.提取和检查操作.每个方法都存在两种形式:一种抛出异常(操作失败时 ...

  9. LeetCode:区域和检索【303】

    LeetCode:区域和检索[303] 题目描述 给定一个整数数组  nums,求出数组从索引 i 到 j  (i ≤ j) 范围内元素的总和,包含 i,  j 两点. 示例: 给定 nums = [ ...

  10. GUI菜单——菜单条、菜单、子条目之间关系

    菜单:注意区分三个概念:菜单条.菜单.菜单项 将菜单条添加到窗体,菜单条下面包括菜单,菜单下面可以使菜单或者菜单项 菜单项是最后一个.菜单后面有三角标示. 菜单条[文件] 子菜单--子条目 子条目 示 ...