如何在android中通过挂钩获取上下文
背景是:如何在android中通过挂钩获取上下文,android,hook,android-context,xposed,Android,Hook,Android Context,Xposed,背景是: 我正在使用xposed framework来挂接第三方应用程序 当我钩住方法XXX时,xposed给了我“ClassNotFound”错误。我检查并发现方法XXX在一个dex文件中,并且会在运行时由DexClassLoader加载 为了钩住方法XXX,我需要将xposed中的默认类加载器更改为DexClassLoader。要获取DexClassLoader实例,我需要第三方应用程序的上下文实例 问题来了:如何获取上下文实例 我搜索了stackoverflow,发现有人说可以在Activ
DexClassLoader
。要获取DexClassLoader
实例,我需要第三方应用程序的上下文实例onCreateView(字符串名称、上下文上下文、属性集属性)
有什么方法可以了解上下文吗 Xposed已经为您提供了当前的hooked apps类加载器
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”是当前的应用程序类加载器。
我想你可能只是打错了什么,你能发布代码吗?但你可以得到当前的上钩应用程序,它可以根据上下文进行浇铸<代码>上下文=(上下文)AndroidAppHelper.currentApplication()代码>
资料来源:
来源:以下海报的答案更为简洁:
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());
}
});
Class instrumentation=XposedHelpers.findClass(
“android.app.Instrumentation”,lpparam.classLoader);
hookAllMethods(插装,“newActivity”,newxc_MethodHook(){
@凌驾
HookedMethod(MethodHookParam param)抛出可丢弃的后受保护的空{
mCurrentActivity=(Activity)参数getResult();
Log.v(标记“当前活动:”+mCurrentActivity.getClass().getName());
}
});
关于类加载器,如果它由主应用程序类加载器组成,则可以从传递给
handleLoadPackage
方法的LoadPackageParam
中检索它
如果应用程序本身创建了一个新的DexClassLoader
,那么您可以钩住DexClassLoader
构造函数来保留对它的引用。
这样,您就拥有了实际的
类加载器,其中包含您的类和方法。无需了解任何上下文。非常感谢!你是对的,在我的例子中,我只需要钩住DexClassLoader。这个问题回答了一个与所问问题不同的问题,虽然原作者很高兴,但对于那些正在寻找“如何获得上下文”这一问题答案的人来说,这是没有用的我发布的代码确实检索了上下文,您可以将其保存在类的静态字段中。这就是说,它确实假设一个活动是预先启动的,但这对于大多数xpose模块来说是可以的。