Android 插件化系列文章目录

【Android 插件化】插件化简介 ( 组件化与插件化 )
【Android 插件化】插件化原理 ( JVM 内存数据 | 类加载流程 )
【Android 插件化】插件化原理 ( 类加载器 )

【Android 插件化】“ 插桩式 “ 插件化框架 ( 原理与实现思路 )
【Android 插件化】“ 插桩式 “ 插件化框架 ( 类加载器创建 | 资源加载 )
【Android 插件化】“ 插桩式 “ 插件化框架 ( 注入上下文的使用 )
【Android 插件化】“ 插桩式 “ 插件化框架 ( 获取插件入口 Activity 组件 | 加载插件 Resources 资源 )
【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )

【Android 插件化】Hook 插件化框架 ( Hook 技术 | 代理模式 | 静态代理 | 动态代理 )


文章目录

  • Android 插件化系列文章目录
  • 前言
  • 一、Hook 技术简介
  • 二、代理机制
    • 1、静态代理示例
    • 2、动态代理示例
  • 三、博客资源

前言

在之前的系列博客中 , 介绍了 " 插桩式 " 插件化框架 , 该框架存在一些问题 :

开发需要定制 : " 插件 " 模块中的 Activity 必须集成 BaseActivity , 其中很多操作都需要针对该方式进行 定制化开发 , 与开发普通的应用完全不同 ;

没有真正的上下文环境 : " 插件 " 模块内部 , 调用 Activity 组件的 getApplicationContext 方法会出现问题 , 因为 插件内部没有真正的供应用运行的上下文环境 ;

( 之前的 " 插桩式 " 插件化框架 , 只是简单示例 , 远远达不到能在项目中使用的复杂程度 )

插件化框架 的最终目的是让 " 插件 " 模块的开发和使用 , 与正常的应用开发和使用达到完全一致的效果 , " 宿主 " 模块 与 " 插件 " 模块 之间可以 无障碍通信 ;


一、Hook 技术简介


Hook 技术 又称为 钩子技术 , 同样 Hook 函数 也称为 钩子函数 ; 钩子技术 在 系统入侵 中 , 广泛使用 ;

Hook 技术 没有硬性规定技术标准 , 只是一种 技术概念 ; 在某一段代码的运行流程中 , 挂入自定义的钩子 , 在钩子的 前面 , 后面 , 可以 插入任意自定义的操作代码 , 达到 业务注入 的目的 ;

Hook 技术可以理解为 面向切面编程思想 , 想办法在不修改源码的前提下 , 在某个方法调用之前 , 插入自己的代码 , 业务逻辑 ,

Android 中的 Hook 技术 : 通过分析 Android 系统源码执行 , 通过 动态注入技术 , 在代码运行的某个阶段 , 注入开发者自定义的代码 ;

常用的动态注入技术 :

① 编译时修改字节码数据 : 代码编译时修改 Class 字节码数据 , 如 Dagger ;

② 运行时修改字节码数据 : 运行时可以修改字节码文件数据 , 达到代码入侵的效果 ;

Android 中的 Hook 机制 , 主要涉及到下面两种技术 :

① 反射机制 : Java 反射机制 ;

② 代理机制 : 动态代理 , 静态代理 ;

二、代理机制


代理机制 :

存在一个 目标对象 Subject 和 代理者 Proxy ;

目标对象 Subject 执行一些业务逻辑 , 代理者 Proxy 持有 目标对象 Subject , 当 目标对象 Subject 要执行某个方法时 , 通过 代理者 Proxy 调用 目标对象 Subject 中的方法执行 ;

代理者 Proxy 调用 目标对象 Subject 方法 之前 , 之后 , 可以插入自己的业务逻辑 ;

下面简要介绍 静态代理 与 动态代理 ;

1、静态代理示例

定义代理方法接口 : 代理者 和 目标对象 都要实现该接口 , 代理者 和 目标对象 可以进行相互替换 ;

/*** 代理者 和 目标对象 都要实现该接口* 代理者 可以替换 目标对象*/
public interface AInterface {void request();
}

目标对象 : 被代理的目标对象 , 实现了

