ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android 进阶答疑:Hook

2020-06-25 14:37:50  阅读:321  来源: 互联网

标签:origin ListenerInfo 进阶 OnClickListener mOnClickListener Hook Android View


接下来深海会和大家逐步分享分析Android插件化相关的东西

要了解插件化首先要具备三个前提条件:

1.Android 系统源码阅读于理解

2.Java 反射机制

3.Hook技术

今天咱们就一起分析Hook的相关知识

一.Hook是什么?

      在事件执行的过程中截获并监控事件的执行流,将自身的代码融入其执行流中

二.简单举例: Hook 修改 View.OnClickListener 事件

首先阅读系统类View的源码,找到Hook点击事件的关键代码

看点击事件的方法:这边传入的事件赋给了ListenerInfo对象的mOnClickListener接口实例

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

追溯该方法:该方法返回了ListenerInfo对象

 @UnsupportedAppUsage
    ListenerInfo getListenerInfo() {
        if (mListenerInfo != null) {
            return mListenerInfo;
        }
        mListenerInfo = new ListenerInfo();
        return mListenerInfo;
    }

然后整理结构:

得出Hook路线:

1.拿到View对象中的mListenerInfo对象

2.然后拿到mOnClickListener接口实例

3.对该实例进行二次封装后替换该实例

具体实现代码:

/*
 *作者:赵星海
 *时间:2020/6/23 9:51
 *用途:Hook简单举例(View点击事件)
 */
public static void hookOnClickListener(View view) throws Exception {
        // 第一步:反射得到 ListenerInfo 对象
        Method getListenerInfo = View.class.getDeclaredMethod("getListenerInfo");
        getListenerInfo.setAccessible(true);
        Object listenerInfo = getListenerInfo.invoke(view);
        // 第二步:得到原始的 OnClickListener事件方法
        Class<?> listenerInfoClz = Class.forName("android.view.View$ListenerInfo");
        Field mOnClickListener = listenerInfoClz.getDeclaredField("mOnClickListener");
        mOnClickListener.setAccessible(true);
        View.OnClickListener originOnClickListener = (View.OnClickListener) mOnClickListener.get(listenerInfo);
        // 第三步:用 Hook代理类 替换原始的 OnClickListener
        View.OnClickListener hookedOnClickListener = new HookedClickListener(originOnClickListener);
        mOnClickListener.set(listenerInfo, hookedOnClickListener);
    }

    public static class HookedClickListener implements View.OnClickListener {

        private View.OnClickListener origin;

        public HookedClickListener(View.OnClickListener origin) {
            this.origin = origin;
        }

        @Override
        public void onClick(View v) {
            // Toast.makeText(v.getContext(), "你的点击事件被赵星海劫持了!", Toast.LENGTH_SHORT).show();
            if (origin != null) {
                origin.onClick(v);
            }
        }

    }

好了今天的分享就到这里哦,关于上诉内容,有任何的疑惑或者建议欢迎评论区沟通交流哦~

深海特别愿意和大家一起互相学习互相进步
 

 

 

标签:origin,ListenerInfo,进阶,OnClickListener,mOnClickListener,Hook,Android,View
来源: https://blog.csdn.net/qq_39731011/article/details/106937009

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有