DroidPlugin Hook机制之Activity生命周期管
2018-01-18 本文已影响3人
LeonXtp
- 在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。