[Android] Caused by: java.lang.VerifyError: Verifier rejected class

[Android] Caused by: java.lang.VerifyError: Verifier rejected class



 

안드로이드에서 아래와 같이 java.lang.VerifyError 발생한 경우.

Caused by: java.lang.VerifyError: Verifier rejected class com.packageName.className: void
     com.packageName.className<init>(boolean) failed to verify: void
     com.packageName.className<init>(boolean): [0x31] Expected initialization on uninitialized reference Precise Reference: java.lang.String (declaration of ‘com.packageName.className’ appears in /data/app/com.packageName-1/split_lib_slice_9_apk.apk)

java.lang.VerifyError 오류를 검색해보니 아래 내용을 찾을 수 있었다.

1. 컴파일 시 사용한 라이브러리와 런타임 시 사용한 라이브러리 버전이 달라서 메서드 형태가 다른 경우

2. 사용한 라이브러리가 상위 버전의 JDK에서 컴파일 된 경우

=> 결국은 라이브러리 버전을 맞춰야 한다.

(출처 : https://hiro1983.tistory.com/m/29)

내 경우 안드로이드 프로젝트에 특정 라이브러리(aar 확장자 파일)를 추가하는 과정에서 java.lang.VerifyError 오류가 발생했다.

일단 안드로이드 프로젝트와 aar 파일과의 JDK버전 내지는 안드로이드 SDK 버전을 맞춰야 한다는 생각이 들었다.
해당 aar 을 반디집으로 풀어서 AndroidManifest.xml 을 열어보니 안드로이드 버전 29로 되어있었다.
내 프로젝트는 안드로이드 버전 28 이었는데, 어쩐 일인지 build.gradle을 29로 고치면 앱이 동작하지 않았다.


검색해보니 안드로이드 스튜디오 버전 4.0 이상에서 안드로이드 버전 29를 쓸 수 있다는 내용을 보았다.
내가 사용한 안드로이드 스튜디오는 버전 3.4 였다.

결국 안드로이드 스튜디오 4.0을 새로 설치하고, 작업중인 프로젝트를 로드했다.


결과적으로 안드로이드 스튜디오 4.0 에서는 VerifyError 가 발생하지 않았다.
버전을 29로 올리지도 않았다.
그냥 내 프로젝트는 여전히 버전 28이고, aar 은 버전 29였다.


추측이지만 해결된 이유는 aar 모듈이 안드로이드 스튜디오 4에서 만들어진 모듈이라서, 그걸 사용하는 프로젝트 역시 안드로이드 스튜디오 4에서 빌드해야 되는 것 같다.​