注册

SDK无侵入初始化并获取Application

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函数省略返回值类型的场景应该有一个前提:该函数的返回值类型程序能够很容易推断出来(尽量不依赖其他函数)


作者:长安皈故里
链接:https://juejin.cn/post/7085122222058111012
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

0 个评论

要回复文章请先登录注册