第二章 Android项目结构解析
说实话,刚接触Android开发那会儿,我对着新建出来的项目文件夹愣了好一会儿。这堆目录是干嘛的?那个build.gradle又是什么鬼?别急,这一章咱们就把Android项目的骨架彻底拆开看看。你搞懂了这些,后面写代码心里就有底了。
2.1 项目目录结构详解
新建一个Android项目后,你会看到一堆文件夹和文件。我刚开始也懵,但用久了发现,这结构其实挺清晰的。咱们从上往下捋一遍。
根目录下的关键成员:
app/—— 这是你写代码的主战场。所有的Java/Kotlin源码、资源文件、清单文件都在这。build.gradle(项目级)—— 整个项目的构建配置,比如仓库地址、插件版本。一般很少动它。settings.gradle—— 告诉Gradle项目里有哪些模块。默认就一个app。gradle.properties—— 一些全局属性,比如JVM内存、是否启用AndroidX。local.properties—— 本地SDK路径,自动生成,别手改。
我个人习惯先把 app/src/main 这个目录搞清楚。它里面有三个核心部分:
java/或kotlin/—— 你的代码放这。包名一层层建好,别偷懒。res/—— 资源文件大本营。布局、图片、字符串、颜色……全在这。AndroidManifest.xml—— 应用的身份证。后面细说。
java/ 下按功能分包,比如 ui、data、utils。这样项目大了也不乱。你想想看,要是几百个文件全扔一个包,找起来多痛苦。
2.2 Gradle构建系统基础
Gradle 是 Android 的构建工具。说白了,它负责把你的代码、资源、依赖打包成APK。我刚开始觉得这玩意儿很玄乎,其实你只需要理解几个关键文件就行。
项目级 build.gradle:
// 项目根目录下的 build.gradle
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:7.4.0"
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
这里配置了插件和仓库。嗯,一般你不需要动它,除非要升级Gradle版本。
模块级 build.gradle(app/build.gradle):
plugins {
id 'com.android.application'
}
android {
compileSdk 34
defaultConfig {
applicationId "com.example.myapp"
minSdk 21
targetSdk 34
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.9.0'
}
这里才是你经常打交道的地方。改SDK版本、加依赖库、配置签名……都在这里。我曾经因为 compileSdk 和 targetSdk 搞混,导致编译报错,折腾了半天。记住:compileSdk 是你用什么版本编译,targetSdk 是你声明兼容到哪个版本。
implementation 和 api 混用,结果依赖传递搞得一团糟。简单说:implementation 只在当前模块可见,api 会传递到依赖它的模块。能用 implementation 就用它,编译更快。
2.3 AndroidManifest.xml核心配置
这个文件是Android应用的“户口本”。系统通过它了解你的应用。没有它,APK根本跑不起来。
<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"
android:theme="@style/Theme.MyApp">
<activity android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
这里有几个重点:
- package —— 应用的唯一标识。发布后不能改,否则就是另一个应用了。
- uses-permission —— 声明权限。比如网络、相机、定位。别忘了加,不然运行时直接崩。
- activity —— 注册Activity。每个页面都得在这登记。我见过新手忘了注册,结果启动就闪退。
- intent-filter —— 告诉系统这个Activity能响应什么操作。MAIN + LAUNCHER 表示这是入口页面。
android:screenOrientation 锁定屏幕方向,或者用 android:configChanges 处理配置变化。我一般在游戏类应用里锁定横屏,省去适配麻烦。
2.4 资源文件管理 (res)
res 文件夹是资源的大本营。布局、图片、字符串、颜色、尺寸……全按类型分好子目录。你想想看,要是没有这个规范,项目得多乱。
| 目录 | 存放内容 | 常见文件 |
|---|---|---|
res/layout/ |
界面布局文件 | activity_main.xml, fragment_home.xml |
res/drawable/ |
图片、形状、选择器 | ic_launcher.png, bg_button.xml |
res/mipmap/ |
应用图标(不同密度) | ic_launcher.webp |
res/values/ |
字符串、颜色、主题 | strings.xml, colors.xml, themes.xml |
res/values-zh/ |
中文语言资源 | strings.xml(中文版) |
我个人强烈建议:所有字符串都写在 strings.xml 里,别硬编码在代码或布局中。为什么?方便国际化啊!我做过一个项目,一开始偷懒直接写中文,后来要加英文版,改得想哭。
res/values/dimens.xml 里定义尺寸值,比如 <dimen name="margin_normal">16dp</dimen>。这样统一修改间距时,改一个文件就行,不用满世界找。
2.5 R.java文件的作用
R.java 是自动生成的,你不需要手动写它。但它非常重要。它就像一个“资源索引表”,把 res 里的每个资源都分配一个唯一的整数ID。
举个例子:你在 res/layout/activity_main.xml 里放了一个布局,R.java 就会生成:
public static final class layout {
public static final int activity_main = 0x7f0a001c;
}
然后你在代码里用 setContentView(R.layout.activity_main) 就能引用它。说白了,R.java 就是连接代码和资源的桥梁。
为什么需要它?因为Android系统用整数ID来高效访问资源。你想想看,如果每次都要用字符串路径去找资源,性能得多差。R.java 把字符串映射成整数,编译时就确定好了,运行时直接查表,快得很。
嗯,到这里,Android项目的骨架你应该心里有数了。目录结构、Gradle构建、Manifest配置、资源管理、R.java……这些是每天都会打交道的。搞懂它们,后面写代码就顺畅多了。