2015-01-21 29 views
0

獲取上下文背景是:如何,直接掛上的Android

  1. 我使用xposed框架掛接第三方應用程序。
  2. 當我鉤方法XXX時,xposed給了我「ClassNotFound」錯誤。我檢查並發現方法XXX在dex文件中,並且在運行時由DexClassLoader加載。
  3. 鉤住方法XXX,我需要將默認的ClassLoader更改爲DexClassLoader。要獲得DexClassLoader實例,我需要第三方應用程序的Context實例。
  4. 問題出在這裏:如何獲取上下文實例?

我搜索了stackoverflow,發現有人說你可以在Activity或Receiver中掛鉤方法來檢索它們的上下文。但是我檢查了Activity.class,發現沒有返回Context類型值的方法,並且只有一個方法具有Context類型參數onCreateView(String name, Context context, AttributeSet attrs)

有什麼方法可以獲得上下文嗎?

回答

1

從下面的海報答案是更簡潔:

Context context = (Context) AndroidAppHelper.currentApplication(); 

一種替代劈是檢索當前活動(其可被強制轉換爲上下文)像這樣:

Class<?> instrumentation = XposedHelpers.findClass(
       "android.app.Instrumentation", lpparam.classLoader); 

XposedBridge.hookAllMethods(instrumentation, "newActivity", new XC_MethodHook() { 

       @Override 
       protected void afterHookedMethod(MethodHookParam param) throws Throwable { 

        mCurrentActivity = (Activity) param.getResult(); 

        Log.v(TAG, "Current Activity : " + mCurrentActivity.getClass().getName()); 
       } 
}); 

關於類加載器,如果它由主應用類加載器組成,那麼您可以從LoadPackageParam中檢索它,傳遞給handleLoadPackage方法。

如果應用程序本身創建了一個新的DexClassLoader,那麼您可以掛鉤DexClassLoader構造函數來保存對它的引用。 這樣,你有實際的ClassLoader,其中包含您的類和方法。無需獲得任何上下文。

+0

非常感謝!你說得對,就我而言,只需要連接DexClassLoader即可。 – 2015-06-01 07:45:02

+0

這個問題回答了一個與問題不同的問題,而原始作者很高興,這對尋找「如何獲取上下文」這個陳述問題的答案的人沒有用。 – baordog 2016-10-20 18:13:45

+0

我發佈的代碼確實檢索上下文並且你可以將它保存在類的靜態字段中。也就是說,它確實假設事先啓動了一個活動,但對於大多數Xposed模塊來說都沒問題。 – 4knahs 2016-10-21 12:43:57

6

Xposed已經爲您提供了當前掛鉤的應用程序類加載器。

public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable { 
     if (!lpparam.packageName.equals("com.android.systemui")) 
      return; 

     findAndHookMethod("com.android.systemui.statusbar.policy.Clock", lpparam.classLoader, "updateClock", new XC_MethodHook() { 
      @Override 
      protected void beforeHookedMethod(MethodHookParam param) throws Throwable { 
       // this will be called before the clock was updated by the original method 
      } 
      @Override 
      protected void afterHookedMethod(MethodHookParam param) throws Throwable { 
       // this will be called after the clock was updated by the original method 
      } 
    }); 
    } 

正如你可以看到「lpparam.classLoader」是當前的應用程序類加載器。 我想你可能只是輸入了錯誤的東西,你能發佈代碼嗎?但是你可以獲得目前吸引人的應用程序應用程序強烈的女巫可以流傳到上下文中。 Context context = (Context) AndroidAppHelper.currentApplication();

來源:https://github.com/rovo89/XposedBridge/blob/master/src/android/app/AndroidAppHelper.java#L131 來源:https://github.com/rovo89/XposedBridge/wiki/Development-tutorial