一、背景

项目需求的频繁迭代,新的产品功能在不断添加和延伸,随之带来的是,项目技术复杂度的提升。

近几年来,Android模块化、组件化相关技术得到极速发展,将项目整体进行分层,不同的层次之间依据实际的技术功能或业务支撑或业务模块去划分具体的组件或模块,是组件化或模块化一致的行动方向。

复杂的产品功能,往往也带来组件化或模块后具有多个组件或模块。对于相对稳定,或具有复用能力的模块,可以直接形成独立的模块,并通过独立Git库或项目模块形式进行管理,像引入外部库一样,以独立aar形式引入。但项目主工程自身,最终还是具有相对复杂的模块目录。在实际使用中,这往往可能带来视图上的不便。此时,我们可以通过Module目录分组来解决。

二、Module目录结构分组

2.1 模块目录分组划分

我们可以直观一点,感受下项目主工程Module视图展示,下图是一个对应示例。

主工程模块划分相对容易理解,主要包括了三个方面:
1,基于业务视角下的业务模块划分。如新闻模块,视频模块,运营广告模块,登录注册模块等;
2,面向特定变体或构建配置下的基础性功能模块。Eguan模块,Dev模块等;
3,模块壳工程。如各个业务模块对应的壳工程,以方便开发过程中针对单个模块实现安装调试等。

示例中只是一个相对简单的主工程目录结构,在实际复杂些的项目中,主工程模块将更加繁杂。这些模块之间,从本身的职责定位上来看,是应该具有不同的层次划分的,对应的,最好应该有不同的Module分组。否则整个主工程结构看上去,很是有凌乱感。

本示例中,对于上述的“面向特定变体或构建配置下的基础性功能模块”和“模块壳工程”,其实与项目实际面向用户的主体构建时,关系并不大。我们可以将其放置到对应的Module分组中。

于是,我们可以对应创建两个分组,对应的其实就是两Directory,分别叫Extends和Module_App,分别用来放置上述的两种职责定义下的模块。

最终,主工程模块目录视图为:

Extends和Module_App展开后的视图显示为:

顿时倍感清晰,有木有?

但此时,项目是不能直接构建成功的。

2.2 修正模块引用配置

Module目录结构已经发生了变化,对应需要此Module的配置,也是需要去修正的。以工程settings.gradle文件为例,初始,对应配置如下:

include ':App', ':News', ':Videos', ':Message', ':Comments', ':Pictures', ':Personal', ':Base', ':LoginReg', ':ActAd', ':Main'
include ':Dev', ':Eguan'
include ':Main_App', ':News_App', ':ActAd_App', ':Message_App', ':Comments_App', ':LoginReg_App', ':Personal_App', ':Pictures_App', ':Videos_App'
复制代码

每个模块名称前面有个:,表示的是相对于当前主工程的根目录。现在部分模块的目录路径变化了,对应修正如下:

include ':App', ':News', ':Videos', ':Message', ':Comments', ':Pictures', ':Personal', ':Base', ':LoginReg', ':ActAd', ':Main'
include ':Extends:Dev', ':Extends:Eguan'
include ':Module_App:Main_App', ':Module_App:News_App', ':Module_App:ActAd_App', ':Module_App:Message_App', ':Module_App:Comments_App', ':Module_App:LoginReg_App', ':Module_App:Personal_App', ':Module_App:Pictures_App', ':Module_App:Videos_App'
复制代码

同样的,如果其他模块对Module路径变化了的模块有依赖,对应也需要修正。如Main模块依赖Dev模块,初始配置如下:

devImplementation project(':Dev')
复制代码

现在,需要修正如下:

devImplementation project(':Extends:Dev')
复制代码

全部修正完成,我们重新构建项目,发现项目.idea目录下的modules.xml配置文件已自动更新了。

同时,Extens和Module_App目录自身,也自动生成了对应的.iml文件。

同时,具体模块下,iml模块配置也自动进行了修正。

此时,构建成功。

PS:如果实际项目在更改成Module分组,并修改完配置后,仍然构建有不成功,可以尝试如下步骤:
1,gradlew清除缓存:

./gradlew clean
复制代码

2,AS清除缓存:

File >> Invalidate Caches / Restart >> Invalidate And Restart
复制代码

3,删除主工程根目录下的缓存文件:

直接删除.idea目录,重启AS,会自动重新生成
复制代码

三、结语

复杂的项目中,往往具有复杂的模块划分。依据不同的模块职责,将其归纳到不同的Module分组中,使得平时项目开发时,有更好的清晰的视图结构,可以将注意力更多的专注于项目真正模块主体的开发。

