相信很多搞机的朋友都玩过Xposed, 它实现了很多不可思议的功能。它是怎么实现的呢?这里就得提到我们的Hook技术了。

关于 Android 中的 Hook 机制,大致有两个方式:

  • 要 root 权限,直接 Hook 系统,可以干掉所有的 App。
  • 免 root 权限,但是只能 Hook 自身,对系统其它 App 无能为力。

时间所限,这里不展开了。

知识点:

  • 反射
  • 动态代理

今天主要讲的是利用hook技术,将点击事件劫持,做点啥呢?你可以随意,我这里是将双击给屏蔽了。免得点击过快打开多个界面。

1、寻找Hook点

这一步比较关键,也是个难点。Android中主要是依靠分析系统源码类来做到的,首先我们得找到被Hook的对象,我称之为Hook点;什么样的对象比较好Hook呢?自然是容易找到的对象。什么样的对象容易找到?静态变量和单例;在一个进程之内,静态变量和单例变量是相对不容易发生变化的,因此非常容易定位,而普通的对象则要么无法标志,要么容易改变。我们根据这个原则找到所谓的Hook。

去看setOnClickListener里面做了什么?

  public void setOnClickListener(@Nullable OnClickListener l) {if (!isClickable()) {setClickable(true);}getListenerInfo().mOnClickListener = l;}
 ListenerInfo getListenerInfo() {if (mListenerInfo != null) {return mListenerInfo;}mListenerInfo = new ListenerInfo();return mListenerInfo;}

看完了上面,就能猜到我们设置的Listener最终是被赋值给ListenerInfo的mOnClickListener成员了,ListenerInfo的实例可以说是信息的载体,那么很简单,只要把mOnClickListener,在ListenerInfo中还有mOnLongClickListener,mOnFocusChangeListener两个成员,分别对应了长按事件与焦点变化事件,所以处理长按事件与焦点变化事件与此类似。

public class HookViewClickUtil {public static HookViewClickUtil getInstance() {return UtilHolder.mHookViewClickUtil;}private static class UtilHolder {private static HookViewClickUtil mHookViewClickUtil = new HookViewClickUtil();}public static void hookView(View view) {try {Class viewClazz = Class.forName("android.view.View");//事件监听器都是这个实例保存的Method listenerInfoMethod = viewClazz.getDeclaredMethod("getListenerInfo");if (!listenerInfoMethod.isAccessible()) {listenerInfoMethod.setAccessible(true);}Object listenerInfoObj = listenerInfoMethod.invoke(view);Class listenerInfoClazz = Class.forName("android.view.View$ListenerInfo");Field onClickListenerField = listenerInfoClazz.getDeclaredField("mOnClickListener");if (!onClickListenerField.isAccessible()) {onClickListenerField.setAccessible(true);}View.OnClickListener mOnClickListener = (View.OnClickListener) onClickListenerField.get(listenerInfoObj);//自定义代理事件监听器View.OnClickListener onClickListenerProxy = new OnClickListenerProxy(mOnClickListener);//更换onClickListenerField.set(listenerInfoObj, onClickListenerProxy);} catch (Exception e) {e.printStackTrace();}}//自定义的代理事件监听器private static class OnClickListenerProxy implements View.OnClickListener {private View.OnClickListener object;private int MIN_CLICK_DELAY_TIME = 1000;private long lastClickTime = 0;private OnClickListenerProxy(View.OnClickListener object) {this.object = object;}@Overridepublic void onClick(View v) {//点击时间控制long currentTime = Calendar.getInstance().getTimeInMillis();if (currentTime - lastClickTime > MIN_CLICK_DELAY_TIME) {lastClickTime = currentTime;Log.e("OnClickListenerProxy", "OnClickListenerProxy");if (object != null) object.onClick(v);}}}
}

使用起来也是非常简单,首先在MainActivity的View渲染完毕的时候进行注入,即在 getWindow().getDecorView().post()中。

public class MainActivity extends Activity {private Button  btn;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);final View btn = findViewById(R.id.btn);btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Log.e("MainActivity","Button 被点击了");}});getWindow().getDecorView().post(new Runnable() {@Overridepublic void run() {HookViewClickUtil.hookView(btn);}});}
}

原文出处:https://blog.csdn.net/u013263323/article/details/55094822

