본문 바로가기
안드로이드

GooglePlayService를 사용하는데 IncompatibleClassChangeError 오류는 왜 발생 왜하는가?

by 호군 2016. 2. 22.
반응형


기존 앱에서 이미 GooglePlayService를 사용하고 있었고, Moloco라는 퍼포먼스 마케팅을 위한 라이브러리를 추가하는 중이였습니다.

하지만 Moloco 라이브러리를 추가한 후 앱을 실행하자마자 Moloco를 초기화하는 코드에서 아래와 같은 오류가 발생했습니다.


Exception

E/AndroidRuntime: FATAL EXCEPTION: main
          Process: com.dhna.sampleapp, PID: 20003
          java.lang.IncompatibleClassChangeError: 
              The method 'boolean com.google.android.gms.common.api.GoogleApiClient.isConnected()' 
              was expected to be of type interface but instead was found to be of type virtual 
              (declaration of 'com.moloco.van.context.MolocoContext' appears in /data/app/com.dhna.sampleapp-1/base.apk)
           at com.moloco.van.context.MolocoContext.init(MolocoContext.java:98)
           at com.moloco.van.context.MolocoEntryPoint.init(MolocoEntryPoint.java:67)
           at com.dhna.sampleapp.analytics.moloco.Moloco.init(Moloco.java:19)
           at com.dhna.sampleapp.base.BDApplication.initAnalytics(AppApplication.java:156)
           at com.dhna.sampleapp.base.BDApplication.init(AppApplication.java:133)
           at com.dhna.sampleapp.base.BDApplication.onCreate(AppApplication.java:123)
           at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1036)
           at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6316)
           at android.app.ActivityThread.access$1800(ActivityThread.java:221)
           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1860)
           at android.os.Handler.dispatchMessage(Handler.java:102)
           at android.os.Looper.loop(Looper.java:158)
           at android.app.ActivityThread.main(ActivityThread.java:7224)
           at java.lang.reflect.Method.invoke(Native Method)
           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)




IncompatibleClassChangeError


같은 클래스에서 양립할 수 없는 변경사항 있을 때 예외가 발생한다.

'현재 실행중인 메소드가 의존하는 클래스의 정의가 실행 이후에 변경되어 있다'는 것을 나타냅니다.




GooglePlayService 변경 이력


GooglePlayService v8.1 버전에서 아래와 같은 변경 이력이 포함되어 있습니다.

GoogleApiClientPendingResult, and OptionalPendingResult are now abstract classes instead of interfaces. The signature of PendingResult.setResultCallback has changed from setResultCallback(ResultCallback<R> callback) tosetResultCallback(ResultCallback<? super R> callback). An equivalent change has been made to setResultCallback that accepts a timeout parameter. If you were directly implementing these interfaces before, you’ll need to extend the abstract classes instead. If you used these classes for testing purposes, we recommend using the provided utility classPendingResults which can provide a Result that is either canceled or immediately available.


GooglePlayService v8.1 버전부터는 GoogleApiClient, PendingResult, OptionalPendingResult Interface가 Abstract Class로 타입이 변경된 것을 알 수 있습니다.




발생하는 이유


현재 앱에서는 GooglePlayService v8.3.0 버전을 사용하고 있었습니다. 그러나 추가된 Moloco 라이브러리에서는 GooglePlayService v7.5.0 버전을 사용하고 있습니다.

Exception 로그를 보면 'isConnected() 메소드는 interface 타입을 기대했지만 virtual 타입이다'라고 합니다.

즉, GooglePlayService v8.1.0 버전을 포함한 이후 버전에서 GoogleApiClient가 Interface에서 Abstract Class로 변경되었기 때문에 발생한 버그였습니다.




해결방법


아주 좋은 해결책은 찾을 수 없었지만 해결할 방법은 있습니다.

현재 사용하고 있는 GooglePlayService v8.3.0 버전을 GooglePlayService v7.8.0 버전 이하로 낮추면 문제는 해결됩니다.

또는 Moloco 측에게 최신 GooglePlayService 버전을 지원해달라고 요청하거나요..




저와 비슷한 오류를 겪은 분에게 도움이 되었으면 합니다. 좀 더 나은 방법을 알고 계신 분은 댓글 부탁드려요.




반응형