2、Android项目结构解析:了解Gradle构建系统、AndroidManifest.xml详解、资源文件(res)分类、R文件的作用

好,咱们现在正式开始动手了。你新建了一个项目,Android Studio 帮你生成了好多文件和文件夹。第一次看到这个项目结构,是不是有点懵?

别慌,我当年第一次打开也是这个感觉。这就像你搬进一个新家,总得先搞清楚厨房在哪、卧室在哪,对吧?

这一章,我就带你把这个「家」的每个房间都转一遍。搞清楚了这些,你后面写代码会顺手很多。

2.1 Gradle构建系统:项目的「大管家」

先说说 Gradle。它是个自动化构建工具。说白了,就是帮你把写的 Java/Kotlin 代码、资源文件、第三方库这些东西,打包成一个能在手机上跑的 APK 文件。

我个人习惯把 Gradle 想象成一个「大管家」。你告诉它你要用什么材料(依赖库)、打包成什么样子(构建类型),它就会帮你搞定一切。

2.1.1 项目级的 build.gradle

这个文件在项目的根目录下。它负责整个项目的全局配置。比如,所有模块都要用的插件版本、仓库地址等。

// 项目根目录下的 build.gradle
buildscript {
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:7.0.4"
        // 注意:这里不要添加应用级别的依赖
    }
}

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

嗯,这里要注意。这个文件你一般很少改动。只有在升级 Android Studio 或者添加全局插件时才会碰它。

2.1.2 模块级的 build.gradle

这个文件在 app 目录下。它才是你真正要打交道的文件。每个模块都有自己的 build.gradle。

// app/build.gradle
plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
}

android {
    compileSdk 33

    defaultConfig {
        applicationId "com.example.myfirstapp"
        minSdk 21
        targetSdk 33
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation 'androidx.core:core-ktx:1.9.0'
    implementation 'androidx.appcompat:appcompat:1.6.1'
    implementation 'com.google.android.material:material:1.8.0'
    // 其他依赖...
}

这里有几个关键点,我重点说一下:

  • applicationId:应用的唯一标识。说白了就是你的 App 在手机上的「身份证号」。发布后就不能改了。
  • minSdk:最低支持的 Android 版本。我建议设成 21,这样能覆盖 95% 以上的设备。
  • targetSdk:目标版本。表示你在这个版本上做过充分测试。
  • dependencies:这里就是引入第三方库的地方。比如你想用 Google 的 Material Design 组件,就在这里加一行。
我的小技巧: 每次新建项目,我都会先把 compileSdktargetSdk 改成最新的稳定版。这样能用到最新的 API,也能避免一些兼容性问题。

2.2 AndroidManifest.xml:应用的「身份证」

这个文件在 app/src/main/ 目录下。它是每个 Android 应用必须有的文件。系统在安装和运行你的 App 时,第一件事就是读这个文件。

你可以把它理解成应用的「身份证」和「说明书」。里面记录了 App 的所有重要信息。

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

    <!-- 声明权限 -->
    <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.MyFirstApp">

        <!-- 主 Activity -->
        <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>

我来拆解一下里面的关键元素:

  • <manifest>:根标签,package 属性就是应用的包名。
  • <uses-permission>:声明 App 需要的权限。比如访问网络、读取联系人等。
  • <application>:应用的配置。图标、名称、主题都在这里设置。
  • <activity>:声明一个界面(Activity)。android:name 指定了对应的 Java/Kotlin 类。
  • <intent-filter>:这个很重要。它告诉系统,这个 Activity 是应用的入口。没有这个,你的 App 在桌面上就看不到图标。
我曾经踩过的坑: 有一次我忘了在 Manifest 里声明 Activity,结果 App 一启动就崩溃。找了半天才发现是这个问题。所以,每新建一个 Activity,记得一定要在 Manifest 里注册!

2.3 资源文件(res)分类:应用的「素材库」

res 目录是存放所有非代码资源的地方。图片、布局文件、字符串、颜色值等等,都放在这里。

你想想看,如果把所有东西都写在代码里,那维护起来得多痛苦。所以 Android 设计了这套资源管理系统。

目录名 存放内容 使用示例
drawable/ 图片文件(.png, .jpg, .svg)和自定义形状 @drawable/ic_launcher
layout/ 界面布局文件(.xml) @layout/activity_main
mipmap/ 应用图标(不同分辨率) @mipmap/ic_launcher
values/ 字符串、颜色、尺寸、主题等 @string/app_name
raw/ 原始文件(音频、视频等) R.raw.sound_effect

这里有个重要的概念:资源引用。在 XML 里用 @类型/名称 来引用,在 Java/Kotlin 代码里用 R.类型.名称 来引用。

重点: 资源文件的命名有讲究。只能用小写字母、数字和下划线。比如 my_image.png 可以,但 My Image.png 就不行。我刚开始学的时候,因为这个报错了好几次。

2.4 R文件的作用:代码和资源的「桥梁」

R 文件是 Android 自动生成的。你不需要手动创建它,也最好不要去修改它。

它的作用是什么?说白了,就是让 Java/Kotlin 代码能「找到」res 目录里的资源。

比如,你在 res/values/strings.xml 里定义了一个字符串:

<resources>
    <string name="app_name">我的第一个App</string>
</resources>

然后,R 文件里就会自动生成一个对应的常量:

public static final class string {
    public static final int app_name = 0x7f0a0014;
}

这样,你在代码里就可以通过 R.string.app_name 来获取这个字符串的 ID 了。

为什么会这样?因为 Android 系统在编译时,会给每个资源分配一个唯一的整数 ID。R 文件就是这些 ID 的「目录」。你通过 R 文件来引用资源,系统就能找到对应的文件。

我的经验: 如果你发现代码里 R.id.xxx 报红了,别慌。先检查一下对应的布局文件里有没有定义这个 ID。如果定义了还是报错,试试菜单栏的 Build > Clean Project,让系统重新生成一下 R 文件。这个操作我一周至少用两三次。

好了,这一章的内容就到这里。项目结构这块,你不需要一次全记住。先有个大概印象,后面写代码时遇到不懂的,再回来翻翻就行。

下一章,我们就要开始写第一个界面了。到时候你会真正体会到,这些文件是怎么配合工作的。


公众号:蓝海资料掘金营,微信deep3321