4

如题,想hook第三个app,可以从第三个app的activity中调用我的应用activity。所以想获取第三个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(它在第三个应用程序中,这里的MainActivity属于第三个应用程序。)

   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)
4

2 回答 2

2

您正在尝试使用挂钩应用程序的上下文直接启动应用程序的活动,这不起作用,因为该活动实际上不是挂钩应用程序的一部分(因此出现“未在 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;

您还应该在 your 中设置 your 的属性,android:exported以便它可以由挂钩的应用程序启动。MainActivitytrueAndroidManifest.xml

另外,Context context = (Activity)methodHookParam.getResult();应该是Context context = (Activity)methodHookParam.thisObject;,尽管您实际上根本不需要这种方法。

于 2017-01-19T02:37:56.450 回答
1

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

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

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。希望能帮助到你。

于 2017-01-20T04:32:44.477 回答