背景是:
我正在使用xposed框架连接第三方应用程序。
当我钩住方法xxx时,xposed给了我“classnotfound”错误。我检查并发现方法xxx位于dex文件中,将由dexclassloader在运行时加载。
为了钩住方法xxx,我需要将xposed中的默认类加载器更改为DexClassLoader。要获取DexClassLoader实例,我需要第三方应用程序的上下文实例。
问题来了:如何获取上下文实例?
我搜索了stackoverflow,发现有人说可以在activity或receiver中钩住该方法以检索其上下文。但是我检查了activity.class,没有找到返回上下文类型值的方法,只有一个方法具有上下文类型参数onCreateView(String name, Context context, AttributeSet attrs)
有什么方法可以得到上下文吗?

最佳答案

下面海报的答案更简洁:

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。不需要获取任何上下文。

08-16 15:33