Android插件化原理解析——Hook机制之动态代理

本文详细介绍了Android插件化的关键——Hook机制,特别是动态代理的概念和应用。通过示例展示了如何利用动态代理创建代理对象以实现方法增强和拦截,以及如何在Android中进行Hook操作,包括寻找Hook点、实现代理对象和替换原始对象,最终实现对Activity启动的控制。
摘要由CSDN通过智能技术生成

目录

前言:

代理是什么

静态代理

动态代理

代理Hook


前言:

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;
    }

很不幸,我们找的这个代理有点坑,坑了我们的钱还坑了我们的货;先忍忍。

动态代理

传统的静态代理模式需要为每一个需要代理的类写一个代理类,如果需要代理的类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值