组件化

作者: 34sir | 来源:发表于2019-02-01 11:33 被阅读3次

为什么组件化?

  • 解耦
  • 解决项目庞大 编译慢

怎么做?

思路:
1.模块化项目 可按功能或者业务对项目进行划分重构
2.动态控制模块依赖

模块化项目可以按照各自项目实际情况 不多做介绍

如何动态依赖?

配置properties文件

properties文件是java的配置文件
作用:对项目进行一系列的配置 包括:版本号 版本信息 开发模式 keystore等等

几个知识点:

  • 新建AS项目会默认生成gradle.propertieslocal.properties文件
  • Gradle 内置了对gradle.properties的使用方式
    栗子:
    gradle.properties:
something = "hello 34sir"

build.gradle:

println something //可以直接使用这个变量
  • 使用其他的 .properties文件
    例如上文提到的local.properties
Properties properties = new Properties()  
properties.load(new FileInputStream("local.properties"))
println properties.getProperty("something")

或者

def config = new ConfigSlurper().parse(new File("local.properties").toURL()) //这种方式除了加载 properties文件外,还可以加载 groovy 文件 或者 gradle 文件
println config.something

使用properties文件的配置

利用配置文件的DEVELOP_MODE变量 动态更改依赖方式(application 还是 library)
gradle.properties:

DEVELOP_MODE = true

build.gradle:

if (DEVELOP_MODE.toBoolean) { //如果当前是组件化模式
    apply plugin: 'com.android.application'
} else { //集成模式
    apply plugin: 'com.android.library'
}

遇到的问题

AndroidManifest合并

每个组件都会有一个清单文件 那么如果这些清单文件都含有各自的Application 这样肯定会产生冲突
解决方案和上述动态更换依赖方式类似:
通过DEVELOP_MODE控制动态依赖的清单文件
build.gradle文件中进行如下配置:

  sourceSets {
        main {
            if (DEVELOP_MODE.toBoolean()) {
                manifest.srcFile 'src/main/debug/AndroidManifest.xml'  //组件模式下依赖此清单文件
            } else {
                manifest.srcFile 'src/main/release/AndroidManifest.xml' //集成模式下依赖此清单文件
            }
        }
    }

资源冲突

解决方案:

  • 命名规范上面强制要求 按模块划分各个模块的命名规范
  • resourcePrefix "girls_" 强制代码审查

模组间通信

由于模组间是相互隔离的 那么某些类的调用就不能用常规方式
很容易想到一个方案:反射

但是 众所周知 频繁反射会带来很大的性能开销 于是我们采用路由的方案:
项目初始化的时候 一次性反射构造所有模块的router 在所有模块都依赖的公共模块中存在一个公共router管理类Grouter,此类完成通信的中转 相当于路由器的功能

相关文章

网友评论

      本文标题:组件化

      本文链接:https://www.haomeiwen.com/subject/kxfleftx.html