/*** 被代理的目标对象* 目标对象 Subject 执行一些业务逻辑* 代理者 Proxy 持有 目标对象 Subject* 当目标对象 Subject 要执行某个方法时* 通过 代理者 Proxy 调用 目标对象 Subject 中的方法执行*/
public class Subject implements AInterface {/*** 目标对象的业务逻辑*/@Overridepublic void request() {System.out.println("Subject request");}
}

代理者 :

/*** 代理者* 目标对象 Subject 执行一些业务逻辑* 代理者 Proxy 持有 目标对象 Subject* 当目标对象 Subject 要执行某个方法时* 通过 代理者 Proxy 调用 目标对象 Subject 中的方法执行*/
public class Proxy implements AInterface {/*** 代理者 持有的 目标对象*/private Subject subject;public Proxy(Subject subject) {this.subject = subject;}/*** 当 Subject 需要执行 request 方法时 , 自己不直接执行* 而是通过 Proxy 的该方法调用 持有的 目标对象 Subject 来执行*/@Overridepublic void request() {before();subject.request();after();}/*** 执行 Subject 目标对象的 request 方法前执行的业务逻辑*/private void before() {System.out.println("Proxy before");}/*** 执行 Subject 目标对象的 request 方法后执行的业务逻辑*/private void after() {System.out.println("Proxy after");}
}

main 函数调用 : 通过代理者调用目标对象中的类 , 并在执行目标对象 Subject 的 request 方法时 , 对该方法进行逻辑增强 ;

① 方式一 :

