DroidPlugin Hook機(jī)制之Activity生命周期管理簡述

  • 在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";

    // 這里我們把啟動(dòng)的Activity臨時(shí)替換為 StubActivity
    ComponentName componentName = new ComponentName(targetPackage, StubActivity.class.getCanonicalName());
    newIntent.setComponent(componentName);

    // 把我們?cè)家獑?dòng)的TargetActivity先存起來
    newIntent.putExtra(HookHelper.EXTRA_TARGET_INTENT, raw);

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

友情鏈接更多精彩內(nèi)容