You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启用Desugaring后Android API 23设备因第三方依赖无法找到java.util.function.BiFunction类崩溃的问题排查求助

解决Android API23设备上java.util.function.BiFunction找不到的Desugaring问题

我来帮你搞定这个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 16:07:34