使用 Jetpack App Startup 庫減小應用啓動時間

做者 / Yacine Rezguinode

應用啓動時間是應用性能的關鍵衡量指標。應用啓動後,用戶指望可以獲得快速響應並加載內容,當不符合預期時用戶會感到失望。這種糟糕的體驗可能會致使用戶在 Play 商店上對您的應用給予低分數的評價,甚至不會再次使用。android

Jetpack App Startup 庫在應用啓動時以一種簡單、高效的方法來初始化組件。庫開發者和應用開發者均可以使用 App Startup 簡化啓動流程,並顯式指定初始化順序。app

應用和庫每每須要在 Application.onCreate() 以前初始化組件,如: WorkManagerProcessLifecycleObserverFirebaseApp 等。這每每經過使用 ContentProvider 來實現不一樣依賴的初始化。經過 App Startup,您無需爲每一個組件單獨定義 ContentProvider 進行初始化,而能夠定義多個 Initializer 去共享相同的 ContentProvider。每減小一個 ContentProvider 一般會有約 2ms 的收益,這能夠顯著提升應用啓動速度。App Startup 還能夠簡化 延遲初始化組件 操做,從而幫助您進一步提升啓動性能。當 App Startup 進入穩定版本後,咱們將更新諸如 WorkManager 和 ProcessLifecycle 之類的庫,以從中受益。maven

App Startup 支持 API 14 及以上。ide

如何使用

配置 Gradle

爲了在您的依賴庫或應用中使用 App Startup,您須要在 Gradle 文件中添加以下依賴項:性能

repositories {
    google()
    maven()
}
dependencies {
  implementation "androidx.startup:startup-runtime:1.0.0"
}

定義 Initializer

爲了在應用中使用 App Startup,您須要定義一個 Initializer。您能夠在此定義如何初始化以及指定依賴其餘的 Initializer。這是您須要實現的接口:ui

interface Initializer<out T: Any> {
    fun create(context: Context): T
    fun dependencies(): List<Class<out Initializer<*>>>
}

在實際案例中,初始化 WorkManager 的 Initializer 可能以下:google

class WorkManagerInitializer : Initializer<WorkManager> {
    override fun create(context: Context): WorkManager {
        val configuration = Configuration.Builder()
            .setMinimumLoggingLevel(Log.DEBUG)
            .build()
        WorkManager.initialize(context, configuration)
        return WorkManager.getInstance(context)
    }
    // 此組件無需任何依賴
    override fun dependencies() = emptyList<Class<out Initializer<*>>>()
}

提示 : 此示例爲純粹說明性質,該 Initializer 實際上應該由 WorkManager 依賴庫定義。code

最後,咱們須要在 AndroidManifest.xml 中增長 WorkManagerInitializer 條目:component

<provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    android:exported="false"
    tools:node="merge">
    <!-- This entry makes WorkManagerInitializer discoverable. -->
    <meta-data android:name="com.example.WorkManagerInitializer"
          android:value="androidx.startup" />
</provider>

工做原理

App Startup 使用了一個名爲 InitializationProvider 的 ContentProvider。該 ContentProvider 在合併後的 AndroidManifest.xml 文件中查找 <meta-data> 條目來發現 Initializer。此過程發生在 Application.onCreate() 被調用以前。

完成上一階段以後,加載組件以前會先加載該組件的全部依賴項。所以,能夠確保組件的全部依賴項都已完成初始化後纔對其進行初始化。

延遲初始化

咱們強烈推薦您使用延遲初始化來進一步提高啓動性能,您能夠經過以下方式實現組件的延遲初始化,在 <meta-data> 條目下爲 Initializer 增長 tools:node="remove" 屬性,這將禁用即時初始化:

<provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    android:exported="false"
    tools:node="merge">

    <!-- 禁用即時初始化 -->
    <meta-data android:name="com.example.WorkManagerInitializer"
              tools:node="remove" />
</provider>

爲了實現 WorkManagerInitializer 的延遲初始化,您能夠進行以下操做:

// 此處返回一個 WorkManager 的實例
AppInitializer.getInstance(context)
    .initializeComponent(WorkManagerInitializer.class);

至此,您的應用已經延遲初始化該組件了。您能夠閱讀咱們的 詳細文檔

最後

App Startup 目前處於 1.0.0 版本。您能夠從咱們的 文檔 中找到有關如何使用它的更多信息。若是您在使用中出現任何問題,請及時向咱們 反饋問題,以幫助咱們更好地改進。

相關文章
相關標籤/搜索