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。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容