public class Main {public static void main(String[] args) {// 1. 创建目标对象Subject subject = new Subject();// 2. 创建代理类Proxy proxy = new Proxy(subject);// 3. 通过代理类调用目标对象的方法proxy.request();/*代理类的作用 :执行 目标对象 Subject 的 request 方法时 ,对该方法进行逻辑增强 ;*/}
}

② 方式二 :

public class Main {public static void main(String[] args) {/*下面的这种用法, 不需要关注目标对象只需要了解 Proxy 代理者调用者不了解目标对象的内部实现细节目标对象也不了解调用者*/AInterface aInterface = new Proxy(new Subject());aInterface.request();}
}

执行结果 :

Proxy before
Subject request
Proxy after

2、动态代理示例

动态代理接口 :

/*** 代理者 需要实现的接口* 该接口就是动态代理接口*/
public interface AInterface {void request();
}

目标对象 : 被代理的目标对象 , 需要实现代理接口 ;

public class Subject implements AInterface {@Overridepublic void request() {System.out.println("Subject request");}
}

InvocationHandler 实现 : 这是 Hook 钩子 , 用于向被代理的目标对象的目标方法中注入业务逻辑 ;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;public class AInvocationHandler implements InvocationHandler {/*** 被代理的对象*/Object target;public AInvocationHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {before();Object object = method.invoke(target, args);after();return object;}/*** 被代理对象方法调用之前执行*/private void before(){System.out.println("AInvocationHandler before");}/*** 被代理对象方法调用之后执行*/private void after(){System.out.println("AInvocationHandler after");}
}

动态代理执行 main 函数 :

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;public class Main {public static void main(String[] args) {// 1. 创建目标对象Subject subject = new Subject();// 2. 获取目标对象类加载器ClassLoader classLoader = subject.getClass().getClassLoader();// 3. 获取接口 Class 数组, Subject 只实现了一个 AInterface 接口Class<?>[] interfaces = subject.getClass().getInterfaces();// 4. 创建 InvocationHandler , 传入被代理的目标对象 , 处理该目标对象中被代理的函数InvocationHandler invocationHandler = new AInvocationHandler(subject);// 5. 动态代理 ://    ① jdk 根据传入的参数信息 , 在内存中动态的创建 与 .class 字节码文件等同的字节码数据//    ② 将字节码数据 转为 对应的 字节码类型//    ③ 使用反射调用 newInstance 创建动态代理实例AInterface proxy = (AInterface) Proxy.newProxyInstance(classLoader,interfaces,invocationHandler);// 正式调用被动态代理的类proxy.request();}
}

执行结果 :

AInvocationHandler before
Subject request
AInvocationHandler after

三、博客资源


博客资源 :

  • GitHub :

【Android 插件化】Hook 插件化框架 ( Hook 技术 | 代理模式 | 静态代理 | 动态代理 )相关推荐

  1. android hook底层代码_Java-Hook技术-入门实践(反射、动态代理)-Hook拦截通知(当前App/Context)...

    老样子,上一篇MonkeyLei:Java-Hook技术-入门实践+反射.动态代理.热修复再看看 我们Hook学习了一下,一个是Java本地Main的实践练习. 一个是Android的监听事件的Hoo ...

  2. hook控制浏览器的方法_Java-Hook技术-入门实践+反射、动态代理、热修复再看看

    延续之前的MonkeyLei:Android-模块化.组件化.插件化.热修复-插件化-起个头,我们复习下里面的关于反射和动态代理点的知识.然后尝试简单了解下Hook... 看之前文章,记得多复习下反射 ...

  3. Android代理模式(静态代理,动态代理,Retrofit代理模式分析)

    文章目录 代理模式 前言:AOP编程(面向切面编程) 一. 代理思想 1. 静态代理 2. 动态代理 3. 动态代理的实现 二. Retrofit代理模式分析 代理模式 前言:AOP编程(面向切面编程 ...

  4. Android常见设计模式——代理模式(Proxy Pattern)

    文章目录 1. 前言 2. 代理模式(Proxy Pattern) 2.1 静态代理模式 2.2 动态代理模式 3. Android 中的代理模式 3.1 Retrofit中的代理模式(没有被代理者) ...

  5. 【Android 插件化】Hook 插件化框架总结 ( 插件包管理 | Hook Activity 启动流程 | Hook 插件包资源加载 ) ★★★

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  6. 【Android 插件化】Hook 插件化框架 ( 使用 Hook 方式替换插件 Activity 的 mResources 成员变量 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  7. 【Android 插件化】Hook 插件化框架 ( 从源码角度分析加载资源流程 | Hook 点选择 | 资源冲突解决方案 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  8. 【Android 插件化】Hook 插件化框架 ( 加载插件包资源 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  9. 【Android 插件化】Hook 插件化框架 ( 反射工具类 | 反射常用操作整理 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

最新文章

  1. alternate端口什么意思_宽带光信号闪红灯是什么意思?
  2. 英语阅读推荐:使用AJAX+WF+LINQ制作Google IG式首页
  3. 011_Spring Data JPA多对多关系
  4. 并查集 - 交换字符串中的元素
  5. 为什么大公司一定要使用DevOps
  6. 2018-2019-1 20165203 《信息安全系统设计基础》第六周学习总结
  7. ble连接过程建立_九点之蓝牙连接
  8. leetcode 1208. 尽可能使字符串相等(滑动窗口)
  9. WebStorm 8.0.3下简单运行pomelo项目
  10. DWR第五篇之文件上传
  11. 【PMP认证考试之个人总结】第 3 章 项目整合管理
  12. Luogu P2048 [NOI2010]超级钢琴
  13. 初中计算机知识ppt,初中信息技术操作考试系统题库PowerPoint部分
  14. 【渝粤教育】电大中专混凝土结构_1作业 题库
  15. 助力数字经济,服务数智化转型,用友火力全开
  16. GLES2.0中文API-glCompressedTexImage2D
  17. python语言画图代码_零: python matplotlib 画图进阶(含完整代码)
  18. 「聚变」前端 客户端 | 第十七届 D2 终端技术大会,开放报名!
  19. matlab三角形单元,平面三角形单元常应变单元matlab程序的编制.doc
  20. “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?

热门文章

  1. linux 死锁分析
  2. 利用GNU的parted进行分区
  3. 常用的 服务器 与 交换机
  4. [Silverlight资源]处理bmp,gif及ico图像类文件
  5. UVA1601万圣节的早上
  6. 在django中使用django_debug_toolbar
  7. 使用 $.grep() 方法
  8. ORACLE DBA的职责
  9. CF(439E - Devu and Birthday Celebration)莫比乌斯容斥
  10. Excel的日期格式约定与解析