Android学习笔记-3-Android compileOptions 与脱糖(Desugaring)

22 阅读1分钟

Android学习笔记: compileOptions 与脱糖(Desugaring)

生成 Android 学习专栏头图.png

核心一句话
compileOptions 告诉编译器“用 Java 8 语法写代码”,脱糖让生成的代码能在旧版 Android 设备上安全运行(minSdk=16+)


🔑 核心概念速览

概念作用是否需手动配置
compileOptions源码语法版本 + 字节码目标版本✅ 必须(设为 VERSION_1_8
语言特性脱糖Lambda/方法引用 → 转为匿名类❌ AGP ≥ 3.0 自动处理
API 脱糖java.time/Stream → 兼容旧设备✅ 仅当使用时添加脱糖库
flowchart LR
    A[Java 8 源码] --> B[Gradle 编译]
    B --> C[Java 8 字节码]
    C --> D{需脱糖?}
    D -- 语言特性 --> E[D8 自动转换]
    D -- 新 API --> F[脱糖库补充实现]
    E & F --> G[DEX 字节码]
    G --> H[所有设备运行]

⚙️ 最简配置(app/build.gradle

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8 // 源代码允许使用的Java语法
        targetCompatibility JavaVersion.VERSION_1_8 // 生成的.class字节码版本
    }
    
    // Kotlin 项目必加
    kotlinOptions { jvmTarget = "1.8" }
}

// 仅当使用 java.time / Stream 时添加
dependencies {
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
}

💡 脱糖库版本:AGP ≥ 7.0 用 2.0.4,AGP 4.0~6.9 用 1.2.2


💡 代码对比:脱糖带来的简洁

// ❌ 旧写法(冗长)
button.setOnClickListener(new View.OnClickListener() {
    @Override public void onClick(View v) {
        prefs.edit().putString(KEY, editText.getText().toString()).apply();
    }
});

// ✅ 脱糖后(Lambda 直接写,D8 自动转换)
button.setOnClickListener(v -> 
    prefs.edit().putString(KEY, editText.getText().toString()).apply()
);

效果:代码量 -40% | 逻辑清晰 | 无兼容风险


🔍 验证三步法

  1. 输入 v -> Log.d("TEST", "Clicked!")
  2. 无红色波浪线 → 配置生效
  3. Build → Make Project 无报错

❓ 高频问题

问题答案
必须设 1.8 吗?✅ 现代开发标配
影响旧设备吗?❌ 脱糖后 minSdk=16+ 全兼容
Lambda 需脱糖库?❌ 仅语言特性,AGP 自动处理
LocalDate 需脱糖库?✅ 必须添加 coreLibraryDesugaring
Kotlin 需配置?✅ 必加 kotlinOptions { jvmTarget = "1.8" }

📌 行动清单

  • app/build.gradle 添加 compileOptions 1.8
  • Kotlin 项目同步配置 kotlinOptions
  • 仅当用 java.time/Stream 时添加脱糖库
  • Sync → 用 Lambda 重写一个监听器验证

💬 记住
脱糖 = 把高级语法“翻译”成旧设备能懂的语言