DroidPlugin Hook机制之Activity生命周期管理简述

  • 在Manifest.xml文件中声明替身Activity
  • Hook掉AMS的startActivity()方法
  • 从参数中获取到Intent,修改其中的ComponentName参数
    raw = (Intent) args[index];

    Intent newIntent = new Intent();

    // 这里包名直接写死,如果再插件里,不同的插件有不同的包  传递插件的包名即可
    String targetPackage = "com.weishu.intercept_activity.app";

    // 这里我们把启动的Activity临时替换为 StubActivity
    ComponentName componentName = new ComponentName(targetPackage, StubActivity.class.getCanonicalName());
    newIntent.setComponent(componentName);

    // 把我们原始要启动的TargetActivity先存起来
    newIntent.putExtra(HookHelper.EXTRA_TARGET_INTENT, raw);

    // 替换掉Intent, 达到欺骗AMS的目的
    args[index] = newIntent;
  • 这时候如果按照正常的流程,系统将启动替身Activity,经过AMS的启动,然后调用到ApplicationThread,调用ActivityThread的sendMessage方法通过Handler机制发送消息,H接受消息后调用handleLaunchActivity()->performLaunchActivity(),完成Activity的启动
  • Hook流程如下:
    • 替换掉H类的mCallback属性,这样调用流程将不会走到H的handlerMessage()方法,转而进入自定义的Handler.Callback中。
    • 在这里拦截并替换掉StubActivity为我们的目标Activity,并且,关键的一步:mActivities.put(token, activity)方法,在这里,使用系统传过来的token作为key,保存进mActivities中。并且系统之后的其他生命周期方法,都将通过mActivities.get(token)来获取要管理的activity。这样,就不用每个生命周期都来替换其中的StubActivity。

你可能感兴趣的:(DroidPlugin Hook机制之Activity生命周期管理简述)