4. 项目结构入门:Android项目目录解析、Gradle构建脚本、Manifest文件配置

刚接触车载HMI开发时,很多人对着Android Studio自动生成的项目结构发懵。说实话,我第一次打开也觉得文件夹太多了。但别怕,这东西拆开看其实很清晰。

今天我们就把它掰开揉碎。你搞懂了项目结构,后面写代码、加依赖、改配置,心里就有底了。

4.1 Android项目目录长什么样?

一个标准的Android项目,主要分两大块:工程配置区和源码资源区。我习惯把它们比作「施工图纸」和「建筑材料」。

目录/文件 作用 我常碰到的坑
app/ 主模块,存放所有代码和资源 别把第三方库的代码直接塞进来
src/main/ 主源码集,Java/Kotlin + res + Manifest 记得区分main、debug、release
src/main/java/ Java/Kotlin源文件 包名路径别写错,编译会报红
src/main/res/ 资源文件:布局、图片、字符串等 车载HMI常用drawable-hdpi/xhdpi
src/main/AndroidManifest.xml 应用清单,四大组件注册地 权限声明漏了,功能直接挂掉
build.gradle(项目级) 全局构建配置 仓库地址、插件版本
build.gradle(模块级) 模块构建配置 依赖、编译SDK版本、混淆
gradle/wrapper/ Gradle版本管理 团队统一版本,避免构建不一致
我的习惯:每次新建项目,先把app/src/main下的目录结构理一遍。删掉自动生成的示例文件,换成自己的包名路径。这一步做干净了,后面少很多麻烦。

4.2 Gradle构建脚本:别被它吓到

Gradle是Android的构建工具。说白了,它告诉编译器:用什么SDK版本、依赖哪些库、打什么类型的包。

项目级build.gradle长这样:

// 项目级 build.gradle
buildscript {
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:7.4.2"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.0"
    }
}

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

模块级build.gradle才是我们天天改的:

// 模块级 build.gradle
plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
}

android {
    namespace 'com.example.carhmi'
    compileSdk 34

    defaultConfig {
        applicationId "com.example.carhmi"
        minSdk 29
        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'
    // 车载HMI常用依赖
    implementation 'androidx.car.app:app:1.4.0'
}
我曾经踩过的坑:车载项目里minSdk设得太低,结果用了高版本API,编译不报错,运行直接崩溃。后来我养成了习惯——先确认目标车机的Android版本,再设minSdk和targetSdk。

4.3 Manifest文件:应用的身份证

AndroidManifest.xml是每个Android应用的入口文件。系统通过它认识你的应用:有哪些Activity、用什么权限、入口是哪个界面。

一个车载HMI的Manifest大概长这样:

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

    <!-- 车载常用权限 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.BLUETOOTH" />

    <application
        android:allowBackup="true"
        android:label="@string/app_name"
        android:theme="@style/Theme.CarHMI">

        <!-- 主界面 -->
        <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>

        <!-- 车载特有的Service -->
        <service
            android:name=".CarMediaService"
            android:exported="true" />

    </application>
</manifest>

这里有几个关键点:

  • package:应用的唯一标识,车载市场里别跟别的应用冲突
  • 权限声明:车载HMI经常需要定位、蓝牙、车辆数据权限,漏一个功能就废了
  • Activity注册:每个界面都要在这里注册,否则启动时直接闪退
  • intent-filter:告诉系统哪个界面是入口
车载HMI特别提醒:很多车机系统对后台Service有严格限制。如果你的音乐播放器或导航服务需要在后台运行,记得在Manifest里声明android:foregroundServiceType,否则Android 12以上直接给你杀了。

4.4 知识结构总览

下面这张图帮你把今天的内容串起来。我画图时特意把三个核心模块放在中间,方便你对照着看。

Android项目结构核心模块 Android项目根目录 Gradle构建脚本 build.gradle × 2 源码与资源 src/main/java + res Manifest清单 AndroidManifest.xml 💡 车载HMI开发要点 • Gradle配置:注意compileSdk与车机系统版本匹配 • Manifest:权限声明 + 四大组件注册,缺一不可 编写代码 Gradle构建 生成APK

4.5 实战建议:从零搭建一个车载HMI项目

光看不练假把式。我建议你按下面几步走:

  1. 新建项目:用Android Studio的Empty Activity模板
  2. 改包名:改成com.yourcompany.carhmi,别用默认的
  3. 配Gradle:把compileSdk设成34,minSdk设成29(Android 10,车载常见版本)
  4. 加依赖:引入androidx.car.app和androidx.car.ui
  5. 写Manifest:注册一个Activity,加上android.permission.ACCESS_FINE_LOCATION
  6. 跑一下:连上模拟器或车机,看看能不能正常启动
一个小技巧:车载项目里,res/values下的strings.xml和colors.xml最好提前规划好。颜色值用十六进制,字符串用中英文分开管理。我见过太多项目后期改颜色改到崩溃的。

嗯,项目结构这块就这些。你把它当成工具箱,每个文件夹、每个配置文件都有它的位置和用途。后面写代码时,你会越来越熟悉它们。