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扔一个包……项目大了以后找文件像大海捞针。

我的建议:按 feature 分包。比如 login、home、profile 各一个包,每个包内再放对应的 Activity、ViewModel、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系统会根据设备屏幕密度、语言、主题等自动选择最合适的资源。你只需要按规范放好,系统自己会干活。

注意:res目录下的文件名必须小写,且只能包含字母、数字和下划线。我曾经用了个“icon_v2.0.png”,编译直接报错。嗯,血的教训。

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画了一张项目结构图,帮你把关系理清楚:

项目根目录 app/ 模块 gradle/ 配置 build.gradle settings.gradle src/main/java res/ AndroidManifest build.gradle layout/ drawable/ values/ mipmap/ menu/ anim/ Android项目核心结构图

2.8 小结

Android项目结构其实不复杂。记住几个关键点:

  • java目录写代码,res目录放资源,各司其职
  • AndroidManifest.xml是应用的“身份证”,别漏了注册组件
  • build.gradle管构建,版本号、依赖、混淆都在这配
  • 文件命名规范、目录结构清晰,能省下你大量调试时间

搞懂了这些,你已经迈出了坚实的第一步。接下来写代码时,你会发现自己对项目的掌控感强了很多。


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