AndroidRuntime: java.lang.NoClassDefFoundError: org.apache.commons.io.-$$Lambda$KvkWVsVCTWBQ-_o1aATU4UW8gQk
在一个项目中,由于某个原因需要将之前使用的这个库
org.apache.commons:commons-io:1.3.2
升级到这个库
commons-io:commons-io:2.11.0
升级后,该应用在安卓6(API Level 23)的手机上运行时会崩溃:
FATAL EXCEPTION: main
Process: com.stupidbeauty.hxlauncher, PID: 6682
java.lang.NoClassDefFoundError: org.apache.commons.io.-$$Lambda$KvkWVsVCTWBQ-_o1aATU4UW8gQk
at org.apache.commons.io.IOUtils.<clinit>(IOUtils.java:183)
at org.apache.commons.io.FileUtils.readFileToByteArray(FileUtils.java:2470)
经过几天的调查,认为原因如下:
1.commons-io 2.11.0 是基于Java 8开发的,会使用Java 8中的一些新特性,例如 lambda 表达式,这使得它必须在完全支持Java 8的环境下才能正常运行;
2.安卓6不完全支持Java 8;
3.运行时刻,安卓系统中的虚拟机发现这个应用里的commons-io相关的类使用了仅由Java 8支持的特性,因此拒绝载入这些类;
4.运行时刻,代码执行到要使用这些类的时候,发现这些类不存在,于是产生异常,崩溃。
异常信息中,出现问题时的那个具体类的名字,-$$Lambda$KvkWVsVCTWBQ-_o1aATU4UW8gQk,表明这个问题应当跟Java 8中的lambda表达式特性有关。
寻找commons-io 2.x系列中仍然支持Java 7的版本。最终找到的版本是commons-io 2.6,这是最后一个使用Java 7开发的版本。
因此,将依赖声明改为
commons-io:commons-io:2.6
重新编译后的应用,就能够在安卓6上正常运行了。
未知美人
Your opinionsHxLauncher: Launch Android applications by voice commands