模块目录结构的改变,实际上只是相对于项目根目录的路径发生了变化。对应的,我们只需要修正对应的引入到此模块的配置即可(往往都是对应的.gralde文件),其他都没有任何变化。

在实际项目开发中,依据实际情况,适当通过Module分组方式,可以获得更加清晰的项目视图结构。

end~

作者:HappyCorn
链接:https://juejin.im/post/5d5297db6fb9a06b0202b802
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Android项目实现Module目录结构分组的更多相关文章

  1. android项目的的目录结构

    然后我们看一下Helloword的程序目录: 我们可以看到 大致有的文件: 1. MainHelloWorld.java文件 2. R.java文件 3. android.jar文件 4. RES.L ...

  2. android学习——android项目的的目录结构

       然后我们看一下Helloword的程序目录: 我们可以看到 大致有的文件: 1. MainHelloWorld.java文件 2. R.java文件 3. android.jar文件 4. RE ...

  3. android源码的目录结构

    android源码的目录结构 [以下网络摘抄] |-- Makefile ! l/ a5 n% S% @- `0 d# z# a$ P4 V3 o7 R|-- bionic              ...

  4. YII框架开发一个项目的通用目录结构

    YII框架开发一个项目的通用目录结构: 3 testdrive/ 4 index.php Web 应用入口脚本文件 5 assets/ 包含公开的资源文件 6 css/ 包含 CSS 文件 7 ima ...

  5. maven项目的标准目录结构

    maven项目的标准目录结构如下:

  6. maven 创建web项目的标准目录结构

      maven 创建web项目的标准目录结构 CreateTime--2018年4月18日21:05:37 Author:Marydon 1.标准目录介绍(开发目录) 2.在eclipse下,目录展示 ...

  7. eclipse下maven项目保持原有目录结构配置resin运行环境

    maven项目用起来很方便,但是它的目录结构和eclipse的目录结构是有区别的,故而在eclipse下的maven项目,直接运行调试是有一些问题的. 为了方便maven项目的运行调试,因而也就有了像 ...

  8. Java Web项目的一般目录结构解析(eclipse)

    以上为项目名为TestProject的目录结构截图,下面主要解析WebContent下各个目录的用途: css:存放项目所需要的css文件. images:存放项目所需要的图片文件. js:存放项目所 ...

  9. vue项目开发基本目录结构

    § 目录结构 . ├── build/ # Webpack 配置目录 ├── dist/ # build 生成的生产环境下的项目 ├── src/ # 源码目录(开发都在这里进行) │ ├── ass ...

随机推荐

  1. redis笔记3

    redis持久化机制 redis提供了两种持久化策略 RDB RDB的持久化策略: 按照规则定时将内存的数据同步到磁盘 snapshot redis在指定的情况下会触发快照 自己配置的快照规则 sav ...

  2. 笔记7:Jquery知识

    jQuery 1 基本知识 jQuery 是一个 JavaScript 库.jQuery 极大地简化了 JavaScript 编程.其下载地址:http://jquery.com/download/ ...

  3. 03导航链接的制作(wx:for循环)和小程序警告request fail url not in domain list

    06==>导航链接的制作 <!-- 导航链接 --> <navigator url="../list/list" hover-class="nav ...

  4. JPA-save()方法会将字段更新为null的解决方法

    今天在开发上碰到一个问题,在做页面展示的时候传给前端十个字段,前端修改了其中3个的值,所以只传了3个值给后端,其余字段默认为null,更新后其他7个字段在全部变为了空值. 在前端没法全量回传所有属性的 ...

  5. 使用hutool工具类进行导出

    引入依赖为: <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</ ...

  6. 外网穿透-natapp安装配置(windows)

    natapp官网 natapp服务器更新:全面支持HTTPS协议以及本地SSL证书,支持WSS协议.同时支持HTTP/2 WEB协议,支持微信小程序本地开发.全面自动支持泛子域名与访客真实IP地址. ...

  7. js:

    JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.(客户端执行的语言) Net ...

  8. 生产者和消费者模型producer and consumer(单线程下实现高并发)

    #1.生产者和消费者模型producer and consumer modelimport timedef producer(): ret = [] for i in range(2): time.s ...

  9. 柯里化currying + 隐式调用 = 一个有名的add面试题

    柯里化 =================================== 维基百科解释: 柯里化,英语:Currying(果然是满满的英译中的既视感),是把接受多个参数的函数变换成接受一个单一参 ...

  10. USACO Making the Grade

    洛谷 P2893 [USACO08FEB]修路Making the Grade https://www.luogu.org/problemnew/show/P2893 JDOJ 2566: USACO ...