Skip to main content

目录结构

划分原则#

好的目录划分应满足分类明确容易查找的目标。
在这个前提之下,结合工程开发中的实际情况,我们在划分目录时采用先分模块再分目录的方法。

先分模块,再分目录:先将模块划分为非功能模块(业务无关)与功能模块(业务相关)、非功能模块单独划分目录,功能模块则根据具体的业务进行划分,同一类业务划分为同一个模块,组成一个目录。


目录结构#

android-project
app
src
├──main
├── AndroidManifest.xml
├── java-com-app
│ ├── ui
│ │ ├── base
│ │ ├── auth(可选)
│ │ ├── splash(可选)
│ │ ├── guide(可选)
│ │ └── ……
│ ├── util (可选)
│ │ ├── SplashPageUtil.java (可选)
│ │ └── ……
│ ├── data(可选)
│ │ ├── local
│ │ │ ├──db
│ │ │ └── ……
│ │ ├── remote
│ │ │ ├──api
│ │ │ └── ……
│ │ ├── model
│ │ │ └── ……
│ │ └── ……
│ ├── widget(可选)
│ └── constant(可选)
├── assets
├── res
│ ├── anim
│ ├── drawable
│ │ ├── shape_common_btn_dialog_cancel_normal.xml(可选)
│ │ └── ……
│ ├── layout
│ │ ├── setting_act.xml(可选)
│ │ └── ……
│ ├── mipmap
│ │ ├── common_ic_arrow_left_white.png(可选)
│ │ ├── ic_user_info_edit.png(可选)
│ │ ├── bg_startup_bottom.png(可选)
│ │ └── ……
│ └── values
│ ├── colors.xml
│ ├── dimens.xml
│ ├── strings.xml
│ ├── styles.xml
│ ├── strings_array.xml
│ └── attrs.xml
......
core
src
├──main
├── AndroidManifest.xml
├── java-com-app-core
│ ├── util
│ │ ├── FileUtils.java (可选)
│ │ ├── JsonUtils.java (可选)
│ │ ├── DateUtils.java (可选)
│ │ ├── ImageUtils.java (可选)
│ │ └── ……
│ ├── network
│ ├── constant (可选)
│ ├── database(可选)
│ └── model(可选)
......
module1
src
├──main
├── AndroidManifest.xml
├── java-com-app-module1
......
module2
src
├──main
├── AndroidManifest.xml
├── java-com-app-module2
......
......

注:上图中的目录结构以 AndroidStudio 中的典型目录结构为准,而且并没有对一个Android工程中的所有目录进行一一例举,只选择我们关心的开发代码目录进行说明。

如上,现对目录划分进行说明:

  • app/ app 模块目录
    • app/src/main/包路径/ui/** 用户界面目录,用于存放用户界面相关的业务逻辑代码。
    • app/src/main/包路径/util/** 模块工具目录,用于存放模块中用到的工具类,比如:SplashPageUtil.java(闪屏画面工具类)等。如果一个工具类被好几个模块共用,那么该工具类应抽取到core模块中。
    • app/src/main/包路径/data/** 数据目录,用于存放本模块中与获取数据的相关的代码。
    • app/src/main/包路径/data/local/** 本地数据目录,用于存放本模块中从本地获取数据逻辑的相关的代码。
    • app/src/main/包路径/data/local/db/** 数据库代码目录,用于存放本模块中与本地数据库操作相关的代码。
    • app/src/main/包路径/data/remote/** 远程数据目录,用于存放本模块中从远程获取数据操作相关的代码。
    • app/src/main/包路径/data/remote/api/** 网络接口目录,用于存放本模块中从远程获服务接口取数据操作相关的代码。
    • app/src/main/包路径/data/model/** 数据模型目录,用于存放模块中数据模型相关的代码(比如用到的数据模型类以及数据模型类的生成类、操作类)。
    • app/src/main/包路径/widget/** 视图部件目录,用于存放自定义视图或者存放第三方视图。
    • app/src/main/包路径/constant/** 常量目录,用于存放模块中用到的常量。
    • app/src/main/assets/** 用于存放需要打包到应用程序的静态文件,以便部署到设备中。注:与res/raw不同,assets支持任意深度的子目录。这些文件不会生成任何资源ID,必须使用/assets开始(不包含它)的相对路径名。
    • app/src/main/res/anim/** 用于存放动画资源文件。
    • app/src/main/res/drawable/** 用于存放xml绘画资源文件。
    • app/src/main/res/layout/** 用于存放视图布局资源文件。
    • app/src/main/res/mipmap/** 用于存放图片资源文件。
    • app/src/main/res/value/** 用于存放程序静态变量资源文件,比如:静态字符串、颜色、间距变量值等。
  • core/ core 模块目录
    • core/src/main/包路径/util/** 系统工具目录,用于存放程序中用到的工具类,比如:FileUtils.java(文件操作工具类)、JsonUtils.java(Json处理工具类)、DateUtils.java(日期处理工具类)、ImageUtils.java(图片处理工具类)等。
    • core/src/main/包路径/network/** 网络通信目录,用于存放应用程序中与网络通信相关的共通核心代码。
    • core/src/main/包路径/database/** 数据库代码目录,用于存放应用程序中与本地数据库操作相关的共通核心代码。
    • core/src/main/包路径/constant/** 常量目录,用于存放系统中用到的常量。
    • core/src/main/包路径/model/** 数据模型目录,用于存放系统中数据模型相关的代码(比如用到的数据模型类以及数据模型类的生成类、操作类)。
  • 其余模块的名称,需要能够正确反映模块所实现的业务,目录划分参照 appcore 中的划分方式,在此不再赘述。

注:由于实行组件化与模块化的大型复杂应用的目录结构划分与业务具有很强的相关性,所以这里不做详细讨论,但划分原则中的内容依然适用。