首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Invoke-customs are only supported starting with Android O (--min-api 26)

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

原创
作者头像
lichong951
发布2025-12-10 17:17:41
发布2025-12-10 17:17:41
1380
举报
文章被收录于专栏:大前端++大前端++

错误含义

D8编译器告诉你:

代码里用了Java8“invoke-dynamic”语法(lambda、方法引用、默认接口方法、静态接口方法、重复注解等),但当前minSdk<26,低版本Android设备没有对应运行时支持,因此直接中断构建。


官方解决思路(二选一)

方案

是否推荐

说明

1.升minSdk到26

✅最简单

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

2.保持minSdk<26

✅主流做法

启用desugaring(脱糖),让构建器把Java8语法转成旧指令,API21+也能跑。


实操步骤

✅方案A:直接升minSdk(能接受5.0以下弃用)

android{

defaultConfig{

minSdk26//从21/23提到26

}

}Sync→Clean→Rebuild,报错立刻消失。

✅方案B:保持低minSdk,启用desugaring

1.模块级build.gradle打开Java8兼容&脱糖

代码语言:bash
复制
android{
compileOptions{
//1.语言级别
sourceCompatibilityJavaVersion.VERSION_1_8
targetCompatibilityJavaVersion.VERSION_1_8
//2.核心脱糖开关(AGP4.0+)
coreLibraryDesugaringEnabledtrue
}
kotlinOptions{
jvmTarget='1.8'
}
}
代码语言:bash
复制
dependencies{
//3.官方脱糖库(用最新)
coreLibraryDesugaring'com.android.tools:desugar_jdk_libs:2.0.4'
}2.Sync→Clean→Rebuild

现在minSdk21也能正常使用lambda/Stream/Optional/方法引用等Java8特性。


常见坑

•只写compileOptions但没加coreLibraryDesugaringEnabled→依旧报错。

•AGP<4.0→需用老插件desugar_jdk_libs:1.1.5且不支持Stream/Optional,最好升级AGP到7.0+。


一句话总结

能升minSdk就升到26;

要兼容5.0以下→加coreLibraryDesugaringEnabledtrue+依赖desugar_jdk_libs,lambda/Stream随便用,构建不再报Invoke-customs。

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


📌java.lang.NoSuchMethodError:Nostaticmethod

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;

inclassLjava/lang/invoke/LambdaMetafactory;oritssuperclasses

(declarationof'java.lang.invoke.LambdaMetafactory'appearsin

/apex/com.android.runtime/javalib/core-oj.jar)

异常含义

运行时跑到LambdaMetafactory.metafactory这个Java8标准库方法时,发现API<26的Android系统里根本没有该类,于是抛出:

java.lang.NoSuchMethodError:Nostaticmethodmetafactory(...LambdaMetafactory不是你代码写错,而是minSdk<26的设备不支持invoke-dynamic指令(lambda、方法引用、Stream等)。


官方解决路线(二选一)

路线

是否推荐

说明

1.直接升minSdk到26

✅最快

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

2.保持minSdk<26

✅主流

启用核心库脱糖(desugaring),把LambdaMetafactory等Java8API打包进APK,21+也能跑。


实操步骤

✅方案A:直接升minSdk(放弃5.0以下)

android{

defaultConfig{

minSdk26//从21/23提到26

}

}Sync→Clean→Rebuild→运行,崩溃消失。

✅方案B:保持低minSdk,启用核心脱糖

1.模块级build.gradle打开脱糖&Java8兼容

代码语言:bash
复制
android{
compileOptions{
sourceCompatibilityJavaVersion.VERSION_1_8
targetCompatibilityJavaVersion.VERSION_1_8
//关键:启用脱糖
coreLibraryDesugaringEnabledtrue
}
kotlinOptions{
jvmTarget='1.8'
}
}

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

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


常见坑

•只写compileOptions但忘了coreLibraryDesugaringEnabledtrue→依旧崩溃。

•AGP<4.0→老插件不支持LambdaMetafactory脱糖,请升级AGP到7.0+。

•Kotlin1.5+默认生成inddylambda,必须脱糖或升minSdk,无其他开关。


一句话总结

想支持5.0以下→加coreLibraryDesugaringEnabledtrue+依赖desugar_jdk_libs:2.0.4,LambdaMetafactory会被脱糖库打包进APK,系统再旧也能跑;

能接受8.0+→直接把minSdk提到26,崩溃立刻消失。

❗参考一下即可,并不建议使用上面解决方案

##大前端++

AI对大前端项目的冲击,【大前端++】来抵御

【混合开发】进阶到【大前端++】

【大前端++】几大特征

【大前端++】前端、大前端、大前端++的区别有哪些?

##Android推荐阅读

Cannotfitrequestedclassesinasingledexfile(#methods:93047>65536)

【Android】开发者模式启用

##开发工具链推荐

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

##健康杂谈

【论健康】怎么才算健康(健康的本质)

【论健康】健康的不可能三角

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档