接下来深海会和大家逐步分享分析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); } } }
好了今天的分享就到这里哦,关于上诉内容,有任何的疑惑或者建议欢迎评论区沟通交流哦~
深海特别愿意和大家一起互相学习互相进步
总结
以上是内存溢出为你收集整理的Android 进阶答疑:Hook全部内容,希望文章能够帮你解决Android 进阶答疑:Hook所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)