Skip to content

在 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-hdpidrawable-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-hdpimipmap-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. 最佳实践

  1. 避免硬编码:所有文本、尺寸、颜色应定义在 values/ 中。
  2. 图标管理
    • 使用矢量图(vector)适配不同分辨率。
    • 应用图标放在 mipmap/,其他图片放在 drawable/
  3. 多语言支持:为每种语言创建 values-xx 目录并翻译 strings.xml
  4. 深色模式适配:使用 drawable-nightvalues-night 提供深色资源。

通过合理组织 res 目录,可以显著提升应用的可维护性和多设备兼容性。