Android Studio 项目目录结构全方位详解
文章目录
- [Android Studio 项目目录结构全方位详解](#Android Studio 项目目录结构全方位详解)
-
- 前言
- 一、根目录结构(单模块项目)
-
- [1. 核心配置文件](#1. 核心配置文件)
- [2. 自动生成的临时文件(完全不需要修改)](#2. 自动生成的临时文件(完全不需要修改))
- [二、app 模块目录结构详解](#二、app 模块目录结构详解)
-
- [1. `build/` ------ 自动生成的构建目录](#1.
build/—— 自动生成的构建目录) - [2. `libs/` ------ 本地第三方库目录](#2.
libs/—— 本地第三方库目录) - [3. `src/` ------ 源代码 & 资源](#3.
src/—— 源代码 & 资源) -
- [3.1 `main/` ------ 正式代码和资源目录](#3.1
main/—— 正式代码和资源目录) -
- [① `java / kotlin` 目录 ------ 业务代码](#①
java / kotlin目录 —— 业务代码) - [② `AndroidManifest.xml` ------ 应用的"身份证"](#②
AndroidManifest.xml—— 应用的“身份证”) - [③ `res/` ------ 所有资源文件(界面、图片、文字)](#③
res/—— 所有资源文件(界面、图片、文字))
- [① `java / kotlin` 目录 ------ 业务代码](#①
- [3.2 `test/` ------ 单元测试目录](#3.2
test/—— 单元测试目录) - [3.3 `androidTest/` ------ 仪器化测试目录](#3.3
androidTest/—— 仪器化测试目录)
- [3.1 `main/` ------ 正式代码和资源目录](#3.1
- [4. `build.gradle` (模块级别) ------ 最重要的配置文件](#4.
build.gradle(模块级别) —— 最重要的配置文件) - [5. `proguard-rules.pro` ------ 混淆规则文件](#5.
proguard-rules.pro—— 混淆规则文件) - [6. `consumer-rules.pro`](#6.
consumer-rules.pro)
- [1. `build/` ------ 自动生成的构建目录](#1.
- [三、Java 项目与 Kotlin 项目的目录结构差异](#三、Java 项目与 Kotlin 项目的目录结构差异)
- 四、单模块项目与多模块项目的目录结构差异
-
- [1. 单模块项目结构](#1. 单模块项目结构)
- [2. 多模块项目结构](#2. 多模块项目结构)
- [3. 核心差异对比](#3. 核心差异对比)
- [五、为什么 Android 项目采用这样的目录结构?](#五、为什么 Android 项目采用这样的目录结构?)
- 六、总结
前言
刚接触 Android 开发时,很多人都会被 Android Studio 里密密麻麻的目录和文件吓到------.idea、gradle、app、build......到底哪个才是写代码的地方?哪个能改,哪个绝对不能动?
这篇文章会用最白话的方式 ,带你一次性看懂 Android 项目的每一个目录和文件,并把最核心的 app 模块拆开来揉碎了讲。无论你是刚刚新建第一个空项目,还是准备从 Java 转向 Kotlin、从单模块转向多模块,这篇都值得收藏。
一、根目录结构(单模块项目)
这是你在 Android Studio 中新建一个 "Empty Activity" 项目后看到的最顶层目录结构,我会按照重要性排序讲解。
1. 核心配置文件
| 文件/目录名 | 自动生成 | 可手动修改 | 核心作用 | 存在必要性 |
|---|---|---|---|---|
.idea/ |
✅ | ⚠️ 部分可改 | Android Studio 的项目配置目录 | 存储 IDE 的所有项目级设置,包括代码风格、运行配置、版本控制集成、依赖索引等。没有它 Android Studio 无法正确识别和打开项目。 |
app/ |
✅ | ✅ | 应用的主模块目录 | 包含应用的所有源代码、资源文件和模块级构建配置。这是你 90% 以上开发工作会进行的地方。 |
gradle/ |
✅ | ⚠️ 极少修改 | Gradle 包装器目录 | 包含 Gradle Wrapper 的 jar 包和配置文件,确保所有开发者使用相同版本的 Gradle 构建项目,避免"在我电脑上能跑"的问题。 |
.gitignore |
✅ | ✅ | Git 版本控制忽略文件 | 指定哪些文件和目录不需要提交到 Git 仓库。如果没有它,会把大量自动生成的临时文件和本地配置文件提交到仓库,导致仓库臃肿和团队协作冲突。 |
build.gradle (Project级别) |
✅ | ✅ | 项目级构建配置文件 | 定义整个项目的全局构建配置,包括构建脚本依赖、仓库地址、全局变量等。 |
gradle.properties |
✅ | ✅ | Gradle 全局属性文件 | 配置 Gradle 构建系统的全局参数,如 JVM 内存、并行构建、签名信息等。 |
gradlew |
✅ | ❌ | Mac/Linux 系统的 Gradle 包装器脚本 | 无需本地安装 Gradle 即可执行构建命令。 |
gradlew.bat |
✅ | ❌ | Windows 系统的 Gradle 包装器脚本 | 同上,Windows 平台专用。 |
settings.gradle |
✅ | ✅ | Gradle 项目设置文件 | 声明项目中包含哪些模块,以及依赖解析的全局配置。 |
local.properties |
✅ | ⚠️ 本地专用 | 本地环境配置文件 | 存储 Android SDK 的路径等本地特定配置。绝对不能提交到 Git 仓库,因为每个开发者的本地环境都不同。 |
2. 自动生成的临时文件(完全不需要修改)
| 文件/目录名 | 自动生成 | 可手动修改 | 核心作用 |
|---|---|---|---|
.gradle/ |
✅ | ❌ | Gradle 构建缓存目录 |
build/ |
✅ | ❌ | 项目级构建输出目录 |
二、app 模块目录结构详解
app 目录是整个 Android 项目的灵魂,你绝大部分时间都在和它打交道。先看它的整体结构:
app/
├── build/ 👉 构建产物(自动生成)
├── libs/ 👉 本地依赖包(手动放)
├── src/ 👉 源代码 + 资源(核心中的核心)
├── build.gradle 👉 模块构建配置(必须改)
├── proguard-rules.pro 👉 代码混淆规则(发布用)
└── consumer-rules.pro 👉 库模块混淆规则(很少用)
下面逐一拆解。
1. build/ ------ 自动生成的构建目录
作用 :存放编译后的代码、资源、APK、中间文件,完全由 Android Studio 自动生成。
包含内容 :最终 APK 文件、R 文件、编译后的 class/dex 文件、资源编译产物等。
关键点:
- ✅ 自动生成
- ❌ 永远不要手动修改
- ✅ 可以随时删除(删除后下次编译会自动恢复)
- ✅ 提交 Git 时必须忽略
为什么必须存在?
Android 构建系统需要一个统一目录存放编译结果,否则无法打包 APK。
2. libs/ ------ 本地第三方库目录
作用 :存放你手动下载的 .jar(Java库)或 .aar(Android库)。
使用场景 :某些第三方 SDK 只提供离线包,无法在线依赖;或者企业内部私有 SDK。
如何使用 :在 build.gradle 中添加:
gradle
implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
为什么需要它?
并不是所有库都在公共 Maven 仓库,必须提供本地包导入方式。
3. src/ ------ 源代码 & 资源
src/
├── main/ 👉 正式代码
├── test/ 👉 单元测试
└── androidTest/ 👉 仪器化测试
3.1 main/ ------ 正式代码和资源目录
main/
├── java (或 kotlin)/ 业务代码
├── res/ 资源文件
└── AndroidManifest.xml 应用清单文件
① java / kotlin 目录 ------ 业务代码
所有 Activity、Fragment、ViewModel、工具类、网络请求、数据类等代码都放在这里。例如:
com.xxx.myapp/
├── ui/ Activity、Fragment
├── viewmodel/ ViewModel
├── model/ 数据模型
├── network/ 网络
├── db/ 数据库
└── utils/ 工具类
为什么代码必须放这里? 这是 Gradle 编译时默认扫描源代码的路径,放别的地方无法编译。
② AndroidManifest.xml ------ 应用的"身份证"
必背作用:
- 声明 App 包名
- 声明四大组件(Activity/Service/Receiver/Provider)
- 声明权限
- 声明应用图标、名称、主题
- 配置启动项、深度链接等
为什么必须存在? Android 系统不认代码,只认清单。没有它,App 无法安装、无法启动。
③ res/ ------ 所有资源文件(界面、图片、文字)
res 目录是 Android 最有特色的设计,它让代码和资源彻底分离。
res/
├── drawable/ 图片、形状、Selector
├── layout/ UI 布局 XML
├── mipmap/ 应用图标
├── values/
│ ├── strings.xml 文字
│ ├── colors.xml 颜色
│ ├── dimens.xml 尺寸
│ └── styles.xml 样式/主题
└── xml/ 配置文件
drawable/:放图片(png、jpg、webp、svg)、按钮效果 selector、形状 shape、渐变等。Android 会根据设备屏幕密度自动匹配合适图片,保证清晰度且不浪费内存。layout/:所有界面 XML(如activity_main.xml、fragment_home.xml)。用 XML 是为了将代码与界面分离,方便可视化和屏幕适配。mipmap/:专门存放应用启动图标。系统启动器需要更高优先级的图标资源,因此单独放在这里。values/:存放字符串、颜色、尺寸、样式。strings.xml:统一管理所有文字,方便做多语言。colors.xml:统一颜色,换肤更容易。dimens.xml:统一尺寸,适配各种屏幕。styles.xml:统一样式,避免重复写属性。
把文字、颜色、尺寸抽出来的原因:便于全局修改、支持多语言、支持暗黑模式、便于团队协作。
除了这些基础目录,还可以有:
values-night/:夜间模式专用的颜色、样式。layout-land/:横屏专用的布局文件。drawable-hdpi/:为不同屏幕密度提供不同分辨率的图片。
3.2 test/ ------ 单元测试目录
存放不需要 Android 系统环境的测试代码,直接运行在 JVM 上,执行速度极快。适合测试计算、工具类、数据转换等纯逻辑。
3.3 androidTest/ ------ 仪器化测试目录
存放需要 Android 系统环境的测试代码,如 UI 测试、数据库测试,必须在模拟器或真机上运行。
4. build.gradle (模块级别) ------ 最重要的配置文件
用来配置当前模块的构建信息:
- compileSdk / minSdk / targetSdk
- 应用包名
- 版本号 versionCode、versionName
- 第三方依赖
- 混淆、多渠道、签名等
为什么必须存在? Gradle 靠它知道如何把你的代码打包成 APK。
5. proguard-rules.pro ------ 混淆规则文件
作用:压缩代码、混淆类名和方法名、移除无用代码,从而减小包体积、防止反编译。
什么时候用? 打正式包(release)时自动启用。
6. consumer-rules.pro
如果你的模块作为库(library)被其它项目引用,才会用到。普通应用开发中几乎可以忽略。
三、Java 项目与 Kotlin 项目的目录结构差异
Android Studio 新建项目默认使用 Kotlin,但也完全兼容 Java。两者的差异很小:
| 差异点 | Java 项目 | Kotlin 项目 |
|---|---|---|
| 源代码目录 | 只有 src/main/java/ |
有 src/main/kotlin/,也可以同时保留 java/ 进行混合开发 |
| 默认文件类型 | 生成 .java 文件 |
生成 .kt 文件 |
| 构建配置 | 不需要 Kotlin 插件 | build.gradle 中会自动添加 Kotlin 插件和依赖 |
| 测试目录 | 测试代码放在 java/ 下 |
测试代码可以放在 java/ 或 kotlin/ 下 |
重要说明:Kotlin 与 Java 完全兼容,你可以在同一个项目中同时使用两种语言,互相调用毫无障碍。
四、单模块项目与多模块项目的目录结构差异
1. 单模块项目结构
MyApp/
├── .idea/
├── app/ # 唯一的模块
│ ├── src/
│ └── build.gradle
├── gradle/
├── build.gradle (Project级别)
└── settings.gradle
2. 多模块项目结构
MyApp/
├── .idea/
├── app/ # 主应用模块
│ ├── src/
│ └── build.gradle
├── feature_login/ # 登录功能模块
│ ├── src/
│ └── build.gradle
├── feature_home/ # 首页功能模块
│ ├── src/
│ └── build.gradle
├── common_base/ # 公共基础模块
│ ├── src/
│ └── build.gradle
├── gradle/
├── build.gradle (Project级别)
└── settings.gradle # 包含所有模块的声明
3. 核心差异对比
| 对比项 | 单模块项目 | 多模块项目 |
|---|---|---|
| 模块数量 | 只有一个 app 模块 |
有一个主 app 模块和多个功能模块/库模块 |
settings.gradle |
只包含 include ':app' |
包含所有模块声明,如 include ':app', ':feature_login', ':common_base' |
| 依赖关系 | 没有模块间依赖 | 模块之间可以相互依赖,如 app 依赖 feature_login |
| 构建速度 | 项目变大后构建变慢 | 支持增量构建,只构建修改过的模块,速度更快 |
| 代码复用 | 较困难 | 可将公共代码提取到基础模块,方便复用 |
| 团队协作 | 容易出现代码冲突 | 不同团队负责不同模块,减少冲突 |
五、为什么 Android 项目采用这样的目录结构?
这套目录结构是 Google 多年实践优化出来的,背后有着清晰的设计思想:
-
清晰的职责分离
代码与资源分离、构建配置与源代码分离,使得项目易于管理和扩展。
-
标准化的资源管理
通过目录名后缀(如
-zh、-land、-xhdpi)实现多语言、横竖屏、多密度的自动适配,无需修改一行代码。 -
模块化的设计思想
从一开始就鼓励将应用拆分成独立模块,提高可维护性、可复用性,支持增量构建和动态功能模块。
-
与 Android 系统架构一致
AndroidManifest.xml对应系统的组件管理,res/对应资源管理,四大组件的组织方式也贴合系统生命周期机制。
六、总结
Android Studio 的项目目录结构是精心设计的标准化产物,它既是开发规范,也是 Android 系统设计思想的体现。
对于新人,推荐从单模块项目入手,先把 app/src/main 下的目录和文件玩熟,再逐步接触多模块和分层架构。
一句话记住核心:
app/是你的整个应用src/main里写代码、写界面、放资源res/管图片、文字、布局、颜色AndroidManifest.xml是应用的身份证build.gradle告诉系统怎么打包
把这套目录结构吃透,你就真正推开了 Android 开发的大门。
如果这篇文章对你有帮助,欢迎点赞、收藏、关注,接下来我还会继续分享 Android 资源命名规范、MVVM 架构实战、屏幕适配完全指南等内容!