自己整理的脑图,有新东西还会继续添加:http://naotu.baidu.com/file/3136bf76d6b1b91f90a2b91638d07b1b?token=cd9b0e1e55232352
参考:
猫眼电影的组件化之路:https://blog.csdn.net/qq_22744433/article/details/77948442
微信Android模块化架构重构实践:https://mp.weixin.qq.com/s/6Q818XA5FaHd7jJMFBG60w
Android业务组件化开发实践:https://kymjs.com/code/2016/10/18/01/
Android架构思考(模块化、多进程) http://blog.spinytech.com/2016/12/28/android_modularization/
使用阿里ARouter路由实现组件化(模块化)开发流程别人写的DEMO,很好的参考价值,没积分的也可以去看阿里的官方DEMO
阿里官方文档地址
在这之前我们先看一个图,摘自我的脑图:
所以,一直是需求再推动着我们前进,还有万恶的产品!!!
所有业务组件不再是mouble而是作为一个子工程,基础组件可以使moudle,也可以是子工程,该子工程和主工程不同:
Debug模式下下作为app,可以单独的开发,运行,调试;Release模式下作为Library,被主工程所依赖,向主工程提供服务.
贴一个通用的图:
当然也有这个图的进阶版:为了解决依赖和公共资源,把Common Library移动到Router上面。
这个看需使用吧。具体的可以看我的脑图
if (isDebug.toBoolean()) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
在android {}里:
sourceSets{
main(){
if(isDebug.toBoolean()) {
manifest.srcFile 'src/debug/AndroidManifest.xml'
} else {
manifest.srcFile 'src/release/AndroidManifest.xml'
}
}
}
下面的在APP的gradle的也注意加上,不然在子项目作为application的时候,编译过不去
if (!isDebug.toBoolean()) {
implementation project(':buylibrary')
}
有时候当你都配置完了,发现还是编译不过去:
No signature of method: static org.gradle.api.java.archives.Manifest.srcFile
这是你细心点就会发现,这里的报错信息跟上面配置的manifest有关,你再细心点会发现首字母大小写也有关。。。如果有错,就用大写。其实有的项目里用的大写也没错,不知道是什么鬼?反正这么做就对了!!!
子项目中添加:resourcePrefix "你的别名"
这样的话,如果你的子项目中的资源没有在前面加别名,编译就过不去,挨个修改就行了。
但是这个不会限制图片资源,所以才有上面说的进阶版:为了解决依赖和公共资源,
把Common Library移动到Router上面。所以,把公共资源放到这里把。
俩个方案:
public class App {
public static final Application INSTANCE;
static {
Application app = null;
try {
app = (Application) Class.forName("android.app.AppGlobals").getMethod("getInitialApplication").invoke(null);
if (app == null)
throw new IllegalStateException("Static initialization of Applications must be on main thread.");
} catch (final Exception e) {
LogUtils.e("Failed to get current application from AppGlobals." + e.getMessage());
try {
app = (Application) Class.forName("android.app.ActivityThread").getMethod("currentApplication").invoke(null);
} catch (final Exception ex) {
LogUtils.e("Failed to get current application from ActivityThread." + e.getMessage());
}
} finally {
INSTANCE = app;
}
}
}
这里引入了一个路由(Router)的概念:引入总线机制来解决设备挂载问题,同样,借用总线的概念我们在工程添加”组件总线”,用于不同组件间的通信。
也有用隐式跳转的,这里不推荐,一是不安全,二是麻烦。
目前主流的方案就是注解,代表是阿里的ARouter。如果你的量级比较小,比如说没有复杂的services等等吧,可以自定义注解,不然推荐阿里的方案,没有侵入式代码,使用还方便。
这里也推荐一下别人写的库:
ARetrofit
ActivityRouter
其实,组件化的方式并不复杂,复杂的是根据自己的项目如何做到业务的解耦,这个是没人能给你讲的,我们只能吸收前人的经验,然后尽量把代码写的好一点。