기존 앱에서 이미 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 버전에서 아래와 같은 변경 이력이 포함되어 있습니다.
GoogleApiClient
, PendingResult
, 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 버전을 지원해달라고 요청하거나요..
저와 비슷한 오류를 겪은 분에게 도움이 되었으면 합니다. 좀 더 나은 방법을 알고 계신 분은 댓글 부탁드려요.
'안드로이드' 카테고리의 다른 글
롤리팝 메모리 누수 버그 (1) | 2015.11.07 |
---|---|
안드로이드 앱 강제 종료 재현하기 (0) | 2015.11.07 |
APK 확장 파일 사용하기 - APK Expansion Files (1) | 2014.07.21 |
안드로이드에서 구글 드라이브와 연동시 발생하는 오류 해결 (0) | 2014.03.07 |
한글이 포함된 javadoc을 생성할 때 발생하는 오류 (0) | 2014.02.27 |
HTTPS 통신하기 (0) | 2014.01.25 |
버튼 패딩 제거하기 (0) | 2014.01.08 |
구글 플러그인 설치하기 (Google Plugin for Eclipse) (0) | 2014.01.07 |
[안드로이드] ImageCache 사용 중, 이미지의 크기가 변하는 현상 (0) | 2013.12.13 |
[안드로이드] RenderScript 빌드 오류 문제 해결 (0) | 2013.11.12 |