和Google AutoService用法类似的一个库
- 增加了接口实现的优先级功能
- 通过编译期间生成代码注册实现类,避免了运行时反射行为。
-
添加私有仓库,并且引入插件
buildscript { repositories { //other code... maven { credentials { username '624f147cec85cdece2d2d16d' password 'fSZwBHrhFOI_' } url 'https://packages.aliyun.com/maven/repository/2202395-release-jr0puW/' } } dependencies { // other code... classpath("com.anymore:auto-service-register:0.0.8") } } allprojects { repositories { //other code... maven { credentials { username '624f147cec85cdece2d2d16d' password 'fSZwBHrhFOI_' } url 'https://packages.aliyun.com/maven/repository/2202395-release-jr0puW/' } } }
-
application模块的build.gradle引入auto-service
plugins { id 'com.android.application' id 'kotlin-android' id 'auto-service' }
-
添加依赖
api("com.anymore:auto-service-loader:0.0.8")
-
定义接口的实现并使用@AutoService注解标记
//单例实现Impl1 @AutoService(Runnable::class,singleton = true) class Impl1:Runnable { override fun run() { Log.e("lym","impl1") } } @AutoService(Runnable::class,priority = -1) class Impl2:Runnable { override fun run() { Log.e("lym","impl2") } }
-
调用
ServiceLoader.load<Runnable>().forEach { it.run() }
结果输出:
2022-04-09 10:31:27.711 11824-11824/com.anymore.auto_service_android.demo E/lym: impl2 2022-04-09 10:31:27.711 11824-11824/com.anymore.auto_service_android.demo E/lym: impl1
-
开启编译预检查(可选,默认关闭)
如果我们明确需要某个接口至少需要提供一个实现,则可通过开启预检查来检测是否存在被@AutoService标记的实现类,这样可以避免出现运行时候对于其实现一个也找不到的情况
在application模块的build.gradle中开启编译预检查
autoService { checkImplementation=true //sourceCompatibility="1.8"//指定java编译版本,默认1.7 //logLevel = "VERBOSE"//插件日志级别 VERBOSE,DEBUG,INFO,WARN,ERROR 默认 INFO //require(Runnable.class.name) //检查Runnable接口且 alias="lym"的实现 //require(Runnable.class.name,"lym") //require("java.util.concurrent.Callable") }
-
排除注入
如果我们依赖的其他aar中注入了某个实现类,但是我们不想将这个实现类注入进来,可以通过设置排除规则将这个实现排除掉。
autoService { excludeAlias("lym23")//排除掉所有别名为lym23的实现 excludeClassName("com\\.anymore\\..*")//排除掉所有包名为com.anymore的实现 exclude("com\\.anymore\\..*","lym.*")//排除掉所有包名为com.anymore 且 别名以 lym开头的实现 }