- 在Manifest.xml文件中聲明替身Activity
- Hook掉AMS的
startActivity()方法
- 從參數(shù)中獲取到
Intent,修改其中的ComponentName參數(shù)
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, 達(dá)到欺騙AMS的目的
args[index] = newIntent;
- 這時候如果按照正常的流程,系統(tǒng)將啟動替身Activity,經(jīng)過AMS的啟動,然后調(diào)用到ApplicationThread,調(diào)用ActivityThread的sendMessage方法通過Handler機制發(fā)送消息,H接受消息后調(diào)用handleLaunchActivity()->performLaunchActivity(),完成Activity的啟動
- Hook流程如下:
- 替換掉H類的mCallback屬性,這樣調(diào)用流程將不會走到H的handlerMessage()方法,轉(zhuǎn)而進入自定義的Handler.Callback中。
- 在這里攔截并替換掉StubActivity為我們的目標(biāo)Activity,并且,關(guān)鍵的一步:mActivities.put(token, activity)方法,在這里,使用系統(tǒng)傳過來的token作為key,保存進mActivities中。并且系統(tǒng)之后的其他生命周期方法,都將通過mActivities.get(token)來獲取要管理的activity。這樣,就不用每個生命周期都來替換其中的StubActivity。
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。