Dexposedホットアップデート-こっそりバグを修正


新技術は本当に階層が尽きず、8月にアリは深い猿心の小さなことをした: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工事でバグを修復
  • 修復するバグは、このクラスのメソッドをめぐって修正されているに違いありません.ここでは3つの方法があります.
    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