随着项目不断的迭代 , 代码越来越臃肿 , 人员也越来越多 , 同时在一个 module 中共同开发 , 首先来说维护成本极高 , 不易管理扩展 , 现在就有了模块化的思想 , 把模块之间共用的代码(网络框架, 图片框架, 异步框架, 日志框架, 显示小部件 View 等),不同的功能。抽取成单独的 core module 和多个功能 module 。这样每个人负责自己的 module 开发,便于管理,协同开发。
当 module 越来越多,这又出现了一个问题,编译时间很长,为了解决这个问题,最后把每个 module 做成可配置,支持单独调试,大大的提升了开发效率。
在项目中根据不同的功能需求,和共用的代码抽取出来,形成单独的 module , 这就是模块化。
组件化是建立在模块化思想上的一次升级,一个变种。组件化本来就是模块化的概念,只是具有可变性,在线上环境是 module lib , debug 环境是 application 。组件化的单位是 application
其实插件化也是基于模块化的思想,将一个完整的工程,按业务划分为不同的插件,来化整为零,相互配合。插件化的单位是 apk , 可以实现对 apk 的动态加载,更新,比组件化更灵活。
在实现之前我们先来看下最终效果吧
目录结构:
效果:
1.1 项目 build.gradle 配置是否需要单独调试环境
ext { // extend // false: 组件模式 // true :集成模式 isModule = false } 复制代码
1.2 module 中 build.gralde 配置
//根据isModule标签动态的切换 集成/组件模式 if (isModule){ apply plugin: 'com.android.library' }else{ apply plugin: 'com.android.application' } 复制代码
android{ ... defaultConfig { //资源配置 sourceSets{ main{ //在组件模式下 使用不同的manifest文件 if(!isModule){ manifest.srcFile 'src/main/module/AndroidManifest.xml' java.srcDirs 'src/main/module/java','src/main/java' }else{ manifest.srcFile 'src/main/AndroidManifest.xml' } } } } ... } 复制代码
切换之后就可以单独运行了。
将不同业务代码抽离成单独的 module,然后在宿主 APP 中根据调试环境依赖。
dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) if (isModule) { //对代码跟资源进行隔离 runtimeOnly project(path: ':modulea') runtimeOnly project(path: ':moduleb') } } 复制代码
这里如果有人对依赖方式不了解的话,可以看下面这张表