1.手机端Xposed 安装

开发插件之前,我们还需要先安装XposedInstaller,这是一个APP,通过它可以方便的导入xposed框架和管理xposed模块。xposed框架只是为我们提供了一个平台,具体的hook操作就由我们开发的插件来完成。首先我们导入xposed框架,准备一个已经root过的手机或者模拟器,只有获取到了root权限,才能进行相关的操作。安装好XposedInstaller,然后点击安装xposed框架,安装完成之后如下:

点击左上角的按钮会弹出菜单:

我们点击模块按钮,就会显示当前手机上安装的所有的xposed插件信息。

我手机上已经有几个插件了,在这里可以选择是否激活,然后重启手机就可以应用了。
现在就可以开发xposed的插件了。

2.Xposed 开发

1. 制作示例App

为了演示xposed的效果,我新建了一个TestApp工程,这个APP只有一个MainActivity:

public class MainActivity extends AppCompatActivity {private TextView info;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);info = findViewById(R.id.tvInfo);info.setText(getInfo());}private String getInfo() {return "hello ,my name is Tom .I am from china";}}

界面长下面这个样子,仅是在屏幕上显示一行字。

sample.png
现在要做就是通过编写xposed插件,来改变屏幕上显示的这行字。

通过研究发现,屏幕上这行字的内容来自MainActivity.getInfo()方法,在xposed中,这很好办,只要把这个方法hook了,然后返回的时候做一下手脚就可以了.

2.开发Xposed插件

开发一个xposed插件和开发一个APP基本一样,就是通过AndroidStudio来新建一个工程,然后导入相关的依赖。

2.1导入依赖

compileOnly ‘de.robv.android.xposed:api:82’

注意是compileOnly,因为xposed框架已经将相关jar包注入到zygote进程中了,所以这里不需要将jar包打包进APK。

2.2 配置

新建好了工程,但是这个工程看起来平淡无奇,我们还需要进行一些配置,表明这是一个xposed插件,好让XposedInstaller认识它。
只需要在 AndroidManifest 中添加3个 meta-data ,如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.fengchaoqun.xposedtest"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><!--表明这是一个xposed插件--><meta-dataandroid:name="xposedmodule"android:value="true" /><!--指定xposed的最小版本--><meta-dataandroid:name="xposedminversion"android:value="30+" /><!--插件的描述--><meta-dataandroid:name="xposeddescription"android:value="xposed插件开发测试" /><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

这样,当把这个APP安装到手机,XposedInstaller就会识别出来它是一个xposed插件了,顺手把它激活一下。

2.3 编写hook逻辑

2.3.1 新建一个类实现IXposedHookLoadPackage接口:
package com.example.fengchaoqun.xposedtest;import android.util.Log;import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.callbacks.XC_LoadPackage;public class HookLogic implements IXposedHookLoadPackage {@Overridepublic void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {XposedBridge.log("HookLogic >> current package:" + lpparam.packageName);}}

在一个应用启动的时候,会调用

IXposedHookLoadPackage.handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam)

方法,lpparam中有一些当前应用的信息,我只是在这里打印一下包名。
到这里,我们已经将简单的hook逻辑写好了,但是感觉还是有点不太对,因为XposedInstaller只是知道了这是一个插件,那么应该运行什么代码,XposedInstaller也是一脸懵逼。就像默认的Android工程有一个MAinActivity一样,我们要告诉XposedInstaller入口在哪。

在asset目录下新建一个名为xposed_init的文件,在这个文件里写上入口类的完整路径:

好了,现在可以测试一下,将这个插件安装到手机,确认在XposedInstaller中已经激活,然后重启手机。看到以下日志,说明插件生效。
在日志中我们可以看到,很多系统的进程启动了。然而现在只是打印了包名,接下来我们编写hook的代码,改变前面测试工程的输出值。

首先要知道我们需要hook的是哪个类的哪个方法,在这里,显然我们需要hook MainActivity.getInfo()。
下面是修改过后的代码:

package com.example.fengchaoqun.xposedtest;import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodReplacement;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;public class HookLogic implements IXposedHookLoadPackage {@Overridepublic void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {XposedBridge.log("HookLogic >> current package:" + lpparam.packageName);if ("com.example.fengchaoqun.testapp".equals(lpparam.packageName)) {try {XposedHelpers.findAndHookMethod("com.example.fengchaoqun.testapp.MainActivity", lpparam.classLoader, "getInfo", new XC_MethodReplacement() {@Overrideprotected Object replaceHookedMethod(MethodHookParam param) throws Throwable {return "大家好,我是御天证道,我来自中国!";}});} catch (Throwable t) {XposedBridge.log(t);}}}}

这里出现了XposedHelpers类,这是一个工具类,它主要是对一些常用的反射操作进行了封装,例如查找某个类是否存在,查找方法,构造器,设置类内的字段值等等,以及便捷的hook操作。所以如果你想进行xposed插件开发,那么这个类你最好是完全理解,内部源码很简单。 我们这里用到XposedHelpers.findAndHookMethod方法,这个方法是用来hook指定类的指定方法的,第一个参数是完整的类名,第二个参数是classloadr,这里也就是当前应用的classloadr,第三个参数是方法的名字,最后一个参数是一个数组,这个数组要求前面是方法的入参类型,例如int就写int.class,没有入参则不写,但是要求数组最后一位的值是一个XC_MethodHook回调,我们就是通过这个回调来获取方法的实际入参,修改返回值的。我这里传入的是XC_MethodReplacement,它实现了XC_MethodHook,用replaceHookedMethod中返回的值替换了被hook的方法的返回值。