Hook技术看这篇就够了相关推荐

  1. React入门看这篇就够了

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 很多值得了解的细节. 原文:React入门看这篇就够了 作者:Random Fundebug经授权转载,版权归原作者所 ...

  2. [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了

    园子里关于ASP.NET Core Web API的教程很多,但大多都是使用EF+Mysql或者EF+MSSQL的文章.甚至关于ASP.NET Core Web API中使用Dapper+Mysql组 ...

  3. 史上最全!用Pandas读取CSV,看这篇就够了

    导读:pandas.read_csv接口用于读取CSV格式的数据文件,由于CSV文件使用非常频繁,功能强大,参数众多,因此在这里专门做详细介绍. 作者:李庆辉 来源:大数据DT(ID:hzdashuj ...

  4. Spring Cloud入门,看这篇就够了!

    点击▲关注 "中生代技术"   给公众号标星置顶 更多精彩 第一时间直达 概述 首先我给大家看一张图,如果大家对这张图有些地方不太理解的话,我希望你们看完我这篇文章会恍然大悟. 什 ...

  5. Docker入门实战看这篇就够了(最新详细以及踩过的坑)

    Docker入门实战看这篇就够了 前言 初识 是什么 容器与虚拟机 能干什么 去哪玩 安装 先决条件 查看自己的内核 安装所需的软件包(支持devicemapper存储类型) 设置镜像的仓库 设置yu ...

  6. Java String,看这篇就够了

    String,是Java中最重要的类.这句肯定的推断不是Java之父詹姆斯·高斯林说的,而是沉默王二说的,因此你不必怀疑它的准确性. 关于字符串,有很多的面试题,但我总觉得理论知识绕来绕去没多大意思. ...

  7. Cookie、Session、Token、JWT 看一篇就够了

    目录 Cookie.Session.Token.JWT 看一篇就够了 什么是认证(Authentication) 什么是授权(Authorization) 什么是凭证(Credentials) 怎么让 ...

  8. [个人向]超快速了解微信小程序:看这篇就够了!(注册、语言、框架、配额等简要说明)

    [个人向]超快速了解微信小程序看这篇就够了+相关简要说明 本文精炼微信小程序开发文档相关内容,旨在对初次接触并准备开发小程序的童鞋(比如自己)提供一个快速了解攻略.其中包括注册相关.语言.框架模式.相 ...

  9. Java应用系统监控看这篇就够了

    Java应用系统监控看这篇就够了 文章目录 业务背景 系统监控发展历程 技术方案 日志监控技术方案 Grafana+阿里云SLS日志服务 分布式链路追踪技术方案 阿里云jaeger方案 开源框架sky ...

  10. 【超全汇总】学习数据结构与算法,计算机基础知识,看这篇就够了【ZT帅地】2020-3-7

    https://blog.csdn.net/m0_37907797/article/details/104029002 由于文章有点多,并且发的文章也不是一个系列一个系列发的,不过我的文章大部分都是围 ...

最新文章

  1. DFS:深入优先搜索 POJ-2386 Lake Counting
  2. 【企业管理】14 项管理原则
  3. POJ2195 Going Home 最小费用最大流
  4. 查询score中选学多门课程的同学中分数为非最高分成绩的记录。
  5. tensorflow中的log中数字的含义
  6. Centos7装NVIDIA显卡驱动(GPU)
  7. HDU5971【瞎搞】
  8. Windows 10重装系统时,提示Windows只能安装到GPT磁盘的解决方法(更新于2021.4.28)
  9. 计算机表演赛vr创意大赛,计算机表演赛新增VR创意大赛
  10. java开发app的缺点_App原生开发的优缺点有哪些
  11. Confluence 6 Windows 中以服务方式自动重启修改运行服务的用户
  12. linux 查看端口占用命令 亲测可用
  13. 2010全国导游大赛总决赛现场调试及比赛抓图
  14. 去除WINRAR的广告
  15. Java白皮书的关键术语
  16. 【vuejs】有关UI框架“ydui”中的倒计时组件的使用
  17. Vision MLP(MLP-Mixer,RepMLP,ResMLP,gMLP,aMLP)
  18. AT91SAM9260开发板
  19. matlab泰勒展开样例,MATLAB绘图样例
  20. Linux 服务器进行安全加固,防止黑客攻击

热门文章

  1. Ubuntu18 Cuda10升级Cuda11+Cudnn8+TensorRT7.1+Opencv3
  2. 《缠中说禅108课》57:当下图解分析再示范
  3. 知识点 —— Python基础-1
  4. 电动车的蓄电池与锂电池
  5. 2022-2027年中国沙漠旅游行业市场全景评估及发展战略规划报告
  6. Turtlebot2激光雷达(Rplidar)gmapping构建地图
  7. 关于ZEMAX13的中文设置
  8. ZEMAX | 如何创建复杂的非序列物体
  9. 易文档-快速编写专业漂亮的API文档,产品文档,使用手册
  10. 数据结构21:递归可视化(谢尔宾斯基三角形)