Android中Stream.toList()在APK中失效但Studio直接安装正常的问题
Stream.toList() 安装APK后抛出NoSuchMethodError的解决方案
问题详情
使用以下Java代码进行流处理:
var subList = mainList.stream() .flatMap(mainListItem -> getSubItems(mainListItem.subItems).stream()) .toList()
直接从Android Studio运行应用时功能正常,但安装打包后的APK时,toList()调用触发如下错误:
Caused by: java.lang.NoSuchMethodError: No interface method toList()Ljava/util/List; in class Lj$/util/stream/Stream; or its super classes (declaration of 'j$.util.stream.Stream' appears in /data/app/~~O_6UL0ys4sQP9iQ4qmUjjQ==/com.package.name-PBAatiCc4N4NNAIsUiGUfg==/base.apk!classes19.dex)
已配置Desugaring相关参数:
compileOptions { coreLibraryDesugaringEnabled true sourceCompatibility JavaVersion.VERSION_11 targetCompatibility JavaVersion.VERSION_11 } kotlinOptions { jvmTarget = JavaVersion.VERSION_11.toString() }
使用的Desugaring库版本为1.1.5:
coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:1.1.5"
禁用minifyEnabled和shrinkResources后问题仍未解决。
解决方法
1. 升级Desugaring库版本
desugar_jdk_libs:1.1.5对Java 11新增的Stream.toList() API支持存在缺陷,建议升级到1.2.0及以上版本,例如:
coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:1.2.2"
新版本修复了多个Java 11+ API的Desugaring兼容问题,能正确处理Stream.toList()的字节码转换。
2. 替换为Java 8兼容的收集方式
如果暂时无法升级库,可以改用Java 8原生支持的收集器替代toList(),避免依赖Java 11的新API:
import java.util.stream.Collectors; // 替换后的代码 var subList = mainList.stream() .flatMap(mainListItem -> getSubItems(mainListItem.subItems).stream()) .collect(Collectors.toList())
这种写法在所有支持Java 8流API的Android环境中都能稳定运行,无需依赖Desugaring对Java 11特性的适配。
3. 确认所有模块的Desugaring配置
如果项目包含多个模块(如子模块、依赖库),需确保所有使用Stream.toList()的模块都开启了Desugaring:
- 在对应模块的
build.gradle中添加coreLibraryDesugaringEnabled true - 同步引入相同版本的Desugaring库
4. 清理构建缓存并重新构建
执行以下操作彻底清除缓存,避免旧编译产物干扰:
- 点击Android Studio菜单栏的
Build > Clean Project - 执行
Build > Rebuild Project - 删除项目根目录的
.gradle文件夹和各模块的build文件夹,重新同步项目
内容的提问来源于stack exchange,提问作者Devansh Maurya
相关产品推荐
相关产品推荐

