在 Android 开发中,项目结构通常遵循一定的约定,特别是在使用 Android Studio 时,默认的项目结构会按照 Gradle 的约定进行组织。以下是典型的 Android 项目结构及其核心组成部分:
1. 项目根目录
包含整个项目的全局配置文件和子模块(如 app
模块):
MyApp/
├── .gradle/ // Gradle 自动生成的临时文件
├── .idea/ // IDE(Android Studio)配置文件
├── app/ // 主模块(核心代码和资源)
├── build.gradle // 项目的全局构建配置
├── settings.gradle // 定义项目包含的模块
├── gradle/ // Gradle 包装器(Wrapper)文件
├── gradlew // Gradle 命令行执行脚本(Unix)
├── gradlew.bat // Gradle 命令行执行脚本(Windows)
└── local.properties // 本地环境配置(如 SDK 路径)
2. 模块目录(以 app
模块为例)
每个模块(如 app
)通常包含以下内容:
app/
├── build/ // 编译生成的临时文件(自动生成)
├── libs/ // 第三方库(.jar 或 .aar 文件)
├── src/ // 源代码和资源
│ ├── main/ // 主源代码集
│ │ ├── AndroidManifest.xml // 应用清单文件(定义组件、权限等)
│ │ ├── java/ // Java/Kotlin 源代码
│ │ │ └── com/example/myapp/
│ │ │ └── MainActivity.kt
│ │ ├── res/ // 资源文件(布局、图片、字符串等)
│ │ │ ├── drawable/ // 图片资源(PNG、SVG 等)
│ │ │ ├── layout/ // 布局文件(XML)
│ │ │ ├── values/ // 字符串、颜色、样式等(XML)
│ │ │ ├── mipmap/ // 应用图标(不同分辨率)
│ │ │ └── ... // 其他资源目录(如 `anim`, `raw` 等)
│ │ └── assets/ // 原始资源文件(直接打包到 APK)
│ ├── test/ // 单元测试(JUnit)
│ └── androidTest/ // 仪器化测试(Espresso 等)
├── build.gradle // 模块的构建配置(依赖、版本等)
└── proguard-rules.pro // 代码混淆规则
3. 关键文件说明
AndroidManifest.xml
- 定义应用的基本信息:包名、权限、四大组件(Activity、Service、BroadcastReceiver、ContentProvider)等。
build.gradle
- 项目级:配置全局构建工具版本和仓库地址。groovy
buildscript { dependencies { classpath "com.android.tools.build:gradle:7.0.0" } }
- 模块级:配置模块的 SDK 版本、依赖库等。groovy
android { compileSdkVersion 31 defaultConfig { applicationId "com.example.myapp" minSdkVersion 21 targetSdkVersion 31 } } dependencies { implementation 'androidx.core:core-ktx:1.7.0' }
res/ 资源目录
layout/
:XML 布局文件(如activity_main.xml
)。values/
:定义字符串、颜色、样式等:xml<!-- strings.xml --> <resources> <string name="app_name">MyApp</string> </resources>
- 其他资源目录支持限定符(如
drawable-hdpi
,layout-land
等)。
4. 视图模式
在 Android Studio 中,可以通过 Project 视图和 Android 视图切换查看项目:
- Android 视图:简化显示,按逻辑分组(如
manifests
,java
,res
)。 - Project 视图:显示实际文件目录结构。
5. 其他重要目录
src/main/assets/
:存放原始文件(如 JSON、HTML),通过AssetManager
访问。src/main/jni/
:JNI 代码(用于 C/C++ 开发)。src/test/
:单元测试(不依赖 Android 框架)。src/androidTest/
:仪器化测试(运行在设备或模拟器上)。
res
目录
在 Android 开发中,res
目录(资源目录)是存放应用所有非代码资源的核心位置,例如布局、图片、字符串、样式等。这些资源会根据设备的配置(如语言、屏幕尺寸、分辨率等)自动适配。以下是 res
目录的详细结构及其用途:
1. 核心子目录
1.1 drawable/
- 用途:存放图片资源(如 PNG、JPEG、WebP)或 XML 定义的图形(如矢量图、形状、选择器等)。
- 常见子目录:
drawable-hdpi
、drawable-xhdpi
等:不同屏幕密度的图片(Android 会根据设备自动选择)。drawable-night
:深色模式专用的图片。
- 示例:xml
<!-- 矢量图标示例(ic_launcher_foreground.xml) --> <vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> <path android:fillColor="#FF0000" android:pathData="M12,2L2,22h20L12,2z"/> </vector>
1.2 layout/
- 用途:存放 XML 布局文件,定义 Activity、Fragment 或组件的界面结构。
- 示例:xml
<!-- activity_main.xml --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!"/> </LinearLayout>
1.3 values/
- 用途:存放键值对形式的资源,如字符串、颜色、样式、尺寸等。
- 关键文件:
strings.xml
:定义字符串(支持多语言)。xml<resources> <string name="app_name">MyApp</string> <string name="welcome_message">Welcome, %s!</string> </resources>
colors.xml
:定义颜色。xml<resources> <color name="colorPrimary">#6200EE</color> </resources>
styles.xml
:定义主题和样式。xml<style name="AppTheme" parent="Theme.MaterialComponents.DayNight"> <item name="colorPrimary">@color/colorPrimary</item> </style>
dimens.xml
:定义尺寸(如边距、字体大小)。xml<resources> <dimen name="padding_medium">16dp</dimen> </resources>
1.4 mipmap/
- 用途:专门存放应用图标(建议仅用于启动器图标)。
- 子目录:
mipmap-hdpi
、mipmap-xhdpi
等,不同分辨率的图标。
2. 其他重要子目录
2.1 anim/
- 用途:存放动画资源(XML 定义的补间动画或属性动画)。
- 示例:xml
<!-- fade_in.xml --> <alpha xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:fromAlpha="0.0" android:toAlpha="1.0"/>
2.2 menu/
- 用途:定义选项菜单、上下文菜单或底部导航栏的 XML 结构。
- 示例:xml
<!-- main_menu.xml --> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/action_settings" android:title="@string/settings"/> </menu>
2.3 raw/
- 用途:存放无需编译的原始文件(如音频、视频、文本),通过
R.raw.filename
访问。 - 注意:与
assets/
目录不同,raw
中的文件会生成资源 ID。
2.4 xml/
- 用途:存放自定义的 XML 配置文件(如网络安全配置、首选项定义)。
- 示例:xml
<!-- network_security_config.xml --> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">example.com</domain> </domain-config> </network-security-config>
2.5 font/
- 用途:存放字体文件(如 TTF、OTF),通过
@font/my_font
引用。 - 示例:xml
<!-- TextView 使用自定义字体 --> <TextView android:fontFamily="@font/roboto_bold"/>
3. 资源限定符(Qualifiers)
通过目录名后缀指定资源适配的设备配置,例如:
- 屏幕方向:
layout-land
(横屏)、layout-port
(竖屏)。 - 语言:
values-es
(西班牙语)、values-zh-rCN
(简体中文)。 - 屏幕尺寸:
layout-sw600dp
(最小宽度 600dp 的设备)。 - API 级别:
drawable-v21
(仅用于 Android 5.0+)。
示例:
res/
├── drawable/
├── drawable-night/ // 深色模式
├── layout/
├── layout-land/ // 横屏布局
└── values-zh-rCN/ // 简体中文字符串
4. 资源引用方式
- 在 XML 中:
@type/name
(如@string/app_name
)。 - 在代码中:
R.type.name
(如R.string.app_name
)。 - 格式化字符串:java
String welcomeMsg = getString(R.string.welcome_message, "Alice");
5. 最佳实践
- 避免硬编码:所有文本、尺寸、颜色应定义在
values/
中。 - 图标管理:
- 使用矢量图(
vector
)适配不同分辨率。 - 应用图标放在
mipmap/
,其他图片放在drawable/
。
- 使用矢量图(
- 多语言支持:为每种语言创建
values-xx
目录并翻译strings.xml
。 - 深色模式适配:使用
drawable-night
和values-night
提供深色资源。
通过合理组织 res
目录,可以显著提升应用的可维护性和多设备兼容性。