我系蒼王,歡迎關(guān)注的源碼分析的第三節(jié)
歡迎瀏覽我之前的文章钥顽,有興趣可以參考一下义屏,可以給個喜歡或者關(guān)注我的文章,謝謝蜂大。
[Android]如何做一個崩潰率少于千分之三噶應(yīng)用app(9)-Small插件化
這一節(jié)主要介紹的是Actvity間跳轉(zhuǎn)流程
三.跳轉(zhuǎn)流程
1.很明顯small的跳轉(zhuǎn)是跨模塊的闽铐。
我們可以很容易就找到Small使用的跳轉(zhuǎn)函數(shù),如Small.openUri
我們在第一節(jié)的時候有介紹過奶浦,Small也是使用通用Actvity占坑方法兄墅,來欺騙Android系統(tǒng)啟動的。
makeUri會將跳轉(zhuǎn)封裝為baseUri和uriString
我們看一下openUri澳叉,他會調(diào)用ApplicalicationUtils.openUri
還是會調(diào)用context.startActvity的
2.但并不是這樣就完了隙咸,ApkBundleLauncher里面有InstumentationWrapper沐悦,通過onCreate的方法調(diào)用,它會反射到sInstumentation這個變量五督。
閱讀過Activity啟動流程都會找到藏否,會調(diào)用到Instumentation的execStartActivity的方法,然后才會代理模式代理到Native層運(yùn)行充包。
在這里我們會使用wrapIntent的方法來包裝Intent,這里會把取得realClazz副签,是真正啟動Activity的包名和名字,將realClazz的放到addCategory里面用來傳遞基矮。
調(diào)用dequeStubActivity的方法淆储,來獲取占坑的Activity的名字,以此來欺騙AndroidMaifest注冊的檢測家浇。
?最后還是會通過反射來將該方法反射運(yùn)行
3.通過包裝欺騙后本砰,很明顯,當(dāng)回調(diào)的時候蓝谨,需要將Activity的信息替換回來(這里需要查看一下插件化的源碼分析)灌具,我們之前有提示過有onCreate的時候sCallBack的反射替換
然后通過檢測LAUNCH_ACTIVITY來檢測啟動的流程。
通過拆包unwrapIntent的方法從Category里面獲取會真正的Activity名字
在sLoadedActivities里面獲取會相關(guān)信息譬巫,然后反射替換Activity的信息
替換ActivityInfo的相關(guān)信息
這樣就啟動跳轉(zhuǎn)完成了咖楣,而Activity將會享有本來的Instumentation和自定義的InstumentationWrapper全部生命周期里面的行為。
這一節(jié)就介紹到這里
下一節(jié)將會介紹InstumentaionWrapper究竟做了做了什么事情芦昔。
敬請期待S栈摺!咕缎!