使用 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 版本。您能够从咱们的 文档 中找到有关如何使用它的更多信息。若是您在使用中出现任何问题,请及时向咱们 反馈问题,以帮助咱们更好地改进。

相关文章
相关标签/搜索