Android项目结构解析 #

一、项目根目录 #

Android项目的根目录包含以下文件和文件夹:

text
MyProject/
├── app/                    # 主应用模块
├── gradle/                 # Gradle包装器
├── build.gradle.kts        # 项目级构建配置
├── settings.gradle.kts     # 项目设置
├── gradle.properties       # Gradle属性配置
├── local.properties        # 本地配置(SDK路径等)
└── gradlew / gradlew.bat   # Gradle包装器脚本

1.1 build.gradle.kts(项目级) #

项目根目录的构建文件,配置整个项目的构建设置:

kotlin
plugins {
    id("com.android.application") version "8.2.0" apply false
    id("org.jetbrains.kotlin.android") version "1.9.0" apply false
}

buildscript {
    repositories {
        google()
        mavenCentral()
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
    }
}

1.2 settings.gradle.kts #

定义项目包含的模块:

kotlin
pluginManagement {
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
    }
}

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}

rootProject.name = "MyProject"
include(":app")

1.3 gradle.properties #

Gradle构建属性配置:

properties
# JVM参数
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8

# 并行构建
org.gradle.parallel=true

# 按需配置
org.gradle.configureondemand=true

# AndroidX支持
android.useAndroidX=true

# Kotlin代码风格
kotlin.code.style=official

二、app模块目录 #

app是默认的应用模块,结构如下:

text
app/
├── src/
│   ├── main/
│   │   ├── java/           # Java/Kotlin源代码
│   │   ├── res/            # 资源文件
│   │   ├── assets/         # 原始资源文件
│   │   └── AndroidManifest.xml
│   ├── test/               # 单元测试
│   └── androidTest/        # 仪器测试
├── build.gradle.kts        # 模块级构建配置
└── proguard-rules.pro      # ProGuard混淆规则

2.1 src/main/java #

存放Kotlin/Java源代码,按照包名组织:

text
java/
└── com/
    └── example/
        └── myapp/
            ├── MainActivity.kt
            ├── SecondActivity.kt
            ├── adapter/
            │   └── MyAdapter.kt
            ├── model/
            │   └── User.kt
            └── utils/
                └── Utils.kt

2.2 src/main/res #

资源文件目录:

text
res/
├── anim/                   # 动画资源
├── animator/               # 属性动画
├── color/                  # 颜色状态列表
├── drawable/               # 图片、形状等
├── layout/                 # 布局文件
├── menu/                   # 菜单资源
├── mipmap/                 # 应用图标
├── raw/                    # 原始文件(音频、视频等)
├── values/                 # 值资源
│   ├── strings.xml         # 字符串
│   ├── colors.xml          # 颜色
│   ├── dimens.xml          # 尺寸
│   ├── styles.xml          # 样式
│   └── themes.xml          # 主题
└── xml/                    # 其他XML文件

2.3 src/main/assets #

存放原始资源文件,不会被编译:

text
assets/
├── fonts/
│   └── custom_font.ttf
├── data/
│   └── config.json
└── web/
    └── index.html

三、AndroidManifest.xml详解 #

AndroidManifest.xml是Android应用的核心配置文件:

xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.myapp">

    <!-- 权限声明 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CAMERA" />
    
    <!-- 硬件特性 -->
    <uses-feature 
        android:name="android.hardware.camera" 
        android:required="true" />

    <application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyApp"
        android:networkSecurityConfig="@xml/network_security_config"
        tools:targetApi="31">
        
        <!-- Activity声明 -->
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:launchMode="singleTop"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <activity
            android:name=".SecondActivity"
            android:exported="false" />
        
        <!-- Service声明 -->
        <service
            android:name=".MyService"
            android:exported="false" />
        
        <!-- BroadcastReceiver声明 -->
        <receiver
            android:name=".MyReceiver"
            android:exported="false">
            <intent-filter>
                <action android:name="com.example.MY_ACTION" />
            </intent-filter>
        </receiver>
        
        <!-- ContentProvider声明 -->
        <provider
            android:name=".MyProvider"
            android:authorities="com.example.myapp.provider"
            android:exported="false" />
            
    </application>

</manifest>

3.1 主要标签说明 #

标签 说明
<manifest> 根元素,包含包名等信息
<uses-permission> 声明应用需要的权限
<uses-feature> 声明应用需要的硬件/软件特性
<application> 应用配置
<activity> Activity组件声明
<service> Service组件声明
<receiver> BroadcastReceiver组件声明
<provider> ContentProvider组件声明
<intent-filter> 意图过滤器

3.2 application属性 #

属性 说明
android:name Application类名
android:icon 应用图标
android:label 应用名称
android:theme 应用主题
android:allowBackup 是否允许备份
android:supportsRtl 是否支持RTL布局

3.3 activity属性 #

属性 说明
android:name Activity类名
android:exported 是否可被其他应用调用
android:launchMode 启动模式
android:screenOrientation 屏幕方向

四、build.gradle.kts详解 #

模块级构建配置文件:

kotlin
plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
    id("kotlin-kapt")  // 注解处理器
}

