SDK无侵入初始化并获取Application

5,471 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情

1.SDK无侵入初始化并获取Application

无侵入初始化SDK并获取Application的意思是不需要业务方手动调用SDK的初始化函数。

这个就得利用Android四大基本组件之一ContentProvider了,其执行的时机是位于ApplicationattchBaseContext()之后,ApplicationonCreate()之前,无需程序手动调用。

所以我们就可以自定义个ContentProvider完成SDK的自动初始化并获取应用的Application。

class CPDemo : ContentProvider() {
    override fun attachInfo(context: Context?, info: ProviderInfo?) {
        super.attachInfo(context, info)
        //编写SDK初始化逻辑,并获取Application
        val application = context?.applicationContext
    }

    override fun onCreate(): Boolean = true
}

直接重写ContentProvider并在attachInfo执行SDK的初始化逻辑即可。

比较出名的内存泄漏检测库 LeakCanary、Google官方的ProcessLifecycleOwner就使用这个原理。

不过如果每个第三方库都借用ContentProvider来完成无侵入式的初始化,势必造成自定义的ContentProvider过多,直接增加了启动耗时:

image.png

为了避免ContentProvider过多的问题,Google官方提供了App Startup库,这个库主要是给SDK提供方实现无侵入初始化使用的:

    implementation("androidx.startup:startup-runtime:1.1.1")

该官方库会将所有用于初始化的ContentProvider合并成一个,减少启动的耗时

基本使用如下:

class CPDemo2 : Initializer<Unit> {
    override fun create(context: Context) {
        //执行初始化逻辑
    }

    override fun dependencies(): MutableList<Class<out Initializer<*>>> = mutableListOf()
}

然后再AndroidManifest中注册:

<provider
    android:name="androidx.startup.InitializationProvider"
    android:authorities="${applicationId}.androidx-startup"
    android:exported="false"
    tools:node="merge">
    <meta-data
        android:name="com.example.gitlinux.CPDemo2"
        android:value="androidx.startup" />
</provider>

更多用法可以参考郭神的文章:Jetpack新成员,App Startup一篇就懂

2.kotlin函数省略返回值类型真的好吗?

经常使用kotlin的程序都知道,kotlin的函数再某些场景下是可以不用显示声明返回值类型,这是为了提高开发效率,比如:

fun test() = ""

对于简单的函数来说,虽然省略了方法的返回类型,但是我们还是能够直接看出这个方法的返回值类型为String,但是方法中调用了其他方法呢,比如:

fun test() =  request()

//随便一个函数,这个函数体中还会调用其他的函数
fun request() = otherFun()

fun otherFun() = "hahaha"

这种情况下,如果我们要知道test()方法的返回值类型必须先通过request()函数再跳转到otherFun才能知道test()方法的返回值类型,这对于程序而言反而降低了开发效率。

所以我认为使用kotlin函数省略返回值类型的场景应该有一个前提:该函数的返回值类型程序能够很容易推断出来(尽量不依赖其他函数)

参考文章

Jetpack新成员,App Startup一篇就懂