一、背景

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

近几年来,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. PMP备考-第三章-项目管理过程

    过程:完成预定目标的,一系列相互关联的活动的集合,以便运用一些列工具与技术把特定的输入转化成特定的输出. 五大项目管理过程组:启动-规划-执行-监控-收尾 戴明环(PDCA循环):计划-实施-检查-行 ...

  2. 在js中==和===的区别

    “==”:叫相等运算符 “===”:叫严格运算符 它们两有什么区别呢? == :表示值相等则都为true ===:表示 不仅要值相等,双方类型也要相等才为true 例子如下: js代码如下: // “ ...

  3. Mysql时区无法识别

    Unable to connect to database. Tried 1 times {:error_message=>“Java::JavaSql::SQLException: The s ...

  4. linux的ftp操作

    1.查看是否安装 rpm -qa |grep vsftpd 没有输出,表示没有安装 2.查看服务状态 1).service vsftpd status 输出信息 vsftpd is stopped 表 ...

  5. Centos7安装elasticSearch6

                                                    Elasticsearch6.0 1.Elasticsearch: Elasticsearch是一个基于 ...

  6. linux关闭ACPI电源管理模块

    一.运行环境 # cat /etc/redhat-release CentOS release 6.2 (Final) # uname -a Linux web-server- -.el6.x86_6 ...

  7. 简简单单,jquery中,使用checkbox控制div的显示与隐藏

    今天开发代码时,发现好久不用jquery就生疏了. 所以作这个记录, 使用checkbox控制div的显示与隐藏. 一,html代码处: <input type="checkbox&q ...

  8. pytest文档30-功能用例与自动化用例完美对接(allure)

    前言 做自动化做久了,经常会思考一个问题,到底别人是怎么做的自动化,跟自己的有啥不一样,看过不少书和资料,都是停留在demo的层面. 真正把自动化做的好的大牛又不屑于分享自己的劳动成果,所以大部分情况 ...

  9. linux(02)基础shell命令

    Linux(02)之shell命令 一,Linux命令行的组成结构 在我们的linux启动,登陆成功之后会显示: 这就是linux的命令行的组成结构 二,常见命令 1,Linux系统命令操作语法格式 ...

  10. 使用jmeter进行压力测试及如何添加负载机

    Jmeter是一款简单灵活且强大的性能测试工具,同时也可以做接口测试. 由于初识jmeter,今天来记录一下如何对一个web进行一个简单的压力测试. 1.首先在测试计划里面添加一个线程组,然后再其下面 ...