Tech & Programming/모바일(Android, Flutter)

org.apache.commons.io 라이브러리에서 java.lang.NoSuchMethodError 에러 해결

소스코드 요리사 2019. 11. 14. 14:34

몇 달 전부터 APP.을 실행시키거나 사진이 들어간 페이지를 작성하면 죽는다는 VOC를 접수했습니다.

사용자는 삼성 노트 4에 안드로이드 6 버전을 사용하고 있었습니다.

 

최근 10월 말 릴리즈를 하면서 테스트할 때는 이상이 없었기에 안드로이드 API 호환성 문제로 의심하고,

애뮬레이터를 해당버전에 맞게 세팅하고 재현에 들어갔습니다.

 

그러자, 이미지를 TEMP 디렉토리에 복사 또는 제거하는 부분에서 Crash가 되었습니다.

로그 중에 특별한 내용은 아래와 같았습니다.

 

java.lang.NoSuchMethodError: No virtual method toPath()Ljava/nio/file/Path; in class Ljava/io/File; or its super classes (declaration of 'java.io.File' appears in /system/framework/core-libart.jar)

 

java.lang.NoSuchMethodError:

at org.apache.commons.io.FileUtils.isSymlink (FileUtils.java)

at org.apache.commons.io.FileUtils.sizeOfDirectory0 (FileUtils.java)

at org.apache.commons.io.FileUtils.sizeOfDirectory (FileUtils.java)

 

이 내용을 가지고 아래 두 내용을 알 수 있습니다. 

1. Apache의 commons.io 라이브러리가 안드로이드 6 에서 죽는다.

2. Class Path 나 Mathod를 못찾는다.

 

그리고는 구글링 및 아파치 common.io 라이브러리 문서를 뒤졌습니다.

 

거기서 찾은 내용은 common.io 2.6 부터 자바 1_7 이상이면 자바 API에 위임하는 부분에 java.io.File 이 아니라 java.nio.file.Path을 사용한다는 내용이었습니다.

그리고, 안드로이드 SDK 26 이전에는 java.nio 클래스가 제공되지 않는다는 것이었습니다.

(참고자료 : https://github.com/TheElectronWill/Night-Config/issues/46)

 

몇 달 전 AndroidX로 migration 하면서 몇몇 라이브러리도 버전을 업데이트 했는데, 그것이 화근이었습니다.

결국 버전을 2.5로 다운그레이드 했고, 정상동작하는 것을 확인했습니다.

  제가 가지고 있는 테스트 시료로는 지원하는 모든 안드로이드 버전을 테스팅하는 것은 한계가 있기 때문에 애뮬레이터로 기본 테스트 만이라도 자동화 시켜 돌리는 프로세스를 하나 만들어야겠다는 생각을 하게된 계기도 되었습니다.

 

혹시나 해당 문제로 어려움을 겪으시는 분들에 작은 도움이 되었으면 좋겠습니다