【Android 插件化】Hook 插件化框架 ( Hook 实现思路 | Hook 按钮点击事件 )(一)

简介: 【Android 插件化】Hook 插件化框架 ( Hook 实现思路 | Hook 按钮点击事件 )(一)

文章目录

Android 插件化系列文章目录

前言

一、Hook 实现思路

二、Hook 按钮点击事件

1、按钮点击事件

2、熟悉底层源码

3、获取 View 的 ListenerInfo mListenerInfo 成员

4、分析 Hook 点

5、反射 ListenerInfo 并设置新的 OnClickListener 监听器

三、完整代码示例

四、博客资源

前言

在上一篇博客 【Android 插件化】Hook 插件化框架 ( Hook 技术 | 代理模式 | 静态代理 | 动态代理 ) 中 , 对 Hook 技术进行了简要介绍 , Android 中的 Hook 技术主要是通过


反射

代理模式 ( 动态代理 / 静态代理 )


实现的 ;



之所以使用 Hook 技术 , 是因为反射系统的源码时 , 会出现问题 , Google 官方对 Android 的反射进行了限制 ;


反射出现问题时 , 必须找到一个可以反射的反射点挂钩子 , 如在 A 位置无法进行反射 , 就在 B 位置挂 Hook 钩子 ;



最终要实现的是使用 Hook , 影响 Activity 的启动流程 , 在启动流程中注入我们想要的业务逻辑 , 干涉启动流程 , 以达到能启动插件包 APK 中的 Activity 的目的 ;






一、Hook 实现思路


Hook 点选择规则 : Hook 技术的关键是找好 Hook 点 , 将钩子挂在哪 , 勾住哪个方法 , 需要遵循一定的规则 :


静态变量 / 单例 : 优先选择 静态变量 , 单例对象 , 这些对象一旦创建 , 基本不会改变 , 容易定位 ;



Hook 点实现思路 :


① 查找 Hook 点 : 用于下钩子 ;


② 选择代理模式 : 静态代理 / 动态代理 ;


③ 代理替换 : 通过反射 , 将钩子替换成开发者自定义的代理 , 一般是在原有调用的基础上 , 不影响原来功能的前提下 , 注入新的逻辑 ;






二、Hook 按钮点击事件



1、按钮点击事件


获取布局文件的按钮 , 并为其设置点击事件 , 该点击事件 public void onClick(View v) 就是需要 Hook 的方法 , 我们使用 Hook 技术 , 使用动态代理 , 替换掉该 onClick 方法 , 注入额外的业务逻辑 ;


// 获取按钮 , 并未按钮组件设置点击事件
Button button = findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Log.i(TAG, "Button OnClickListener onClick");
    }
});



2、熟悉底层源码


使用 Hook 的前提是 , 必须熟悉要 Hook 功能的底层源码 , 如 : Hook 按钮点击事件 , 必须熟悉 View 组件的 OnClickListener 相关源码 ;


先分析 View 的 setOnClickListener 方法的源码 , 传入 OnClickListener l 监听器 , 将该监听器赋值给 getListenerInfo().mOnClickListener 值 ;


public class View implements Drawable.Callback, KeyEvent.Callback,
        AccessibilityEventSource {
    @UnsupportedAppUsage
    ListenerInfo mListenerInfo;
    /**
     * Register a callback to be invoked when this view is clicked. If this view is not
     * clickable, it becomes clickable.
     *
     * @param l The callback that will run
     *
     * @see #setClickable(boolean)
     */
    public void setOnClickListener(@Nullable OnClickListener l) {
        if (!isClickable()) {
            setClickable(true);
        }
        getListenerInfo().mOnClickListener = l;
    }
    @UnsupportedAppUsage
    ListenerInfo getListenerInfo() {
        if (mListenerInfo != null) {
            return mListenerInfo;
        }
        mListenerInfo = new ListenerInfo();
        return mListenerInfo;
    }
}



