第4章 环境搭建与依赖配置

4.1 原理概述

SystemUI 作为 Android 系统级应用,其构建环境与普通 App 有显著差异:

  • Gradle 依赖声明:需要引入 Navigation Compose、Lifecycle、Activity Compose 等 Jetpack 库;同时需处理 AOSP 预编译模块与 AndroidX 的互斥关系。
  • minSdk 版本要求:SystemUI 必须运行在高版本 API 上(通常 ≥ 29),因为依赖的 Framework API 和窗口管理接口在低版本中不可用。
  • Kotlin 与 Java 混合配置:AOSP 原生使用 Java 编写 SystemUI,但新功能建议使用 Kotlin;需要在 build.gradle 中正确配置两个源码目录及编译插件。
  • Android Studio 版本兼容:推荐使用 Android Studio Hedgehog (2023.1.1) 或更高版本,Gradle 插件版本 8.x,否则可能导致 KSP/Compose 编译器插件不兼容。

4.2 环境搭建步骤

4.2.1 Gradle 依赖声明

在项目级 build.gradle.kts 或 build.gradle 中声明仓库与插件:

// build.gradle.kts (Project)
plugins {
    id("com.android.application") version "8.2.2" apply false
    id("org.jetbrains.kotlin.android") version "1.9.22" apply false
    id("org.jetbrains.kotlin.plugin.compose") version "1.9.22" apply false
}

在模块级 build.gradle.kts 中启用 Compose 并添加 Navigation 依赖:

plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
    id("org.jetbrains.kotlin.plugin.compose")
}

android {
    namespace = "com.android.systemui.navintegration"
    compileSdk = 34

    defaultConfig {
        applicationId = "com.android.systemui.navintegration"
        minSdk = 29
        targetSdk = 34
        versionCode = 1
        versionName = "1.0"
    }
}

dependencies {
    // Navigation Compose
    implementation("androidx.navigation:navigation-compose:2.7.7")
    // Activity Compose
    implementation("androidx.activity:activity-compose:1.8.2")
    // Lifecycle
    implementation("androidx.lifecycle:lifecycle-runtime-compose:2.7.0")
    // Compose BOM
    implementation(platform("androidx.compose:compose-bom:2024.02.00"))
    implementation("androidx.compose.ui:ui")
    implementation("androidx.compose.material3:material3")
}
提示:AOSP 原生 SystemUI 项目通常使用 Android.bp 文件构建。本章给出的 Gradle 配置适用于独立学习项目(如 NavIntegrationSample),并非直接替换 AOSP 构建系统。

4.2.2 minSdk 版本要求

API 级别 系统版本 备注
29 Android 10 最低要求,支持 Edge-to-Edge 手势导航 API
30 Android 11 推荐 minSdk,Navigation 2.4+ 稳定支持系统返回
33 Android 13 若需使用 Predictive Back Gesture 等新特性

注意:实际集成到 SystemUI 时,minSdk 由 AOSP 源码树决定,通常为 29 或更高。单独编译示例项目时,建议设置 minSdk = 29 以保持兼容性。

4.2.3 Kotlin 与 Java 混合配置

SystemUI 中存在大量现有 Java 代码。在 Gradle 项目中混合配置的方法:

  1. 源码目录分离:Java 源文件保留在 src/main/java/,Kotlin 源文件放置在 src/main/kotlin/。
  2. 插件声明:在 build.gradle 中应用 kotlin-android 插件,Kotlin 编译器会自动处理混合文件。
  3. Java 调用 Kotlin:无需额外配置,Gradle 会自动生成 Kotlin 字节码的 Java 兼容桩。
  4. Kotlin 调用 Java:直接引用,但需注意 Kotlin 中不能使用 Java 的关键字(如 in、out 等)。
// 示例:Java 文件中引用 Kotlin 定义的 Object
// Java
NavController controller = NavIntegrationManager.INSTANCE.getController();

4.2.4 Android Studio 版本兼容

下表列出了常用版本组合的兼容性:

Android Studio AGP 版本 Kotlin 版本 Compose 编译器
Hedgehog 2023.1.1 8.2.0~8.2.2 1.9.22 1.5.9 (通过 kotlin-compose-plugin)
Iguana 2023.2.1 8.3.0~8.3.2 1.9.23 1.5.10
Ladybug 2024.2.1 8.5.0 2.0.0 2.0.0 (内置 Compose compiler Gradle plugin)

若出现 Cannot inline bytecode built with JVM target 1.8 into bytecode that is being built with JVM target 11 等错误,请检查 compileOptions 和 kotlinOptions 中的 JVM 目标一致设置为 1.8 或 17(取决于 AGP 版本)。

4.3 依赖关系与构建流程

下图展示了本章配置中涉及的核心组件及其依赖流向:

图 4-1:Gradle 依赖结构图
Navigation 集成项目 Gradle 依赖结构 Project build.gradle.kts plugins: AGP 8.2.2 + Kotlin 1.9.22 Module build.gradle.kts androidx.navigation:navigation-compose androidx.activity:activity-compose androidx.lifecycle:lifecycle-runtime-compose Compose BOM (2024.02.00) minSdk = 29 (兼容手势导航 API) Kotlin + Java 混合 src/main/kotlin + java ⚠️ 注意事项 • Android Studio ≥ Hedgehog • AGP 版本必须与 Compose 编译器匹配 • minSdk 不可低于 29,否则无法使用 WindowInsets

4.4 常见错误与调试

4.4.1 Compose 编译器版本不匹配

错误日志:

Execution failed for task ':app:compileDebugKotlin'.
> 'compileDebugKotlin' task (current target is 1.8) and 'kaptGenerateStubsDebugKotlin' task (current target is 11) have different jvm target values

原因:Kotlin 编译 JVM 目标与 AGP 的 compileOptions 不一致。

解决方案:在模块级 build.gradle.kts 中统一设置:

android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }
    kotlinOptions {
        jvmTarget = "17"
    }
}

4.4.2 Navigation 依赖找不到 NavHost

错误日志:

Unresolved reference: NavHost

原因:未导入正确的依赖或遗漏 kotlinx.coroutines 等传递依赖。

解决方案:确认已添加 navigation-compose 依赖,并确保项目中启用了 kotlin-android 插件。

4.4.3 minSdk 过低导致 WindowInsetsControllerCompat 异常

若 minSdk < 29,某些 SystemUI 专有 API 在运行时抛出 RuntimeException。请务必设置 minSdk = 29,并在 build.gradle 中同步修改。

4.5 部署与验证

  1. 在 Android Studio 中执行 Sync Project with Gradle Files,确认无报错。
  2. 连接 API 29+ 的模拟器或设备,点击 Run 按钮。
  3. 安装后检查应用是否有 NavHost 组件及导航过渡动画。
注意:将本章示例项目集成到 AOSP SystemUI 时,需要将 Gradle 依赖替换为 AOSP 内的 Android.bp 引用,例如使用 android_library 模块的 static_libs 或 shared_libs 来引入 Jetpack 组件。详细方法将在第6章“AOSP 构建集成”中讨论。