一、背景

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

近几年来,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. git报错 - remote: HTTP Basic: Access denied

    十年河东,十年河西,莫欺少年穷 学无止境,精益求精 git 拉取代码报: remote: HTTP Basic: Access denied,这是因为你的GIT密码修改后,需要重新认证授权,那么怎么操 ...

  2. js 设计模式——代理模式

    代理模式 代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问. 生活中有很多的代理模式的场景.例如,明星有经纪人作为代理,老板有秘书作为代理等等,当有事情的时候,会找到经纪人或秘书,再由他 ...

  3. 【IPHONE开发-OBJECTC入门学习】文件的操作,读写复制文件

    转自:http://blog.csdn.net/java886o/article/details/9041547 FileTools.h FileTools.m #import "FileT ...

  4. Arduino+esp8266-01+舵机 制作基于局域网的遥控门禁

    这个最终的效果呢,就是可以通过手机连接上esp8266创建的wifi,然后连接其创建的服务器,发送特定指令就可实现遥控开门 (做工比较粗糙还请不要见笑...) 一.原理 其实这个一看就会明白,非常简单 ...

  5. CentOS 7下简答搭建DNS服务器

    一.DNS相关介绍 DNS(Domain Name System)域名系统协议,作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用挨个记住IP地址.通过主机名,最终得到 ...

  6. 其他综合-VMware 从模板机快速克隆多台

    VMware 从模板机快速克隆多台 1.实验描述 通过 CentOS 7.6 的模板机快速克隆,为实现搭建其他项目而提供干净的实验平台. [基于此文章的环境]点我快速打开文章 2.实验环境 使用软件的 ...

  7. 17、DNS服务器

    DNS     domain  name system   域名系统   [root@li ~]# vim /etc/nsswitch.conf hosts:      files dns --涉及到 ...

  8. 【餐厅】 What kind of food would you like to eat tonight?

    核心句型 What kind of food would you like to eat tonight? 你今晚想吃哪种菜? What would you like to eat ? 你想吃什么? ...

  9. 【Sqlite】C#不同支持

    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> ...

  10. 基于Distiller的模型压缩工具简介

    Reference: https://github.com/NervanaSystems/distiller https://nervanasystems.github.io/distiller/in ...