0.前言
啊,没想到你还能看到这里啊。。。
我就只当是自己的学习笔记.加油~
好了,新的方案我们也把它给整了一点了.那现在呢?
当然是组合啦~~~
而这个,就是使用我们的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删除注解即可.
好了,这次的学习到此暂时结束.回去继续开发业务去了.~
卷,来,给我卷。