/ JACOCO, ANDROID

앱 실행시 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

라이브러리 모듈의 빌드스크립트에서 testCoverageEnabledtrue로 설정되어 있을 경우 크래시가 발생한다는 내용입니다.

제가 테스트에 사용한 앱도 여러 라이브러리 모듈로 구성되어 있었는데, 각 모듈별로 testCoverageEnabledtrue로 설정되어 있었습니다. 이들을 모두 false로 바꾸니 문제는 거짓말 같이 사라졌습니다.

즉, 라이브러리 모듈에 한해 아래와 같이 수정하면 문제가 해결됩니다.

[build.gradle]

     buildTypes {
         debug {
-            testCoverageEnabled true
+            testCoverageEnabled false
         }

         release {

하지만, 이는 임시 방편일 뿐 정확한 해결 방법이라 보기 어렵습니다.

ASTL(Android Support Test Library)와 같이 Instrumentation test를 수행할 경우, 위 옵션을 활성화 해야 커버리지 작성에 필요한 파일을 생성합니다.

하지만, 위와 같이 수정하면 테스트 이후 커버리지 리포트 작성에 필요한 파일을 생성하지 않기 때문에 리포트를 작성할 수 없습니다.

현재 이슈 트래커 상에선 담당자 할당은 된 상태입니다. 어느 부분에서 문제가 발생한 것인진 모르겠지만, 꽤 영향을 미칠만한 문제인 만큼 빠른 시일 내에 수정되었으면 좋겠습니다.

kunny

커니

안드로이드와 오픈소스, 코틀린(Kotlin)에 관심이 많습니다. 한국 GDG 안드로이드 운영자 및 GDE 안드로이드로 활동했으며, 현재 구글에서 애드몹 기술 지원을 담당하고 있습니다.

Read More