如果要替换 按钮点击事件 , 可以反射 View 的 getListenerInfo() 方法 , 直接设置一个新的 点击监听器 ;



getListenerInfo().mOnClickListener = l;


// 获取 View 的 getListenerInfo 方法
Method getListenerInfo = null;
try {
    getListenerInfo = View.class.getDeclaredMethod("getListenerInfo");
} catch (NoSuchMethodException e) {
    e.printStackTrace();
}

位置作为钩子的 Hook 点 , 勾住该方法 ;



3、获取 View 的 ListenerInfo mListenerInfo 成员


先使用反射获取 View 组件的 getListenerInfo 方法 ;


// 获取 View 的 getListenerInfo 方法
Method getListenerInfo = null;
try {
    getListenerInfo = View.class.getDeclaredMethod("getListenerInfo");
} catch (NoSuchMethodException e) {
    e.printStackTrace();
}


设置 getListenerInfo 方法的可见性 , 之后要调用该方法 , 否则会报错 ;


// 执行所有的反射方法 , 设置成员变量 之前 , 都要设置可见性
getListenerInfo.setAccessible(true);


执行 反射获取的 getListenerInfo 方法 , 并获取 ListenerInfo mListenerInfo 成员 ;


// 执行 View view 对象的 getListenerInfo 方法
Object object = null;
try {
    object = getListenerInfo.invoke(view);
} catch (IllegalAccessException e) {
    e.printStackTrace();
} catch (InvocationTargetException e) {
    e.printStackTrace();
}



目录
相关文章
|
2月前
|
存储 消息中间件 人工智能
【03】AI辅助编程完整的安卓二次商业实战-本地构建运行并且调试-二次开发改注册登陆按钮颜色以及整体资源结构熟悉-优雅草伊凡
【03】AI辅助编程完整的安卓二次商业实战-本地构建运行并且调试-二次开发改注册登陆按钮颜色以及整体资源结构熟悉-优雅草伊凡
100 3
|
2月前
|
存储 消息中间件 人工智能
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
98 11
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
|
4月前
|
Android开发 数据安全/隐私保护
手机微信虚拟视频聊天,安卓免root虚拟摄像头,免root虚拟hook相机
以上代码实现了一个完整的免root虚拟摄像头方案,通过Hook系统摄像头服务和微信视频通话接口
|
4月前
|
Java Android开发
安卓虚拟摄像头过人脸,免root虚拟hook相机,虚拟相机hook版【jar】
两种Hook Android相机的方法:Xposed模块和Frida脚本。Xposed模块需要安装在已root的设备
|
9月前
|
前端开发 Java 编译器
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
245 36
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
|
算法 JavaScript Android开发
|
Java 程序员 API
Android|集成 slf4j + logback 作为日志框架
做个简单改造,统一 Android APP 和 Java 后端项目打印日志的体验。
593 1
|
12月前
|
开发框架 Dart Android开发
安卓与iOS的跨平台开发:Flutter框架深度解析
在移动应用开发的海洋中,Flutter作为一艘灵活的帆船,正引领着开发者们驶向跨平台开发的新纪元。本文将揭开Flutter神秘的面纱,从其架构到核心特性,再到实际应用案例,我们将一同探索这个由谷歌打造的开源UI工具包如何让安卓与iOS应用开发变得更加高效而统一。你将看到,借助Flutter,打造精美、高性能的应用不再是难题,而是变成了一场创造性的旅程。
|
前端开发 Java 数据库
💡Android开发者必看!掌握这5大框架,轻松打造爆款应用不是梦!🏆
在Android开发领域,框架犹如指路明灯,助力开发者加速应用开发并提升品质。本文将介绍五大必备框架:Retrofit简化网络请求,Room优化数据库访问,MVVM架构提高代码可维护性,Dagger 2管理依赖注入,Jetpack Compose革新UI开发。掌握这些框架,助你在竞争激烈的市场中脱颖而出,打造爆款应用。
1260 3
|
Android开发
【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )
【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )
245 0
【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )

热门文章

最新文章