StupidBeauty
Read times:1617Posted at:Tue Oct 5 07:31:59 2021 - no title specified

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. 1.commons-io 2.11.0 是基于Java 8开发的,会使用Java 8中的一些新特性,例如 lambda 表达式,这使得它必须在完全支持Java 8的环境下才能正常运行;

  2. 2.安卓6不完全支持Java 8;

  3. 3.运行时刻,安卓系统中的虚拟机发现这个应用里的commons-io相关的类使用了仅由Java 8支持的特性,因此拒绝载入这些类;

  4. 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 opinions
Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands