第二章 Android项目结构解析

说实话,刚接触Android开发那会儿,我对着新建出来的项目文件夹愣了好一会儿。这堆目录是干嘛的?那个build.gradle又是什么鬼?别急,这一章咱们就把Android项目的骨架彻底拆开看看。你搞懂了这些,后面写代码心里就有底了。

Android项目根目录 app/ 模块 Gradle构建脚本 其他配置文件 src/ 源码 res/ 资源 AndroidManifest.xml build.gradle(项目) build.gradle(模块) settings.gradle gradle.properties local.properties Android项目核心结构总览(基于Gradle构建) 每个文件夹和配置文件都有自己的职责,缺一不可

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/ 下按功能分包,比如 uidatautils。这样项目大了也不乱。你想想看,要是几百个文件全扔一个包,找起来多痛苦。

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版本、加依赖库、配置签名……都在这里。我曾经因为 compileSdktargetSdk 搞混,导致编译报错,折腾了半天。记住:compileSdk 是你用什么版本编译,targetSdk 是你声明兼容到哪个版本。

⚠️ 避坑指南: 我曾经把 implementationapi 混用,结果依赖传递搞得一团糟。简单说: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 表示这是入口页面。
🔑 关键点: 你可以在Manifest里配置 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 把字符串映射成整数,编译时就确定好了,运行时直接查表,快得很。

⚠️ 注意: 如果你删除了某个资源文件,但代码里还引用着它的R.id,编译就会报错。我经常遇到这种情况:重构布局时忘了更新代码,然后R.id标红。解决办法很简单——删掉旧的引用,或者重新编译一下,R.java会自动更新。

嗯,到这里,Android项目的骨架你应该心里有数了。目录结构、Gradle构建、Manifest配置、资源管理、R.java……这些是每天都会打交道的。搞懂它们,后面写代码就顺畅多了。

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