Android一步步实现无痕埋点(6)-------AutoService

0.前言

Android一步步实现无痕埋点(5)-------斗转星移

啊,没想到你还能看到这里啊。。。
我就只当是自己的学习笔记.加油~
好了,新的方案我们也把它给整了一点了.那现在呢?
当然是组合啦~~~
而这个,就是使用我们的AutoService

1.AutoService

AutoService,是用来实现SPI的…
那SPI是什么呢

具体解释就是:

定义一个接口文件 写出多个该接口文件的实现 在 src/main/resources/ 下建立 /META-INF/services 目录,
新增一个以接口命名的文件 , 内容是要接口的实现类全路径 使用ServiceLoader类 来获取到这些实现的接口

不懂不要紧,反正我也不懂.你只需要知道.
通过这个,可以在非依赖的情况下.在ModuleA可以引用到ModuleB的类

2.Use it And show u code

添加依赖

 implementation 'com.google.auto.service:auto-service:1.0-rc6'
    kapt "com.google.auto.service:auto-service:1.0-rc6"

创建一个接口文件PluginProvider.class

interface PluginProvider {

    fun getPlugin(): Class<out Plugin<Project>>


    fun dependOn(): List<String>
}

创建继承文件

@AutoService(value = [PluginProvider::class])
class DoubleTapProvider : PluginProvider {
    override fun getPlugin(): Class<out Plugin<Project>> {
        return DoubleTapPlugin::class.java
    }

    override fun dependOn(): List<String> {
        return arrayListOf<String>().apply {
            // add("com.kronos.plugin.thread.ThreadHookProvider")
        }
    }

}

在需要插入的Plugin中去获取该Plugin类
这样就只需要app去插入一个插件就相当于插入所有的插件了

class MultiPlugin : Plugin<Project> {

    override fun apply(project: Project) {
        //这里获得了所有的Provider的实现类
        val providers = ServiceLoader.load(PluginProvider::class.java).toList()
        val graph = mutableListOf<ModuleNode>()
        val map = hashMapOf<String, PluginProvider>()
        providers.forEach {
            val list = it.dependOn()
            val className = it.javaClass.name
            val meta = ModuleNode(className, list)
            graph.add(meta)
            map[className] = it
        }
        val analyzer = Analyzer(graph)
        analyzer.bfsSort()
        analyzer.analyze()

     
        analyzer.bfsSortList.forEach {
            map[it.moduleName]?.apply {
                project.plugins.apply(getPlugin())
            }
        }

    }
}

在app的gralde中只需要插入该plugin即可,其中有一些奇奇怪怪的算法,自己去领悟把…

apply plugin: 'multi-plugin'

真的是一个非常顶的考虑方式,让项目不用再一个个去修改gradle文件了.一个项目只需要引用一个Plugin就可以了。虾哥说得对,这下牛逼了.
当然,这也导致了我一开始零基础去接触这个东西的时候,啥都不明白的结果…

3总结

没什么好总结的。。。一个东西的使用.只要是考虑到非依赖关系下的类调用.需要什么插件则去添加or删除注解即可.
好了,这次的学习到此暂时结束.回去继续开发业务去了.~
卷,来,给我卷。

你可能感兴趣的:(无痕埋点,Android知识,android,kotlin,android,studio)