日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

抖音字體大小設置方法安卓 抖音字體大小設置方法( 六 )


我們先回到解決 MainActivity 多實例問題的出發(fā)點 。之所以要避免 MainActivity 多實例,是為了防止同時出現(xiàn)多個 MainActivity 對象,出現(xiàn)不符合預期的 MainActivity 生命周期的執(zhí)行 。因此只要確保不會同時出現(xiàn)多個 MainActivity 對象,一樣可以解決 MainActivity 多實例問題 。
要避免同時出現(xiàn)多個 MainActivity 對象,我們首先需要知道當前是否已經(jīng)存在 MainActivity 對象,解決這個問題的思路比較簡單,我們可以去監(jiān)聽 Activity 的生命周期,在 MainActivity 的 onCreate 和 onDestroy 中分別去增加減少 MainActivity 的實例數(shù) 。如果 MainActivity 實例數(shù)為 0 則認為當前不存在 MainActivity 對象 。
解決了 MainActivity 對象數(shù)統(tǒng)計的問題,接下來我們就需要讓 MainActivity 同時存在的對象數(shù)永遠保持在 1 個以下 。要解決這個問題我們需要回顧一下 Activity 的啟動流程,啟動一個 Activity 首先會經(jīng)過 AMS,AMS 會再調用到 Activity 所在的進程,在 Activity 所在的進程會經(jīng)過主線程的 Handler post 到主線程,然后通過 Instrumentation 去創(chuàng)建 Activity 對象,以及執(zhí)行后續(xù)的生命周期 。對于外部啟動 MainActivity ,我們能夠控制的是從 AMS 回到進程之后的部分,這里可以選擇以 Instrumentation 的 newActivity 作為入口 。

抖音字體大小設置方法安卓 抖音字體大小設置方法


具體來說我們的優(yōu)化方案如下:
繼承 Instrumentation 實現(xiàn)一個自定義的 Instrumentaion 類,以代理轉發(fā)方式重寫里面的所有方法;反射獲取 ActivityThread 中 Instrumentaion 對象,并以其為參數(shù)創(chuàng)建一個自定義的 Instrumentaion 對象,通過反射方式用自定義的 Instrumentaion 對象替換 ActivityThread 原有的 Instrumentaion;在自定義 Instrumentaion 類的 newActivity 方法中,進行判斷當前待創(chuàng)建的 Activity 是否為 MainActivity,如果不是 MainActivity 或者當前不存在 MainActivity 對象,則調用原有實現(xiàn),否則替換其 className 參數(shù)將其指向一個空的 Activity,以創(chuàng)建一個空的 Activity;在這個空的 Activity 的 onCreate 中 finish 掉自己,同時通過一個添加了 FLAG_ACTIVITY_NEW_TASK 和 FLAG_ACTIVITY_CLEAR_TOP flag 的 Intent 去啟動一下 SplashActivity 。
抖音字體大小設置方法安卓 抖音字體大小設置方法


需要注意的是我們這里 hook Instrumentaion 的實現(xiàn)方案,在高版本的 Android 系統(tǒng)上我們也可以以 AppComponentFactory instantiateActivity 的方式替換 。
1.4.2 反序列化優(yōu)化
抖音 Activity 階段另一個典型的優(yōu)化是反序列化的優(yōu)化——在抖音使用過程中會在本地序列化一部分數(shù)據(jù),在啟動過程中需要對這部分數(shù)據(jù)進行反序列化,這個過程會對抖音的啟動速度造成影響 。在之前的優(yōu)化過程中,我們從業(yè)務層面對 block 邏輯進行了異步化、快照化等 case by case 的優(yōu)化,取得了不錯的效果,但是這樣的方式維護起來比較麻煩,迭代過程也經(jīng)常出現(xiàn)劣化,因此我們嘗試以正面優(yōu)化反序列化的方式進行優(yōu)化 。
抖音啟動階段的反序列化問題具體來說就是 Gson 數(shù)據(jù)解析耗時問題,Gson 是 Google 推出的一個 json 解析庫,其具有接入成本低、使用便捷、功能擴展性良好等優(yōu)點,但是其也有一個比較明顯的弱點,那就是對于它在進行某個 Model 的首次解析時會比較耗時,并且隨著 Model 復雜程度的增加,其耗時會不斷膨脹 。
Gson 的首次解析耗時與它的實現(xiàn)方案有關,在 Gson 的數(shù)據(jù)解析過程中有一個非常重要的角色,那就是 TypeAdapter,對于每一個待解析的對象的 Class,Gson 會首先為其生成一個 TypeAdapter,然后利用這個 TypeAdapter 進行解析,Gson 默認的解析方案采用的是 ReflectiveTypeAdapterFactory 創(chuàng)建的 TypeAdapter 的,其創(chuàng)建與解析過程中涉及到大量的反射調用,具體流程為:

推薦閱讀