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项目的结构:
- 项目根目录的配置文件
- app模块的目录结构
- AndroidManifest.xml的配置
- build.gradle.kts的配置
- 资源文件的组织方式
- 资源限定符的使用
理解项目结构是Android开发的基础,接下来我们将学习Kotlin语言基础。
最后更新:2026-03-26