Android 启动优化: JetPack App Startup 使用及源码浅析

前言

最近看到很多人在问 JetPack App Startup,很多人对它还不是很了解。

今天,就让我们来聊一聊 JetPack App Startup。

目录

1 什么是 JetPack App Startup
2 JetPack App Startup 能解决什么问题
3 JetPack App Startup 基本使用
4 JetPack App Startup 进阶使用
5 JetPack App Startup 源码浅析
6 小结

什么是 JetPack App Startup

我们先来看一下官方的解释

The App Startup library provides a straightforward, performant way to initialize components at application startup. Both library developers and app developers can use App Startup to streamline startup sequences and explicitly set the order of initialization.

Instead of defining separate content providers for each component you need to initialize, App Startup allows you to define component initializers that share a single content provider. This can significantly improve app startup time.

翻译过来就是:

  1. App Startup 这个库提供了一个组件,可以在应用程序启动的时候初始化。
  2. 开发人员可以使用这个组件精简启动序列和显式地设置初始化的顺序。
  3. 我们不需要为每个组件定义单独的 ContentProvider,App Startup 允许您定义的所有组件化共享一个内容提供者。这样可以极大地减少高应用程序的启动时间

JetPack App Startup 能解决什么问题

听了上面的介绍,是不是还有点懵?

App Startup 能减少高应用程序的启动时间,它是怎么做到的?

做过 Android 启动优化的,可能都知道,Android 的启动流程是这样的。

从 Application#attachBaseContext 到 ContentProvider#onCreate,到 Application#onCreate 再到 MainActivity#onCreate。

App Startup 设计的初衷,正是为了收拢 ContentProvider。有不少第三方的 SDk,为了使用者不必手动调用 SDK#init 方法,使用了 ContentProvider 这一个骚操作。

在 AndroidManifest 里面注册了自己的 xxSDkProvider,然后在 xxSDkProvider 的 onCreate 方面里面进行初始化,确实调用者不需要自己初始化了,可却增加了启动耗时,如果要作优化,还得自己剔除 ContentProvider 的初始化,值不值得,我是感觉没必要,这操作是真的骚

1<application ...>
2
3    <provider
4        android:name=".xxSDkProvider"
5        android:authorities="${applicationId}.xxSDkProvider"
6        android:exported="false" />
7
8</application>
 1class XXSDKProvider : ContentProvider() {
   
 2
 3    override fun onCreate(): Boolean {
   
 4        Log.d(TAG, "XXSDKProvider create()")
 5        XXSDK.init()
 6        return true
 7    }
 8
 9    .....
10}

同时,这里给做启动优化的同学提供了一种思路。打开你的 Apk,看一下 AndroidManiest 里面有多少 provider,看一下是否有这样的骚操作。如果有,改一下,说不定启动优化,一下子就减少了 100 多 毫秒。

接下来,我们来看一下 AppStartUp 怎么使用

AppStartUp 基本使用

简单来说,分为三步

  1. gradle 文件引入App Startup 库。
  2. 自定义一个用于初始化的 Initializer。
  3. 将自定义 Initializer 配置到 AndroidManifest.xml 当中。

第一步,在 build.gradle 文件添加依赖

1dependencies {
   
2    implementation "androidx.startup:startup-runtime:1.0.0"
3}

第二步:自定义实现 Initializer 类

主要有两个方法

  1. T create(@NonNull Context context) 初始化一个组件,返回给 Application
  2. List<class<? extends="" initializer>> dependencies() 当前的 Initializer 依赖于那些 Initializers,通过这个可以确定先后启动的顺序

我们以官方的例子来讲解

 1// Initializes WorkManager.
 2class WorkManagerInitializer : Initializer<WorkManager> {
   
 3    override fun create(context: Context): WorkManager {
   
 4        val configuration = Configuration.Builder().build()
 5        WorkManager.initialize(context, configuration)
 6        return WorkManager.getInstance(context)
 7    }
 8    override fun dependencies(): List<Class<out Initializer<*>>> {
   
 9        // No dependencies on other libraries.
10        return emptyList()
11    }
12}

WorkManagerInitializer 返回一个 WorkManager,它不需要依赖于其他的 Initializer,直接返回 emptyList() 即可。

如果需要依赖其他的 Initializer,重写 dependencies 方法,返回即可。如下面的 ExampleLoggerInitializer 依赖于 WorkManagerInitializer

 1// Initializes ExampleLogger.
 2class ExampleLoggerInitializer : Initializer<ExampleLogger> {
   
 3    override fun create(context: Context): ExampleLogger {
   
 4        // WorkM
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值