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

抖音字體大小設(shè)置方法安卓 抖音字體大小設(shè)置方法( 二 )


關(guān)于 MutilDex 優(yōu)化的更多細(xì)節(jié)可以參照之前的一篇公眾號文章,目前該方案已經(jīng)開源,具體見該項(xiàng)目的 github 地址(https://github.com/bytedance/BoostMultiDex) 。
1.2 ContentProvider 優(yōu)化
接下來介紹的是ContentProvider的相關(guān)優(yōu)化,ContentProvider 作為 Android 四大組件之一,其在生命周期方面有著獨(dú)特性——Activity、Service、BroadcastReceiver 這三大組件都只有在它們被調(diào)用到時(shí),才會進(jìn)行實(shí)例化,并執(zhí)行它們的生命周期;ContentProvider 即使在沒有被調(diào)用到,也會在啟動階段被自動實(shí)例化并執(zhí)行相關(guān)的生命周期 。在進(jìn)程的初始化階段調(diào)用完 Application 的 attachBaseContext 方法后,會再去執(zhí)行 installContentProviders 方法,對當(dāng)前進(jìn)程的所有 ContentProvider 進(jìn)行 install 。
這個(gè)過程將會對當(dāng)前進(jìn)程的所有 ContentProvider 通過 for 循環(huán)的方式逐一進(jìn)行實(shí)例化、調(diào)用它們的 attachInfo 與 onCreate 生命周期方法,最后將這些 ContentProvider 關(guān)聯(lián)的 ContentProviderHolder 一次性 publish 到 AMS 進(jìn)程 。

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


ContentProvider 這種在進(jìn)程初始化階段自動初始化的特性,使得在其作為跨進(jìn)程通信組件的同時(shí),也被一些模塊用來進(jìn)行自動初始化,這其中最為典型的就是官方的 Lifecycle 組件,其初始化就是借助了一個(gè)叫 ProcessLifecycleOwnerInitializer 的 ContentProvider 進(jìn)行初始化的 。
LifeCycle 的初始化只是進(jìn)行了 Activity 的 LifecycleCallbacks 的注冊耗時(shí)不多,我們在邏輯層面上不需要做太多的優(yōu)化 。值得注意的是,如果這類用于進(jìn)行初始化的 ContentProvider 非常多,ContentProvider 本身的創(chuàng)建、生命周期執(zhí)行等堆積起來也會非常耗時(shí) 。針對這個(gè)問題,我們可以通過 JetPack 提供的 Startup 將多個(gè)初始化的 ContentProvider 聚合成一個(gè)來進(jìn)行優(yōu)化 。
除了這類耗時(shí)很少的 ContentProvider,在實(shí)際優(yōu)化過程中我們也發(fā)現(xiàn)了一些耗時(shí)較長的 ContentProvider,這里大致介紹一下我們的優(yōu)化思路 。
public class ProcessLifecycleOwnerInitializer extends ContentProvider {
@Override
public boolean onCreate() {
LifecycleDispatcher.init(getContext());
ProcessLifecycleOwner.init(getContext());
return true;
}
}
對于我們自己的 ContentProvider,如果初始化耗時(shí)我們可以通過重構(gòu)的方式將自動初始化改為按需初始化 。對于一些三方甚至是官方的 ContentProvider,則無法直接通過重構(gòu)的方式進(jìn)行優(yōu)化 。這里以官方的 FileProvider 為例,來介紹我們的優(yōu)化思路 。
FileProvider 使用
FileProvider 是 Android7.0 引入的用于進(jìn)行文件訪問權(quán)限控制的組件,在引入 FileProvider 之前我們對于拍照等一些跨進(jìn)程的文件操作,是以直接傳遞文件 Uri 的方式進(jìn)行的;在引入 FileProvider 后,我們的整個(gè)過程則為:
首先繼承 FileProvider 實(shí)現(xiàn)一個(gè)自定義的 FileProvider,并把這個(gè) Provider 在 manifest 中進(jìn)行注冊,為其 FILE_PROVIDER_PATHS 屬性關(guān)聯(lián)一個(gè) file path 的 xml 文件;使用方法通過 FileProvider 的 getUriForFile 方法將文件路徑轉(zhuǎn)化為 Content Uri,然后去調(diào)用 ContentProvider 的 query、openFile 等方法 。當(dāng) FileProvider 被調(diào)用到時(shí),將會首先去進(jìn)行文件路徑的校驗(yàn),判斷其是否在第 1 步定義的 xml 中,文件路徑校驗(yàn)通過則繼續(xù)執(zhí)行后續(xù)的邏輯 。
耗時(shí)分析
從上面的過程來看,只要我們在啟動階段沒有 FileProvider 的調(diào)用,是不會有 FileProvider 的相關(guān)耗時(shí)的 。但實(shí)際上從啟動 trace 來看,我們的啟動階段是存在 FileProvider 相關(guān)耗時(shí)的,具體的耗時(shí)則是在 FileProvider 的生命周期方法 attachInfo 方法中,F(xiàn)ileProvider 的 attachInfo 方法除了會去調(diào)用我們最為熟悉的 onCreate 方法,同時(shí)還會去調(diào)用 getPathStrategy 方法,我們的耗時(shí)則是集中在這個(gè) getPathStrategy 方法中 。

推薦閱讀