Android免Root无侵入AOP框架Dexposed

Dexposed是一款在Android平台下的免Root无侵入运行期AOP框架,支持经典AOP应用场景,如日志记录、性能统计等。本文详细介绍Dexposed的集成方法、支持的系统版本、应用场景及具体用法,包括在线热更新和AOP编程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Dexposed框架是阿里巴巴无线事业部近期开源的一款在Android平台下的免Root无侵入运行期AOP框架,该框架基于AOP思想,支持经典的AOP使用场景,可应用于日志记录,性能统计,安全控制,事务处理,异常处理等方面。

针对Android平台,Dexposed只支持函数级别的在线热更新,如对已经发布在应用市场上的宿主APK,当我们从crash统计平台上发现某个函数调用有bug,导致经常性crash,这时,可以在本地开发一个补丁APK,并发布到服务器中,宿主APK下载这个补丁APK并使用Dexposed框架集成后,就可以很容易修复这个crash

如何在Android Studio集成Dexposed

关于在Android Studio中集成Dexposed,很简单,只需要导入两个jar包和两个so文件,jar包和so文件都可以在github上下载传送门,关于jar的导入大家肯定很清楚,只需要把对应的jar包放入libs目录下,然后添加项目依赖即可,而关于so文件的导入,不同的AS版本便不一样了,较早期的版本可能更麻烦些,而比较新的版本则非常方便,我用的是AS1.4Beta2版的,所以只需要在src/main目录下新建一个jniLibs目录,然后把so文件放入进去即可,当我们打包成apk的时候自到会将so文件添加进去。所以在Android Studio中集成Dexposed的配置如下:
1、添加so文件:
这里写图片描述
2、添加jar依赖:

dependencies {
    //...
    compile files('libs/dexposedbridge.jar')
    compile files('libs/patchloader.jar')
}

Dexposed支持的SDK版本

Dexposed目前只支持从Android2.3到4.4(除了3.0)的所有Dalvid运行时arm架构的设备,而Android 5.0以后摒弃了Dalvid而使用ART模式,所以说在api19以上的系统目前来说都不支持,不过阿里的团队也正在测试Android5.0加入对ART的支持。

—–支持的系统版本:
Dalvik 2.3
Dalvik 4.0~4.4
—–不支持的系统版本:
Dalvik 3.0
ART 5.1
ART M
ART 6.0

Dexposed应用场景

Dexposed实现的hooking,不仅可以hook应用中的自定义函数,也可以hook应用中调用的Android框架的函数。不过Dexposed只能hook函数和构造器,我们从源码中就可以看出:
这里写图片描述

应用场景:

1、 AOP编程
2、插桩(例如测试,性能监控等)
3、在线热更新,修复严重的,紧急的或者安全性的bug
4、SDK hooking以提供更好的开发体验

Dexposed框架是基于动态类加载技术,运行中的app可以加载一小段经过编译的Java AOP代码,在不需要重启app的前提下实现修改目标app的行为。

Dexposed的用法

1、检查当前系统是否支持Dexposed

首先上面我们讲了由于Dexposed框架目前并不是支持所有的系统,所以我们在使用Dexposed框架的时候应该对当前系统的版本进行检查是否支持Dexposed,不过这段检查代码Dexposed内部已经封装好了,所以我们只需要调用DexposedBridge.canDexposed(this)方法即可,我们应该尽可能的在程序一启动时候完成检查,如:

public class MyApplication extends Application {
   
   
    private static boolean canDexPosed = false;

    @Override
    public void onCreate() {
        super.onCreate();
        canDexPosed = DexposedBridge.canDexposed(this);
        if(canDexPosed){
            //do something
        }
    }

    public static boolean isCanDexPosed() {
        return canDexPosed;
    }
}

我们可以看看Dexposed源码里面是怎么完成对系统的检查的:

public static synchronized boolean canDexposed(Context context) {
        return !DeviceCheck.isDeviceSupport(context)?false:loadDexposedLib(context);
    }

private static boolean loadDexposedLib(Context context) {
        try {
            if(VERSION.SDK_INT != 10 && VERSION.SDK_INT != 9) {
                if(VERSION.SDK_INT > 19) {
                    System.loadLibrary("dexposed_l");
                } else {
                    System.loadLibrary("dexposed");
                }
            } else {
                System.loadLibrary("dexposed2.3");
            }

 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值