启用Desugaring后Android API 23设备因第三方依赖无法找到java.util.function.BiFunction类崩溃的问题排查求助
我来帮你搞定这个API23设备上启用Desugaring后依然找不到java.util.function.BiFunction的棘手问题——这个坑我之前也踩过,核心是旧版本Desugar工具的兼容性缺陷+ProGuard/R8的混淆规则遗漏导致的,咱们一步步来解决:
问题根源分析
你的配置里已经开启了coreLibraryDesugaringEnabled=true,但API23设备还是找不到BiFunction,主要有几个核心原因:
- 你使用的
desugar_jdk_libs和Gradle插件版本太旧,对Java 8函数式接口的Desugaring支持不完善 - Release模式下的R8混淆可能把
java.util.function包下的类给误移除了 - Kotlin标准库依赖版本(jdk7)没有完全适配Java 8 API的Desugaring需求
具体解决方案
1. 升级Desugar和Gradle相关依赖版本
旧版本的Desugar工具对java.util.function包的处理存在已知bug,直接升级到稳定的新版本是最有效的第一步:
- 把项目级
build.gradle里的Gradle插件版本从4.0.1升级到至少7.0.0(推荐最新稳定版,比如7.4.2) - 把模块级
build.gradle里的desugar_jdk_libs从1.0.9升级到1.2.0或更高稳定版 - 同时把Kotlin标准库从
kotlin-stdlib-jdk7换成kotlin-stdlib-jdk8,确保Java 8 API的兼容性
修改后的项目级build.gradle关键部分:
buildscript { ext.kotlin_version = '1.7.20' // 同步升级Kotlin版本到兼容Gradle的版本 dependencies { classpath 'com.android.tools.build:gradle:7.4.2' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // 其他依赖保持不变 } }
模块级build.gradle的依赖部分:
dependencies { // 替换成jdk8版本,增强Java 8 API兼容性 implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" // 升级Desugar依赖,修复函数式接口处理bug coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.2.0' // 其他依赖保持不变 }
2. 完善ProGuard/R8混淆规则
因为你开启了minifyEnabled=true,R8可能会把未被直接引用的java.util.function类移除,需要在proguard-rules.pro里添加保留规则:
// 保留Java 8函数式接口类,避免被R8误移除 -keep class java.util.function.** { *; } // 保留Jackson相关类,确保对象转换逻辑正常 -keep class com.fasterxml.jackson.databind.** { *; } -keep class com.fasterxml.jackson.annotation.** { *; } -keepattributes Signature, InnerClasses, EnclosingMethod // 保留你的Message实体类,避免混淆导致Jackson无法解析 -keep class sanay.co.esn.Message { *; }
3. 确保MultiDex正确初始化
虽然你开启了multiDexEnabled=true,但API23及以下设备需要手动初始化MultiDex,否则部分Desugar后的类可能无法被加载:
- 让你的Application类继承
MultiDexApplication,或者在attachBaseContext方法中调用MultiDex.install()
Kotlin示例:
class MyApplication : MultiDexApplication() { override fun attachBaseContext(base: Context?) { super.attachBaseContext(base) MultiDex.install(this) } }
Java示例:
public class MyApplication extends MultiDexApplication { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } }
然后在AndroidManifest.xml中指定这个Application:
<application android:name=".MyApplication" <!-- 其他配置不变 --> > </application>
4. 验证第三方依赖版本
如果以上步骤还没解决问题,检查你使用的第三方依赖是否存在版本兼容问题——有些旧版本的第三方库可能没有正确处理Java 8 API的Desugaring,尝试升级相关依赖到最新稳定版。
测试验证
完成以上修改后,重新构建APK,在API23设备上测试Jackson的对象转换代码:
List<Message> list; list = mapper.convertValue(mapList, new TypeReference<List<Message>>() {});
应该就不会再出现ClassNotFoundException: java.util.function.BiFunction的崩溃了。
内容的提问来源于stack exchange,提问作者keivan shirkoubian

