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 知识结构总览
下面这张图帮你把今天的内容串起来。我画图时特意把三个核心模块放在中间,方便你对照着看。
4.5 实战建议:从零搭建一个车载HMI项目
光看不练假把式。我建议你按下面几步走:
- 新建项目:用Android Studio的Empty Activity模板
- 改包名:改成
com.yourcompany.carhmi,别用默认的 - 配Gradle:把
compileSdk设成34,minSdk设成29(Android 10,车载常见版本) - 加依赖:引入
androidx.car.app和androidx.car.ui - 写Manifest:注册一个Activity,加上
android.permission.ACCESS_FINE_LOCATION - 跑一下:连上模拟器或车机,看看能不能正常启动
一个小技巧:车载项目里,
res/values下的strings.xml和colors.xml最好提前规划好。颜色值用十六进制,字符串用中英文分开管理。我见过太多项目后期改颜色改到崩溃的。
嗯,项目结构这块就这些。你把它当成工具箱,每个文件夹、每个配置文件都有它的位置和用途。后面写代码时,你会越来越熟悉它们。