Dexposed热更新-偷偷改掉你的bug

简介:

新技术真是层次不穷,八月份阿里做了件深的猿心的一件小事:dexposed 开源了。来看看 dexposed 是个啥?

What is it?

相信 Android 开发猿猿们都有过这个烦恼: Android 客户端应用上线以后,难免会出现一些 bug ,特别是有些 bug 可能就只需要修改部分一两句代码的事,但是有不得不修复,然后发包。频繁发包,对用户,对开发来说的都是很蛋疼的体验。所以优化的思路是在不发版本的情况下热更新,以期提高用户体验。
 Dexposed 是一个强大的非侵入性 AOP 开源框架,针对 Android 开发的热更新。这个框架是在另一个开源框架:Xposed的基础上优化出来的。


如何使用?

  • 引入依赖包:

dependencies {
        compile 'com.taobao.android:dexposed:0.1.1@aar'
    }
  • 初始化并判断你使用的版本能否使用(某些版本还在测试中)
 public class MyApplication extends Application {
 @Override public void onCreate() {        
 // Check whether current device is supported (also initialize Dexposed framework if not yet)
            if (DexposedBridge.canDexposed(this)) {
                // Use Dexposed to kick off AOP stuffs.
                ...
            }
        }
        ...
    }
  • 在patch工程中修复你的bug

你要修复的 bug 肯定是围绕这某个类某个方法去修改的,所以这里提供了三种方式:

1 在方法前插入逻辑 。

2 替换掉某个方法。

3 在某个方法之后插入逻辑。

例子1:下面这个例子演示如何在 Activity.onCreate(Bundle) 这个方法之前之后加入代码片段:

//Target class, method with parameter types, followed by the hook callback (XC_MethodHook)
 DexposedBridge.findAndHookMethod(Activity.class, "onCreate", Bundle.class, new XC_MethodHook() {
    // To be invoked before Activity.onCreate().
   @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
   // "thisObject" keeps the reference to the instance of target class.
   Activity instance = (Activity) param.thisObject;
   // The array args include all the parameters. 
   Bundle bundle = (Bundle) param.args[0];
   Intent intent = new Intent();
    // XposedHelpers provide useful utility methods.
   XposedHelpers.setObjectField(param.thisObject, "mIntent", intent);
   // Calling setResult() will bypass the original method body use the result as method return value directly.
   if (bundle.containsKey("return"))
    param.setResult(null);
   }
 
   // To be invoked after Activity.onCreate()
   @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable {
     XposedHelpers.callMethod(param.thisObject, "sampleMethod", 2);
   }
 });


 

 例子2:整个方法替换(我喜欢这种方式,干净利落)
DexposedBridge.findAndHookMethod(Activity.class, "onCreate", Bundle.class, new XC_MethodReplacement() {

            @Override protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
                // Re-writing the method logic outside the original method context is a bit tricky but still viable.
                ...
            }

        });
  • 支持的版本
Runtime Android Version Support
Dalvik 2.2 Not Test
Dalvik 2.3 Yes
Dalvik 3.0 No
Dalvik 4.0-4.4 Yes
ART 5.0 Testing
ART 5.1 No
ART M No

github:https://github.com/alibaba/dexposed

目录
相关文章
|
3月前
|
测试技术 API
修改bug引入更多bug怎么办?
修改bug引入更多bug怎么办?
|
6月前
|
SQL JSON 前端开发
【改BUG】项目遇到的奇葩bug
【改BUG】项目遇到的奇葩bug
|
图形学 Android开发 iOS开发
|
10月前
|
Java
以下代码找bug
以下代码找bug
86 0
|
10月前
|
缓存 JavaScript
我修复了一个 Vite Bug,让我的项目首屏性能提高了 25%
我修复了一个 Vite Bug,让我的项目首屏性能提高了 25%
133 0
|
11月前
|
测试技术 数据库
项目上线出bug怎么处理
项目上线出bug怎么处理
|
XML 安全 数据格式
测试妹子提了个bug,为什么你多了个options请求?
对于简单请求来说,如果请求跨域,那么浏览器会放行让请求发出。浏览器会发出cors请求,并携带origin。此时不管服务端返回的是什么,浏览器都会把返回拦截,并检查返回的response的header中有没有Access-Control-Allow-Origin是否为true,说明资源是共享的,可以拿到。如果没有这个头信息,说明服务端没有开启资源共享,浏览器会认为这次请求失败终止这次请求,并且报错。
173 0
测试妹子提了个bug,为什么你多了个options请求?
|
Java 应用服务中间件 Docker
同事嫌我改Bug慢,原来是没掌握这些代码Debug技巧
代码Debug调试是研发工程师日常工作中必不可少的重要组成部分。进行代码Debug调试的目的无非就两个,一个是自我检查代码逻辑是否有问题,便于自己将Bug消灭在测试介入之前;另一个是进行线上问题排查定位,找到实际在跑业务的过程中出现的Bug。
同事嫌我改Bug慢,原来是没掌握这些代码Debug技巧
|
缓存 Java 编译器
神奇的bug,解决方法就是试试...
神奇的bug,解决方法就是试试...
107 0
神奇的bug,解决方法就是试试...
|
运维 前端开发 Java
一个简单的跨域问题,一不小心就带来三个大大的 BUG
hello 大家好,我是阿粉,最近在做一个前后分离的项目,天天除了跟前端就是跟测试撕逼。今天,阿粉带着大家来了解一下 最近在项目中遇到的一个坑。