android组件化方案整理

自己整理的脑图,有新东西还会继续添加: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
阿里官方文档地址


为什么要组件化?

在这之前我们先看一个图,摘自我的脑图:
android组件化方案整理_第1张图片
所以,一直是需求再推动着我们前进,还有万恶的产品!!!

目前的主流方案:主工程多子工程开发模型

所有业务组件不再是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上面。所以,把公共资源放到这里把。

重复依赖

俩个方案:

  1. 跟资源冲突的解决方案一样,把公共依赖放到Common Library中
  2. 限制依赖修饰符

解决 Application 冲突

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)的概念:引入总线机制来解决设备挂载问题,同样,借用总线的概念我们在工程添加”组件总线”,用于不同组件间的通信。
也有用隐式跳转的,这里不推荐,一是不安全,二是麻烦。
android组件化方案整理_第2张图片
目前主流的方案就是注解,代表是阿里的ARouter。如果你的量级比较小,比如说没有复杂的services等等吧,可以自定义注解,不然推荐阿里的方案,没有侵入式代码,使用还方便。
这里也推荐一下别人写的库:
ARetrofit
ActivityRouter


其实,组件化的方式并不复杂,复杂的是根据自己的项目如何做到业务的解耦,这个是没人能给你讲的,我们只能吸收前人的经验,然后尽量把代码写的好一点。

你可能感兴趣的:(Android)