Invoke-customs are only supported starting with Android O (--min-api 26)
错误含义
D8 编译器告诉你:
代码里用了 Java 8 “invoke-dynamic” 语法(lambda、方法引用、默认接口方法、静态接口方法、重复注解等),但 当前 minSdk<26,低版本 Android 设备没有对应运行时支持,因此直接中断构建。
官方解决思路(二选一)
方案
是否推荐
说明
-
升 minSdk 到 26
✅ 最简单
只要业务允许,一行搞定,无需额外依赖。 -
保持 minSdk<26
✅ 主流做法
启用 desugaring(脱糖),让构建器把 Java 8 语法 转成旧指令,API 21+ 也能跑。
实操步骤
✅ 方案 A:直接升 minSdk(能接受 5.0 以下弃用)
android {
defaultConfig {
minSdk 26 // 从 21/23 提到 26
}
}Sync → Clean → Rebuild,报错立刻消失。
✅ 方案 B:保持低 minSdk,启用 desugaring
- 模块级 build.gradle 打开 Java 8 兼容 & 脱糖
android {compileOptions {// 1. 语言级别sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility 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 等)。
官方解决路线(二选一)
路线
是否推荐
说明
-
直接升 minSdk 到 26
✅ 最快
只要业务允许,一行搞定,无需额外依赖。 -
保持 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,启用 核心脱糖
- 模块级 build.gradle 打开脱糖 & Java 8 兼容
android {compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility 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的性能对比
健康杂谈
【论健康】怎么才算健康(健康的本质)
【论健康】健康的不可能三角