앱 실행시 jacoco agent에서 NoClassDefFoundError가 발생한다면?
Android N Preview 테스트를 위해 빌드 설정을 마친 후 앱을 실행했으나, 아래와 같은 오류가 발생하며 앱이 실행되지 않았습니다.
java.lang.NoClassDefFoundError: Failed resolution of: Lorg/jacoco/agent/rt/internal_773e439/Offline;
at com.lezhin.auth.rxbinding.accounts.RxAccountManager.$jacocoInit(RxAccountManager.java:0)
at com.lezhin.auth.rxbinding.accounts.RxAccountManager.getsData(RxAccountManager.java:0)
at com.lezhin.comics.LezhinComics.onInitializeCore(LezhinComics.java:45)
at com.lezhin.core.LezhinApplication.onCreate(LezhinApplication.java:10)
at com.android.tools.fd.runtime.BootstrapApplication.onCreate(BootstrapApplication.java:277)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1013)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5139)
at android.app.ActivityThread.-wrap2(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1466)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5849)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:763)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:653)
Caused by: java.lang.ClassNotFoundException: Didn't find class "org.jacoco.agent.rt.internal_773e439.Offline"
테스트 당시 사용했던 환경은 다음과 같습니다.
Gradle plugin version | 'com.android.tools.build:gradle:2.1.0-alpha4' |
Build Tools version | 24.0.0 rc1 |
minSdkVersion | 'N' |
compileSdkVersion | 'android-N' |
targetSdkVersion | 'N' |
Support Library version | 24.0.0-alpha1 |
프레임워크 내부가 아닌 제가 작성한 부분에서 에러가 나다보니, 해당 부분이 안드로이드 N과 큰 호환성 문제가 있는 것은 아닌가 하는 걱정이 앞섰습니다. (생각만 해도 끔직합니다)
구글링을 해 보아도 위와 관련된 문제의 해결책이 나오지 않아 여러 가정을 바탕으로 문제 해결을 시도해 보았으나, 결과는 동일했습니다. (Clean & Rebuild, 빌드환경 재설정, Multidex 제거 등)
해결 방법 (Workaround)
검색을 계속 하던 중, 최근에 등록된 이슈를 통해 동일한 유형의 오류를 겪고 있는 사례를 발견했습니다.
Setting ‘testCoverageEnabled true’ in library module crashes app on start-up Link
라이브러리 모듈의 빌드스크립트에서 testCoverageEnabled
가 true
로 설정되어 있을 경우 크래시가 발생한다는 내용입니다.
제가 테스트에 사용한 앱도 여러 라이브러리 모듈로 구성되어 있었는데, 각 모듈별로 testCoverageEnabled
가 true
로 설정되어 있었습니다. 이들을 모두 false
로 바꾸니 문제는 거짓말 같이 사라졌습니다.
즉, 라이브러리 모듈에 한해 아래와 같이 수정하면 문제가 해결됩니다.
[build.gradle]
buildTypes {
debug {
- testCoverageEnabled true
+ testCoverageEnabled false
}
release {
하지만, 이는 임시 방편일 뿐 정확한 해결 방법이라 보기 어렵습니다.
ASTL(Android Support Test Library)와 같이 Instrumentation test를 수행할 경우, 위 옵션을 활성화 해야 커버리지 작성에 필요한 파일을 생성합니다.
하지만, 위와 같이 수정하면 테스트 이후 커버리지 리포트 작성에 필요한 파일을 생성하지 않기 때문에 리포트를 작성할 수 없습니다.
현재 이슈 트래커 상에선 담당자 할당은 된 상태입니다. 어느 부분에서 문제가 발생한 것인진 모르겠지만, 꽤 영향을 미칠만한 문제인 만큼 빠른 시일 내에 수정되었으면 좋겠습니다.