Android ServiceLoader和AutoService

最新项目用到组件化,研究了下ServiceLoader+AutoService。不知道serviceloader是什么的同学可以参考下谷歌的官方文档和Auto插件的项目链接

ServiceLoader: developer.android.com/reference/j...

AutoService: github.com/google/auto

这两个东西是干嘛的呢?大致就是为了让项目解耦,是组件化开发更符合设计模式(开闭原则/单一职责原则)。在组件化开发中不允许横向依赖,只允许接口下沉,因此为了不暴露接口实现,ServiceLoader可以只通过接口get到所有实现类。这会让类的设计更容易符合单一职责原则。ServiceLoader会读取Apk目录META-INF/services/下对应包名的文件,这里面需要记录接口的实现类。那么这些类是怎么写到这个文件中的呢?答案是使用AutoService,一个谷歌提供插件,专门用来生成"接口-接口实现类"对应关系的文件。在编译时,会根据接口查找到实现类并记录在文件里。

那么怎么做呢?方法很简单,首先生成一个接口

接着,在接口的实现类上增加AutoService注解

编译项目后,查看生成的包,在META-INF/services/下就可以看到对应文件了

再看看文件里记录的数据,确实符合预期

这里面要注意几点

1.需要声明插件的classpath

2.添加依赖,这里有个坑,只有在当前module下添加依赖才行

3.因为文件名,类名等都是通过反射的方式取的,一定要加上混淆,否则ServiceLoader就找不到了

AutoService说完了,再说说ServiceLoader. 它的使用方法也非常简单。

如图,调用load方法,传入接口名,并遍历返回值,拿到之前在META-INF/services/文件里的接口实现类。这里我们可以不知道实现细节,并且使用此方式非常容易扩展,每个接口实现之间也是解耦的。

当然,在使用ServiceLoader的时候也有几个坑要注意:

1.如果是系统应用(申明了android.uid.system)或者使用多进程时,会报以下错误

解决方案也很简单,找到系统给的提示,设置类加载器

2.接口实现类的无参数构造方法一定可以访问,如果使用了单例,把无参构造变成private,这时就会报错,阅读下系统说明和源码,这里写的非常清楚

以上就是ServiceLoader和AutoService的一点小分享,当然也可以说是踩坑记录。这也是我的第一篇博客,语言组织和排序都有些混乱,大家请见谅。

相关推荐
知行合一。。。34 分钟前
Python--03--函数入门
android·数据库·python
大、男人1 小时前
python之contextmanager
android·python·adb
不法4 小时前
java查看安卓证书信息
android
儿歌八万首4 小时前
Jetpack Compose 动画实战:让你的 UI 动起来
android·kotlin·动画·compose
千里马学框架4 小时前
如何改进车载三分屏SplitScreen启动交互方式?
android·智能手机·分屏·aaos·安卓framework开发·车载开发·3分屏
REDcker6 小时前
Android WebView 版本升级方案详解
android·音视频·实时音视频·webview·js·编解码
麦兜*6 小时前
【springboot】图文详解Spring Boot自动配置原理:为什么@SpringBootApplication是核心?
android·java·spring boot·spring·spring cloud·tomcat
le1616166 小时前
Android 依赖种类及区别:远程仓库依赖、打包依赖、模块依赖、本地仓库依赖
android
lxysbly6 小时前
psp模拟器安卓版带金手指
android
云上凯歌7 小时前
02 Spring Boot企业级配置详解
android·spring boot·后端