在线热修复基本流程
每个APP都会集成一个用于捕获并统计线上Crash的SDK,通过这个SDK,我们可以知道APP的健康状况,这是在线修复的基础。从线上Crash的统计中可以得知APP是否存在需要在线热修复的严重性Crash。如果存在,那么接着根据Crash日志定位分析出哪里的代码出的问题,这是需要基于这个发布的版本号对应的代码标签拉出一个bugfix分支,并在这个分支上修复问题。问题修复后,首先是开发人员自测,再提交体侧申请,测试回归并确认问题已经解决后,开发就可以在自动化构建平台出发bugfix分支的构建,这个构建会同时执行前后两个版本APK的对比,生成补丁文件。补丁文件生成后,就需要想办法下发给出问题 的APP。这里可以有两种方法,一,APP实现了自己的推送功能,也就是和服务器保持稳定的长连接,可以通过这个通道直接把补丁问价推送给用户手机上的APP。另外一种是手机并没有长连接,那么只能在某个时机让APP主动向服务器请求是否需要打补丁,如果需要就下载补丁文件,这个一般都是放在APP启动时去判断。当补丁文件生成后,就可以开始将bugfix分支修复的代码同步合并带主干分支,以确保后续不会出现相同的问题。
Dexposed
Dexposed 是阿里巴巴无线事业部开源的Android平台下的无侵入运行时AOP框架,该框架基于AOP思想,支持经典的AOP使用场景,可应用于日志记录、性能统计、安全控制、事务处理、异常处理等方面。
Dexposed的AOP实现是完全非侵入式的,没有使用任何注解处理器、编织器或者字节码重写器。集成Dexposed,只需要在应用初始化阶段加载一个很小的JNI库。
Dexposed实现的hooking,不仅科技hook应用中的自定义函数,也可以hook应用中调用的Android框架的函数。基于动态类加载技术,运行中的APP可以加载一小段经过编译的Java AOP代码,在不需要重启APP的前提下实现修改目标的APP的行为。
集成Dexposed
依赖一个aar包,其中包含一个名为dexposedbridge.jar的Jar包,以及两个.so文件:libdexposed.so和libdexposed_l.so。在自定义Application中初始化:
private boolean mIsSupported = false;//设备是否支持dexposed
private boolean mIsLDevice = false;//设备Android系统是否是Android 5.0及以上
@Override
public void onCreate(){
super.onCreate();
//check device if support and auto load libs
mIsSupported = DexposedBridge.canDexposed(this);
mIsLDevice = Build.VERSION.SDK_INT >= 21;
}
Dexposed基本用法
在Dexposed中,对于某个函数而言,有三个注入点可供选择:
- 函数执行前注入–before
- 函数执行后注入–after
- 替换函数执行中的代码段–replace