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

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


從實現(xiàn)來看,getPathStrategy 方法主要是進行 FileProvider 關聯(lián) xml 文件的解析,解析結(jié)果將會賦值給 mStrategy 變量 。進一步分析我們會發(fā)現(xiàn) mStrategy 會在 FileProvider 的 query、getType、openFile 等接口進行文件路徑校驗時用到,而我們的 query、getType、openFile 等接口在啟動階段是不會被調(diào)用到的,因此 FileProvider attachInfo 方法中的 getPathStrategy 是完全沒有必要的,我們完全可以在 query、getType、openFile 等接口被調(diào)用到的時候再去執(zhí)行 getPathStrategy 邏輯 。

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


優(yōu)化方案
FileProvider 是 androidx 中的代碼,我們無法直接修改,但是它會參與我們的代碼編譯,我們可以在編譯階段通過修改字節(jié)碼的方式去修改它的實現(xiàn),具體的實現(xiàn)方案為:
對 ContentProvider 的 attachInfo 方法進行插樁,在執(zhí)行原有實現(xiàn)前將參數(shù) ProviderInfo 的 grantUriPermissions 設置為 false,然后調(diào)用原實現(xiàn)并進行異常捕獲,在調(diào)用完成后再對 ProviderInfo 的 grantUriPermissions 設置回 true,利用 grantUriPermissions 的檢查繞過 getPathStrategy 的執(zhí)行 。(這里之所以沒有使用 ProviderInfo 的 exported 異常檢測繞過 getPathStrategy 調(diào)用是因為在 attachInfo 的 super 方法中會對 ProviderInfo 的 exported 屬性進行緩存)
public void attachInfo(@NonNull Context context, @NonNull ProviderInfo info) {
super.attachInfo(context, info);
// Sanity check our security
if (info.exported) {
throw new SecurityException("Provider must not be exported");
}
if (!info.grantUriPermissions) {
throw new SecurityException("Provider must grant uri permissions");
}
mStrategy = getPathStrategy(context, info.authority);
}
2. 對 FileProvider 的 query、getType、openFile 等方法進行插樁,在調(diào)用原方法之前首先進行 getPathStrategy 的初始化,完成初始化之后再調(diào)用原始實現(xiàn) 。
單個 FileProvider 的耗時雖然不多,但是對于一些大型的 app,為了模塊解耦其可能會有多個 FileProvider,在這種情況下 FileProvider 優(yōu)化的收益還是比較可觀的 。與 FileProvider 類似,Google 提供的 WorkManager 也會存在初始化的 ContentProvider,我們可以采用類似的方式進行優(yōu)化 。
1.3 啟動任務重構(gòu)與任務調(diào)度
啟動的第三個階段是 Application 的 onCreate 階段,這個階段是啟動任務執(zhí)行的高峰階段,該階段的優(yōu)化就是針對各類啟動任務的優(yōu)化,具有極強的業(yè)務關聯(lián)性,這里簡單介紹一下我們優(yōu)化的大概思路 。
抖音字體大小設置方法安卓 抖音字體大小設置方法


抖音啟動任務優(yōu)化的核心思想是代碼價值最大化和資源利用率最大化 。其中代碼價值最大化主要是確定哪些任務應該在啟動階段執(zhí)行,它的核心目標是將不應該在啟動階段執(zhí)行的任務從啟動階段去除掉;資源利用率最大化則是在啟動階段任務已經(jīng)確定的情況下,盡可能多的去利用系統(tǒng)資源以達到減少任務執(zhí)行耗時的目的 。對于單個任務而言,我們需要去優(yōu)化它的內(nèi)部實現(xiàn),減少它本身的資源消耗以提供更多資源給其他任務執(zhí)行,對于多個任務則是通過合理的調(diào)度以充分利用系統(tǒng)的資源 。
從落地角度而言我們主要圍繞兩個事情開展:啟動任務重構(gòu)與任務調(diào)度 。
啟動任務重構(gòu)
由于業(yè)務復雜度較高且前期對啟動任務的管控較為寬松,抖音啟動階段的任務有超過 300 個,這種情況下對啟動階段的任務進行調(diào)度能夠在一定程度上提升啟動速度,但是仍然比較難將啟動速度提升到一個較高的水平,因此啟動優(yōu)化中非常重要的一個方向就是減少啟動任務 。
為此我們將啟動任務分成了配置任務、預加載任務和功能任務三大類 。其中配置任務主要用于對各類 sdk 進行初始化,在它沒有執(zhí)行之前相關的 sdk 是無法工作的;預加載任務主要是為了對后續(xù)的某些功能進行預熱,以提升后續(xù)功能的執(zhí)行速度;功能任務則是在進程啟動這一生命周期執(zhí)行的與功能相關的任務 。對于這三類任務我們采用了不同的改造方式:

推薦閱讀