【问题标题】:Xposed: How to get the hooked app's context?Xposed:如何获取挂钩应用程序的上下文?
【发布时间】:2017-01-18 02:07:08
【问题描述】:

如题,我想hook第三个app,可以从第三个app的activity中调用我的application activity。所以我想获取第三个app的上下文,怎么办?

第三个app的包是com.ss.android.gallery.heavy,我的项目的包是com.example.hao.hookstartupinterfacetest

我的 Xposed Module.java(这里的 MainActivity 是我项目的活动)

XposedHelpers.findAndHookMethod("com.ss.android.gallery.heavy.activity.SplashActivity",
                loadPackageParam.classLoader, "getMainIntent", new XC_MethodReplacement() {
                    @Override
                    protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {
                        Context context = (Activity)methodHookParam.getResult();
                        return new Intent(context, MainActivity.class);
                    }
                });

SplashActivity.class(在第三个app里面,这里的MainActivity属于第三个app。)

   public class SplashActivity extends BaseSplashActivity{
       protected Intent getMainIntent(){
           return new Intent(this, MainActivity.class);
       }
   }

错误

01-18 20:38:23.669 4730-4730/com.ss.android.gallery.heavy E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.ss.android.gallery.heavy, PID: 4730
    android.content.ActivityNotFoundException: Unable to find explicit activity class {com.ss.android.gallery.heavy/com.example.hao.hookstartupinterfacetest.MainActivity}; have you declared this activity in your AndroidManifest.xml?
        at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1777)
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1501)
        at android.app.Activity.startActivityForResult(Activity.java:3745)
        at android.app.Activity.startActivityForResult(Activity.java:3706)
        at android.app.Activity.startActivity(Activity.java:4016)
        at android.app.Activity.startActivity(Activity.java:3984)
        at com.ss.android.gallery.base.activity.BaseSplashActivity.goMainActivity(BaseSplashActivity.java:61)
        at com.ss.android.gallery.base.activity.BaseSplashActivity.access$000(BaseSplashActivity.java:17)
        at com.ss.android.gallery.base.activity.BaseSplashActivity$1.run(BaseSplashActivity.java:76)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5254)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
        at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:102)

【问题讨论】:

标签: android xposed


【解决方案1】:

您正在尝试使用挂钩应用程序的上下文直接启动您的应用程序的活动,这不起作用,因为该活动实际上不是挂钩应用程序的一部分(因此出现“未在 AndroidManifest.xml 中定义”错误)。创建意图时,您必须明确指定您的应用程序包和类的全名:

Intent intent = new Intent();
intent.setClassName(
    // Your app's package name
    "com.example.hao.hookstartupinterfacetest",
    // The full class name of the activity you want to start
    "com.example.hao.hookstartupinterfacetest.MainActivity");
return intent;

您还应该在AndroidManifest.xml 中将MainActivityandroid:exported 属性设置为true,以便它可以由挂钩的应用程序启动。

另外,Context context = (Activity)methodHookParam.getResult(); 可能应该是 Context context = (Activity)methodHookParam.thisObject;,尽管使用此方法您实际上根本不需要它。

【讨论】:

    【解决方案2】:

    如果你想从一个钩子方法开始一个活动,你可以使用下面的代码。

    注意:答案是基于我对问题的理解(我从问题中看不懂英语)。请在投反对票之前在下面发表评论。

    Intent intent = new Intent();
    intent.setComponent(new ComponentName("com.example.hao.hookstartupinterfacetest", "com.example.hao.hookstartupinterfacetest.MainActivity"));
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    AndroidAppHelper.currentApplication().startActivity(intent);
    

    如果您想获取第三方应用程序的上下文。 您可以将 param.thsobject 强制转换为 Activity。

    Activity activity = (Activity) param.thisobject;
    

    那么你可以使用

    activity.getApplicationContext();
    

    确保类(您要挂接的)是 Activity 的实例,否则您无法将 param.thisobject 强制转换为 Activity。 希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多