后来发现这种方式隔绝了子module之间的通信,且主module只能主动的引用子module,无法被子module访问。随之而来进入主题了–组件间如何去通信
组件间通信方式
目前最常用的通信方式有Event、协议、RPC接口三种主要形式,但实际上都只是协议的一种变形封装而已。从标题能看出我参考了微信的模块化通信我就不墨迹,我更倾向于微信的RPC形式的通信方式。 原因有以下几点:
- 协议以接口形式展现能避免协议格式以及字段的维护
- 双方开发时省却协议解析步骤,避免解析过程中错误概率
- 将接口以aar形式对外开放,能极大节省双方接入以及后续维护成本
方式已经确定那接下来就是解决实现上的难题,从上述原因中我们可以看到几个关键点:
- 如何暴露接口
- 如何生成接口aar
- 如何注册并初始化接口实现类
首先我们来说说如何生成接口aar,大家都知道aar对应的是一个独立的module,那如何自动生成该module? 从微信的实现上看它是为setting新增了include_with_api方法,并修改了gradle指向的setting实现类,从而在初始化setting类时自动生成接口module。 由于个人研究时间有限目前采用取巧方案,在setting.gradle文件中新增include_with_api方法用来自动生成接口module,而build.gradle和AndroidManifest.xml文件皆从实现module中拷贝过来,并修改AndroidManifest.xml中的package以及去掉android:label信息,再去掉原有build.gradle的接口module依赖,从而顺利解决接口module生成方式。
def include_with_api(def projectName) {
include projectName
String rootDir = rootDir.getAbsolutePath();
String moduleName = ((String) projectName).replace(“:”, “”)
String parentName = moduleName.replace(“plugin-”, “”);
copy() {
from rootDir + ‘/’ + parentName + ‘/build.gradle’
into rootDir + ‘/’ + moduleName + ‘/’
filter { line ->
String content = line;
if (content.contains(moduleName)) {
content = “”;
}
content
}
}
copy() {
from rootDir + ‘/’ + parentName + ‘/src/main/AndroidManifest.xml’
into rootDir + ‘/’ + moduleName + ‘/src/main/’
filter { line ->
String content = line;
content = content.replace(“android:label=”@string/app_name"“, “”)
if (content.contains(“package=””)) {
content = content.replace(“”>“, “.plugin”>”)
}
content
}
}
}
再来看下关于接口暴露的问题,其实接口暴露方案主要还是参考微信只不过中间实现细节是否一样就不可知了。 下面着重介绍下我的细节实现,从微信方案中可以看出是将接口文件从.java后缀改成.api,然后将.api后缀的文件拷贝至接口module中。通过gradle插件来定制依赖配置项compileApi,实现module通过compileApi依赖关联接口module,在解析中将实现module中接口文件拷贝至接口module并修改后缀名从而通过编译。
Configuration configurationtest = project.configurations.create(“compileApi”)
configurationtest.canBeResolved = true;
configurationtest.canBeConsumed = true;
configurationtest.setVisible(false)
//当该依赖配置被解析时会执行
configurationtest.allDependencies.all {obj->
moveFile(project, obj.name)
project.dependencies.add(“compile”, project.project(‘:’ + obj.name))
}
接下来我们可以考虑如何注册以及初始化接口实现类,所谓的注册也就是如何通过接口找到实现类并隐式实例化。
@AService(“com.netease.add.Add”)
public abstract class IAdd extends IService{
abstract int add(int a, int b);
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://i-blog.csdnimg.cn/blog_migrate/13a6833334c807f8058f69cce091473e.jpeg)
最后
答应大伙的备战金三银四,大厂面试真题来啦!
这份资料我从春招开始,就会将各博客、论坛。网站上等优质的Android开发中高级面试题收集起来,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。
节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
《960全网最全Android开发笔记》
《379页Android开发面试宝典》
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。
如何使用它?
1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数
《507页Android开发相关源码解析》
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
腾讯、字节跳动、阿里、百度等BAT大厂 2020-2021面试真题解析
资料收集不易,如果大家喜欢这篇文章,或者对你有帮助不妨多多点赞转发关注哦。文章会持续更新的。绝对干货!!!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
哦。文章会持续更新的。绝对干货!!!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!