android {
    namespace = "com.example.myapp"
    compileSdk = 34
    
    defaultConfig {
        applicationId = "com.example.myapp"
        minSdk = 24
        targetSdk = 34
        versionCode = 1
        versionName = "1.0.0"
        
        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }
    
    signingConfigs {
        create("release") {
            storeFile = file("release.keystore")
            storePassword = "your_store_password"
            keyAlias = "your_key_alias"
            keyPassword = "your_key_password"
        }
    }
    
    buildTypes {
        debug {
            isDebuggable = true
            applicationIdSuffix = ".debug"
            versionNameSuffix = "-debug"
        }
        
        release {
            isMinifyEnabled = true
            isShrinkResources = true
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
            signingConfig = signingConfigs.getByName("release")
        }
    }
    
    buildFeatures {
        viewBinding = true
        dataBinding = true
        compose = true
    }
    
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }
    
    kotlinOptions {
        jvmTarget = "17"
    }
    
    composeOptions {
        kotlinCompilerExtensionVersion = "1.5.0"
    }
    
    packaging {
        resources {
            excludes += "/META-INF/{AL2.0,LGPL2.1}"
        }
    }
}

dependencies {
    // AndroidX核心库
    implementation("androidx.core:core-ktx:1.12.0")
    implementation("androidx.appcompat:appcompat:1.6.1")
    implementation("com.google.android.material:material:1.11.0")
    implementation("androidx.constraintlayout:constraintlayout:2.1.4")
    
    // Jetpack组件
    implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0")
    implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.7.0")
    
    // 测试库
    testImplementation("junit:junit:4.13.2")
    androidTestImplementation("androidx.test.ext:junit:1.1.5")
    androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
}

4.1 关键配置说明 #

配置 说明
compileSdk 编译SDK版本
minSdk 最低支持的SDK版本
targetSdk 目标SDK版本
applicationId 应用包名
versionCode 版本号(整数)
versionName 版本名称(字符串)

4.2 依赖类型 #

类型 说明
implementation 编译和运行时都包含
compileOnly 仅编译时包含
runtimeOnly 仅运行时包含
api 编译和运行时都包含,且传递给依赖方
testImplementation 单元测试依赖
androidTestImplementation 仪器测试依赖

五、资源文件详解 #

5.1 strings.xml #

xml
<resources>
    <string name="app_name">我的应用</string>
    <string name="hello">你好,%s!</string>
    <string name="welcome">欢迎来到Android世界</string>
    
    <!-- 字符串数组 -->
    <string-array name="planets">
        <item>水星</item>
        <item>金星</item>
        <item>地球</item>
        <item>火星</item>
    </string-array>
    
    <!-- 复数形式 -->
    <plurals name="songs">
        <item quantity="one">一首歌</item>
        <item quantity="other">%d首歌</item>
    </plurals>
</resources>

5.2 colors.xml #

xml
<resources>
    <color name="purple_200">#FFBB86FC</color>
    <color name="purple_500">#FF6200EE</color>
    <color name="purple_700">#FF3700B3</color>
    <color name="teal_200">#FF03DAC5</color>
    <color name="teal_700">#FF018786</color>
    <color name="black">#FF000000</color>
    <color name="white">#FFFFFFFF</color>
</resources>

5.3 dimens.xml #

xml
<resources>
    <!-- 间距 -->
    <dimen name="padding_small">8dp</dimen>
    <dimen name="padding_medium">16dp</dimen>
    <dimen name="padding_large">24dp</dimen>
    
    <!-- 字体大小 -->
    <dimen name="text_small">12sp</dimen>
    <dimen name="text_medium">16sp</dimen>
    <dimen name="text_large">20sp</dimen>
    
    <!-- 控件尺寸 -->
    <dimen name="button_height">48dp</dimen>
    <dimen name="icon_size">24dp</dimen>
</resources>

5.4 styles.xml #

xml
<resources>
    <!-- 基础样式 -->
    <style name="AppTheme" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
        <item name="colorPrimary">@color/purple_500</item>
        <item name="colorPrimaryDark">@color/purple_700</item>
        <item name="colorAccent">@color/teal_200</item>
    </style>
    
    <!-- 自定义按钮样式 -->
    <style name="CustomButton" parent="Widget.MaterialComponents.Button">
        <item name="android:textColor">@color/white</item>
        <item name="backgroundTint">@color/purple_500</item>
        <item name="cornerRadius">8dp</item>
    </style>
    
    <!-- 自定义文本样式 -->
    <style name="TitleText">
        <item name="android:textSize">24sp</item>
        <item name="android:textColor">@color/black</item>
        <item name="android:textStyle">bold</item>
    </style>
</resources>

六、资源限定符 #

Android支持使用限定符为不同设备提供不同资源:

限定符 说明 示例
语言和地区 不同语言 values-zh, values-en
屏幕方向 横竖屏 layout-land, layout-port
屏幕尺寸 屏幕大小 layout-sw600dp
屏幕密度 像素密度 drawable-hdpi, drawable-xhdpi
API级别 系统版本 values-v26
夜间模式 深色模式 values-night

示例 #

text
res/
├── layout/
│   └── activity_main.xml          # 默认布局
├── layout-land/
│   └── activity_main.xml          # 横屏布局
├── values/
│   └── strings.xml                # 默认字符串
├── values-zh/
│   └── strings.xml                # 中文字符串
├── values-en/
│   └── strings.xml                # 英文字符串
├── drawable-hdpi/
│   └── icon.png                   # 高密度图标
└── drawable-xhdpi/
    └── icon.png                   # 超高密度图标

七、总结 #

本章详细介绍了Android项目的结构:

  1. 项目根目录的配置文件
  2. app模块的目录结构
  3. AndroidManifest.xml的配置
  4. build.gradle.kts的配置
  5. 资源文件的组织方式
  6. 资源限定符的使用

理解项目结构是Android开发的基础,接下来我们将学习Kotlin语言基础。

最后更新:2026-03-26