使用 Jetpack App Startup 库减少应用启动时间

使用 Jetpack App Startup 库减少应用启动时间

作者 / Yacine Rezgui

应用启动时间是应用性能的关键衡量指标。应用启动后,用户期望能够得到快速响应并加载内容,当不符合预期时用户会感到失望。这种糟糕的体验可能会导致用户在 Play 商店上对您的应用给予低分数的评价,甚至不会再次使用。

Jetpack App Startup 库在应用启动时以一种简单、高效的方法来初始化组件。库开发者和应用开发者都可以使用 App Startup 简化启动流程,并显式指定初始化顺序。

应用和库往往需要在 Application.onCreate() 之前初始化组件,如: WorkManagerProcessLifecycleObserverFirebaseApp 等。这往往通过使用 ContentProvider 来实现不同依赖的初始化。通过 App Startup,您无需为每个组件单独定义 ContentProvider 进行初始化,而可以定义多个 Initializer 去共享相同的 ContentProvider。每减少一个 ContentProvider 通常会有约 2ms 的收益,这可以显著提高应用启动速度。App Startup 还可以简化 延迟初始化组件 操作,从而帮助您进一步提高启动性能。当 App Startup 进入稳定版本后,我们将更新诸如 WorkManager 和 ProcessLifecycle 之类的库,以从中受益。

App Startup 支持 API 14 及以上。

如何使用

配置 Gradle

为了在您的依赖库或应用中使用 App Startup,您需要在 Gradle 文件中添加如下依赖项:

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

定义 Initializer

为了在应用中使用 App Startup,您需要定义一个 Initializer。您可以在此定义如何初始化以及指定依赖其他的 Initializer。这是您需要实现的接口:

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

在实际案例中,初始化 WorkManager 的 Initializer 可能如下:

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 依赖库定义。

最后,我们需要在 AndroidManifest.xml 中增加 WorkManagerInitializer 条目:

<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 文件中查找 条目来发现 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 版本。您可以从我们的 文档 中找到有关如何使用它的更多信息。如果您在使用中出现任何问题,请及时向我们 反馈问题,以帮助我们更好地改进。

版权声明

禁止一切形式的转载-禁止商用-禁止衍生 申请授权

脉脉不得语
脉脉不得语
Zhengzhou Website
Android Developer | https://androiddevtools.cn and https://androidweekly.io WebMaster | GDG Zhengzhou Funder & Ex Organizer | http://Toast.show(∞) Podcast Host

你已经成功订阅到 Android 开发技术周报
太棒了!接下来,完成检验以获得全部访问权限 Android 开发技术周报
欢迎回来!你已经成功登录了。
Unable to sign you in. Please try again.
成功!您的帐户已完全激活,您现在可以访问所有内容。
Error! Stripe checkout failed.
Success! Your billing info is updated.
Error! Billing info update failed.