目录
前言:
Android 插件化是一种将应用程序分解为多个独立的组件的技术,这些组件可以单独开发、测试和部署。其中,Hook 机制是 Android 插件化中的一种关键技术,它可以帮助开发人员在运行时动态地修改应用程序的行为。动态代理是 Hook 机制中的一种常用技术,它可以帮助开发人员创建一个代理对象,以便在调用原始对象的方法时执行额外的操作。
代理是什么
为什么需要代理呢?其实这个代理与日常生活中的“代理”,“中介”差不多;比如你想海淘买东西,总不可能亲自飞到国外去购物吧,这时候我们使用第三方海淘服务比如惠惠购物助手等;同样拿购物为例,有时候第三方购物会有折扣比如当初的米折网,这时候我们可以少花点钱;当然有时候这个“代理”比较坑,坑我们的钱,坑我们的货。
从这个例子可以看出来,代理可以实现方法增强,比如常用的日志,缓存等;也可以实现方法拦截,通过代理方法修改原方法的参数和返回值,从而实现某种不可告人的目的~接下来我们用代码解释一下。
静态代理
静态代理,是最原始的代理方式;假设我们有一个购物的接口,如下:
1 2 3 |
public interface Shopping {
Object[] doShopping(long money);
}
|
它有一个原始的实现,我们可以理解为亲自,直接去商店购物:
1 2 3 4 5 6 7 8 |
public class ShoppingImpl implements Shopping {
@Override
public Object[] doShopping(long money) {
System.out.println("逛淘宝 ,逛商场,买买买!!");
System.out.println(String.format("花了%s块钱", money));
return new Object[] { "鞋子", "衣服", "零食" };
}
}
|
好了,现在我们自己没时间但是需要买东西,于是我们就找了个代理帮我们买:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public class ProxyShopping implements Shopping {
Shopping base;
ProxyShopping(Shopping base) {
this.base = base;
}
@Override
public Object[] doShopping(long money) {
// 先黑点钱(修改输入参数)
long readCost = (long) (money * 0.5);
System.out.println(String.format("花了%s块钱", readCost));
// 帮忙买东西
Object[] things = base.doShopping(readCost);
// 偷梁换柱(修改返回值)
if (things != null && things.length > 1) {
things[0] = "被掉包的东西!!";
}
return things;
}
|
很不幸,我们找的这个代理有点坑,坑了我们的钱还坑了我们的货;先忍忍。
动态代理
传统的静态代理模式需要为每一个需要代理的类写一个代理类,如果需要代理的类

本文详细介绍了Android插件化的关键——Hook机制,特别是动态代理的概念和应用。通过示例展示了如何利用动态代理创建代理对象以实现方法增强和拦截,以及如何在Android中进行Hook操作,包括寻找Hook点、实现代理对象和替换原始对象,最终实现对Activity启动的控制。
最低0.47元/天 解锁文章
341

被折叠的 条评论
为什么被折叠?



