写点什么

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

作者:lichong951
  • 2025-12-10
    北京
  • 本文字数:2105 字

    阅读完需:约 7 分钟

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

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


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

  1. 升 minSdk 到 26

✅ 最简单 只要业务允许,一行搞定,无需额外依赖。

  1. 保持 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 → 需用 老插件 desugarjdklibs:1.1.5 且 不支持 Stream / Optional,最好 升级 AGP 到 7.0+。


一句话总结 能升 minSdk 就升到 26; 要兼容 5.0 以下 → 加 coreLibraryDesugaringEnabled true + 依赖 desugarjdklibs,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

✅ 最快 只要业务允许,一行搞定,无需额外依赖。

  1. 保持 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 + 依赖 desugarjdklibs: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的性能对比

健康杂谈

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

用户头像

lichong951

关注

人生三定|SmartApi|大前端++ 2018-12-28 加入

开创前端晋升路线:【大前端++】技术路线; SmartApi 开发工具软件 著有《修心力》(正在出版中)、《健康的本质》(正在写作中)。。。其他杂谈文章等等;

评论

发布
暂无评论
Invoke-customs are only supported starting with Android O (--min-api 26)_android_lichong951_InfoQ写作社区