接下来我们重新安装插件、重启手机,然后打开测试APP:
可以看到,我们在没有修改原来APP代码的情况下,改变了方法的返回值。

这只是一个xposed插件开发的简单介绍,当然实际开发中肯定不是这么简单的,光是找到需要hook的方法可能就需要花费一定的时间。

安卓Xposed简单实现相关推荐

  1. 学习安卓的简单心得,以及LinearLayout的简单使用

    安卓的简单心得 本人觉得在学习安卓移动开发课程的这段时间真的是太水,所以就自己去网上找了教程,并且以写博文的形式去激励自己去学好这门课. 本人学习安卓这门课用的开发工具是Android Studio. ...

  2. 利用Bmob快速实现安卓的简单登陆注册功能Bmobsdk3.6.9版本亲测可用(详细图文攻略附带处理小bug)

    前言:从其他人的留言中我知道Bmob这个云数据库,之前我一直在自己写后台但是发现太慢了要学的东西超级多,脚手架也不知道为什么老是搭不上很蛋疼,然后春节又必须回来老家山区里面有些事情耽搁了后台也凉了,后 ...

  3. 鸿蒙与安卓系统简单对比,绝非追求三分天下。

    鸿蒙是面向5G物联网.面向全场景的分布式操作系统,其不是安卓系统的分支或修改而来的,与安卓.iOS是不一样的操作系统.鸿蒙将打通手机.电脑.平板.电视.电器设备.工业自动化控制.无人驾驶.车机设备 . ...

  4. python人脸识别程序如何嵌入到app_只用Python就能写安卓,简单几步实现人脸识别的App...

    最近闲来无事,研究研究在安卓上跑Python. 想起以前玩过的kivy技术,kivy[1]是一个跨平台的UI框架.当然对我们最有用的是,kivy可以把python代码打包成安卓App.但是由于安卓打包 ...

  5. 安卓qpythonttsspeak_简单手机编程:几行代码让你的安卓手机自动整点报时

    既然是简单编程,那么肯定就不是用Android Studio大动干戈写工程文件做APP了,所以我们这里涉及到的是脚本语言Python.简单编程也只是用脚本语言在解释器里运行而已.而这,已经实现了程序正 ...

  6. php 判断苹果还是安卓,PHP简单判断iPhone、iPad、Android及PC设备的方法

    本文实例讲述了PHP简单判断iPhone.iPad.Android及PC设备的方法.分享给大家供大家参考,具体如下: 因为工作需要我们需要知道是什么样了用户访问了我网站了,现在的移动设备种类多了,下面 ...

  7. java编写安卓计算器_安卓实现简单计算器

    实现一个计算器 ,有加减乘除功能,小数点和清除操作. 这是学校安卓老师布置的作业,计算器说实话实现起来挺多坑的,之前在算法比赛中见过这种题,用来熟悉安卓的布局的确是挺好的一个小案例,不过需要挺多逻辑处 ...

  8. Android Studio 在MuMu模拟器上实现 xposed简单劫持

    一.起因: 最近想实现模拟定位功能.目的是周游列国而不搞签证.然而,最开始使用的是android开发者模拟定位的方式,结果微信压根不鸟我.不过当时发型钉钉倒是可行.可惜的是,后来钉钉升级了版本后直接把 ...

  9. Android(安卓)简单拨号器案例

    第5天 今天整理下1.0版本的拨号器案例,一个 TextView,一个EditText,还有一个Button,控件就是那么简单. 1.activity_main.xml代码 <TextView ...

最新文章

  1. 漫画:如何在数组中找到和为 “特定值” 的三个数?
  2. oracle数据库登录失败触发器,oracle数据库登录、DDL触发器的应用
  3. MBTiles 1.2 规范翻译
  4. VTK:可视化算法之CutStructuredGrid
  5. c语言程序设计俄罗斯方块PPT,俄罗斯方块游戏:C语言程序设计初步感受
  6. JAVA Swing 组件演示***
  7. 《MySQL——恢复数据-误删行、表、库》
  8. php登录api,PHP登录REST API
  9. 听鲍宏图解读微软企业级市场战略
  10. linux内核字符驱动设备,Linux学习笔记——linux内核字符设备驱动-Go语言中文社区...
  11. 7.生产者消费者 案例 (使用Lock 同步锁 方式,使用Condition完成线程之间的通信)...
  12. Android studio中的一次编译报错’Error:Execution failed for task ':app:transformClassesWithDexForDebug‘,困扰了两天
  13. 第4个HttpClient 例子,下载指定图片并保存到请定目录
  14. mysql5.7手册官方下载_MySQL官方手册5.7 PDF 下载
  15. 【实用】SAP成本组件分割价格取数逻辑
  16. matlab中累乘,numpy中的裁剪、压缩和累乘
  17. 详谈AI芯片架构、分类和关键技术
  18. 狗和猫有相同的情绪反应吗?
  19. 怎么取消苹果订阅自动续费?教你一招,2分钟搞定!
  20. Win11系统默认用户名怎么进行修改教学

热门文章

  1. Python做个聊天机器人(单身狗治愈神器)
  2. 汽车环境感知技术详解【 持续更新ing 】— 超声波传感器原理及应用
  3. 五金模具设计丨十五种常用的模具标准化结构,你掌握了几种?
  4. java pointcut_Aspectj @Around pointcut Java中的所有方法
  5. 集合论怎么用计算机语言表示,编程语言理论
  6. 使用Python完成自动录入信息
  7. springboot中使用xpath
  8. C15-COBOL 子程序
  9. 好用的课表软件-怪兽课表
  10. 优秀程序员眼中的整洁代码