背景是:
我正在使用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
。不需要获取任何上下文。