Invoke-customs are only supported starting with Android O (--min-api 26)

47 阅读3分钟

错误含义 D8 编译器告诉你: 代码里用了 Java 8 “invoke-dynamic” 语法(lambda、方法引用、默认接口方法、静态接口方法、重复注解等),但 当前 minSdk<26,低版本 Android 设备没有对应运行时支持,因此直接中断构建。

官方解决思路(二选一) 方案 是否推荐 说明

  1. 升 minSdk 到 26 ✅ 最简单 只要业务允许,一行搞定,无需额外依赖。
  2. 保持 minSdk<26 ✅ 主流做法 启用 desugaring(脱糖),让构建器把 Java 8 语法 转成旧指令,API 21+ 也能跑。

实操步骤 ✅ 方案 A:直接升 minSdk(能接受 5.0 以下弃用) android { defaultConfig { minSdk 26 // 从 21/23 提到 26 } }Sync → Clean → Rebuild,报错立刻消失。 ✅ 方案 B:保持低 minSdk,启用 desugaring

  1. 模块级 build.gradle 打开 Java 8 兼容 & 脱糖
android {
    compileOptions {
        // 1. 语言级别
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
        // 2. 核心脱糖开关(AGP 4.0+)
        coreLibraryDesugaringEnabled true
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}
dependencies {
    // 3. 官方脱糖库(用最新)
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
}2. Sync → Clean → Rebuild

现在 minSdk 21 也能正常使用 lambda / Stream / Optional / 方法引用 等 Java 8 特性。

常见坑 • 只写 compileOptions 但没加 coreLibraryDesugaringEnabled → 依旧报错。 • AGP < 4.0 → 需用 老插件 desugar_jdk_libs:1.1.5 且 不支持 Stream / Optional,最好 升级 AGP 到 7.0+。

一句话总结 能升 minSdk 就升到 26; 要兼容 5.0 以下 → 加 coreLibraryDesugaringEnabled true + 依赖 desugar_jdk_libs,lambda / Stream 随便用,构建不再报 Invoke-customs。

❗这样会导致原有的生产工程异常,因此不建议这么做,而是仔细梳理吃透工程配置。然后变更冲突工程参数即可

📌java.lang.NoSuchMethodError: No static method metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; in class Ljava/lang/invoke/LambdaMetafactory; or its super classes (declaration of 'java.lang.invoke.LambdaMetafactory' appears in /apex/com.android.runtime/javalib/core-oj.jar)

异常含义 运行时跑到 LambdaMetafactory.metafactory 这个 Java 8 标准库方法时,发现 API < 26 的 Android 系统里根本没有该类,于是抛出: java.lang.NoSuchMethodError: No static method metafactory(...LambdaMetafactory不是你代码写错,而是 minSdk < 26 的设备 不支持 invoke-dynamic 指令(lambda、方法引用、Stream 等)。

官方解决路线(二选一) 路线 是否推荐 说明

  1. 直接升 minSdk 到 26 ✅ 最快 只要业务允许,一行搞定,无需额外依赖。
  2. 保持 minSdk<26 ✅ 主流 启用 核心库脱糖(desugaring),把 LambdaMetafactory 等 Java 8 API 打包进 APK,21+ 也能跑。

实操步骤 ✅ 方案 A:直接升 minSdk(放弃 5.0 以下) android { defaultConfig { minSdk 26 // 从 21/23 提到 26 } }Sync → Clean → Rebuild → 运行,崩溃消失。 ✅ 方案 B:保持低 minSdk,启用 核心脱糖

  1. 模块级 build.gradle 打开脱糖 & Java 8 兼容
android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
        // 关键:启用脱糖
        coreLibraryDesugaringEnabled true
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

dependencies {
    // 官方脱糖库(用最新)
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
}2. Sync → Clean → Rebuild

现在 minSdk 21 的设备也能正常使用 lambda / 方法引用 / Stream / Optional 等,不再找系统 LambdaMetafactory。

常见坑 • 只写 compileOptions 但忘了 coreLibraryDesugaringEnabled true → 依旧崩溃。 • AGP < 4.0 → 老插件 不支持 LambdaMetafactory 脱糖,请升级 AGP 到 7.0+。 • Kotlin 1.5+ 默认生成 inddy lambda,必须脱糖或升 minSdk,无其他开关。

一句话总结 想支持 5.0 以下 → 加 coreLibraryDesugaringEnabled true + 依赖 desugar_jdk_libs:2.0.4,LambdaMetafactory 会被 脱糖库打包进 APK,系统再旧也能跑; 能接受 8.0+ → 直接把 minSdk 提到 26,崩溃立刻消失。 ❗参考一下即可,并不建议使用上面解决方案

大前端++

AI 对大前端项目的冲击,【大前端++】来抵御 【混合开发】进阶到【大前端++】 【大前端++】几大特征 【大前端++】前端、大前端、大前端++的区别有哪些?

Android推荐阅读

Cannot fit requested classes in a single dex file (# methods: 93047 > 65536) 【Android】开发者模式启用

开发工具链推荐

API开发工具postman、国内xxapi和SmartApi的性能对比

健康杂谈

【论健康】怎么才算健康(健康的本质) 【论健康】健康的不可能三角