2、Android项目结构解析:核心目录与文件的作用
刚接触Android开发时,面对那一堆文件夹和文件,说实话我也有点懵。app/src/main/java、res、AndroidManifest.xml、build.gradle……每个都有用,但到底谁管谁?
今天我就带你把这些“零件”拆开看看。搞懂了项目结构,你写代码会顺手很多。
2.1 项目根目录:大管家
一个Android项目,最外层是项目根目录。里面有几个关键角色:
- app/ —— 你的应用模块,几乎所有代码都在这里
- gradle/ —— Gradle构建工具的配置文件夹
- build.gradle(项目级) —— 全局构建配置
- settings.gradle —— 告诉Gradle项目包含哪些模块
- local.properties —— 本地SDK路径等,别提交到Git
我个人习惯把项目级build.gradle里只放插件声明和全局仓库,模块级的配置尽量下沉到app/build.gradle里。这样结构更清晰。
2.2 app/src/main/java:你的代码大本营
这是你写Kotlin或Java的地方。说白了,所有业务逻辑、界面控制、数据处理都在这。
举个例子:
app/src/main/java/com/example/myapp/
├── MainActivity.kt
├── ui/
│ ├── HomeFragment.kt
│ └── ProfileFragment.kt
├── data/
│ ├── repository/
│ └── model/
└── utils/
└── DateUtils.kt
嗯,这里要注意:包名结构最好按功能分层,而不是按类型。我见过有人把所有Activity扔一个包、所有Adapter扔一个包……项目大了以后找文件像大海捞针。
2.3 res目录:资源大仓库
res 是 resources 的缩写。所有图片、布局、字符串、颜色、动画……都放这。
常见的子目录:
| 目录 | 存放内容 | 我踩过的坑 |
|---|---|---|
| res/layout/ | XML布局文件 | 命名别用大写字母,否则R文件会报错 |
| res/drawable/ | 图片、shape、selector | 不同密度要放不同文件夹,别只放一套 |
| res/values/ | strings.xml、colors.xml、themes.xml | 字符串硬编码?我曾经被坑惨了 |
| res/mipmap/ | 应用图标(启动图标) | mipmap和drawable不一样,别混用 |
| res/menu/ | 菜单布局 | —— |
为什么会这样区分?因为Android系统会根据设备屏幕密度、语言、主题等自动选择最合适的资源。你只需要按规范放好,系统自己会干活。
2.4 AndroidManifest.xml:应用的身份证
这个文件是Android系统的“门卫”。没有它,你的应用连启动都做不到。
它主要干这几件事:
- 声明应用的包名和版本号
- 注册所有Activity、Service、BroadcastReceiver
- 声明权限(比如网络、相机、定位)
- 指定启动Activity(LAUNCHER)
一个典型的Manifest长这样:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
你想想看,如果你忘了在Manifest里注册一个Activity,运行时直接崩溃。我刚开始学的时候,这个问题至少折腾了我两小时。
2.5 build.gradle:构建脚本,项目的“施工图”
Android项目用Gradle构建。build.gradle文件就是告诉Gradle怎么编译、打包、签名。
项目级build.gradle(根目录):
plugins {
id 'com.android.application' version '8.2.0' apply false
id 'org.jetbrains.kotlin.android' version '1.9.0' apply false
}
模块级build.gradle(app/目录):
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
android {
namespace 'com.example.myapp'
compileSdk 34
defaultConfig {
applicationId "com.example.myapp"
minSdk 24
targetSdk 34
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation 'androidx.core:core-ktx:1.12.0'
implementation 'androidx.appcompat:appcompat:1.6.1'
}
- compileSdk:编译时用的API版本,建议用最新稳定版
- minSdk:最低支持版本,决定了你能用哪些API
- targetSdk:目标版本,系统行为适配的依据
- dependencies:依赖管理,别乱加,小心依赖冲突
我记得有一次升级compileSdk忘了改targetSdk,结果新API全不能用。嗯,这两个要一起升。
2.6 其他重要文件
- gradle.properties —— 全局Gradle配置,比如JVM参数、启用AndroidX
- proguard-rules.pro —— 混淆规则文件,发布前一定要配好
- local.properties —— 本地SDK路径,别提交到版本控制
- .gitignore —— 告诉Git哪些文件不用管
2.7 一张图看懂项目结构
下面我用SVG画了一张项目结构图,帮你把关系理清楚:
2.8 小结
Android项目结构其实不复杂。记住几个关键点:
- java目录写代码,res目录放资源,各司其职
- AndroidManifest.xml是应用的“身份证”,别漏了注册组件
- build.gradle管构建,版本号、依赖、混淆都在这配
- 文件命名规范、目录结构清晰,能省下你大量调试时间
搞懂了这些,你已经迈出了坚实的第一步。接下来写代码时,你会发现自己对项目的掌控感强了很多。