[android] Android 빌드 도구 25.1.6 GCM / FCM으로 업데이트 한 후 IncompatibleClassChangeError

Android SDK Tools 25.1.6 및 Android Support Repository 32.0.0 (오늘 아침)으로 업데이트했기 때문에 다음 오류가 발생했습니다. 코드에서 아무것도 변경하지 않았으며 여전히 동료 컴퓨터에서 작동하고 있습니다 (Android SDK 도구 25.1.1 + Android 지원 저장소 30.0.0).

java.lang.IncompatibleClassChangeError: The method
     'java.io.File android.support.v4.content.ContextCompat.getNoBackupFilesDir(android.content.Context)'
     was expected to be of type virtual but instead was found to be of type direct
     (declaration of 'java.lang.reflect.ArtMethod' appears in /system/framework/core-libart.jar)

     at com.google.android.gms.iid.zzd.zzeb(Unknown Source)
     at com.google.android.gms.iid.zzd.<init>(Unknown Source)
     at com.google.android.gms.iid.zzd.<init>(Unknown Source)
     at com.google.android.gms.iid.InstanceID.zza(Unknown Source)
     at com.google.android.gms.iid.InstanceID.getInstance(Unknown Source)
     at com.xxxxxxx.utils.RegistrationIntentService.onHandleIntent(RegistrationIntentService.java:55)
     at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
     at android.os.Handler.dispatchMessage(Handler.java:102)
     at android.os.Looper.loop(Looper.java:145)
     at android.os.HandlerThread.run(HandlerThread.java:61)

충돌하는 코드는 다음과 같습니다.

InstanceID instanceID = InstanceID.getInstance(this); // <-- crash here
String instanceIDToken = instanceID.getToken(getString(R.string.google_app_id),
GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

Google 클라우드 메시징에서 토큰을 얻으려고 할 때입니다.

분할 된 플레이 서비스를 사용하여 Gradle에서 GCM을 가져옵니다.

 compile 'com.google.android.gms:play-services-analytics:9.0.0'
 compile 'com.google.android.gms:play-services-maps:9.0.0'
 compile 'com.google.android.gms:play-services-location:9.0.0'
 compile 'com.google.android.gms:play-services-gcm:9.0.0'
 compile 'com.google.android.gms:play-services-base:9.0.0'

편집
내 생각 엔 내가 중포 기지 클라우드 메시지로 마이그레이션해야하므로 사용하지 GCM은 문제를 해결

EDIT2
내 기기가 Google Play 서비스 9.0을 수신합니다 (어제 8.4.x). 이제 더 이상 충돌하지 않지만 모듈 설명자에 대해 불평합니다.

 Failed to load module descriptor class: Didn't find class "com.google.android.gms.dynamite.descriptors.com.google.firebase.auth.ModuleDescriptor"
 Firebase API initialization failure.

누구든지 비슷한 오류가 있으며 어떻게 수정합니까?

고정
@stegranet에 특별한 감사를.
./gradlew -q app:dependencies --configuration compileSDK 24.x를 포함하는 종속성을 식별하는 데 도움이됩니다.

주요 문제는 일부 라이브러리 +가 버전 대신 서명을 사용하여 최신 지원 라이브러리를 가져 오는 것입니다. 이로 인해 사용 가능한 최신 버전이 포함되어 문제가 발생합니다.

따라서 +로그인 종속성을 피 하십시오.)



답변

이 오류를 해결하기 위해 gradle 종속성 트리를 사용했습니다.

다음 gradle -q app:dependencies --configuration compile
과 같은 항목에 대한 출력을 실행 하고 확인하십시오.

+--- com.mcxiaoke.viewpagerindicator:library:2.4.1
|    \--- com.android.support:support-v4:+ -> 24.0.0-beta1 (*)

으로 디에고 오르기는 이 버전 (> = 24) 너무 높은 말했다. 따라서 다음 build.gradle과 같이 종속성을 업데이트하십시오.

compile('com.mcxiaoke.viewpagerindicator:library:2.4.1') {
    exclude module: 'support-v4';
}
compile 'com.android.support:support-v4:23.4.0'


답변

업데이트 5 월 27 일 :

version 9.0.1첫 번째 편집에서 언급 한 비 호환성을 수정하기 위해 방금 업데이트 ( )를 출시했습니다 .
종속성을 업데이트하고 이것이 여전히 문제인지 알려주십시오.

감사!


원래 답변 5 월 20 일 :

발생한 문제는
play-services / firebase sdk v9.0.0
com.android.support:appcompat-v7 >= 24
(android-N sdk로 출시 된 버전) 간의 비 호환성 때문입니다.

지원 라이브러리의 이전 버전을 대상으로하여 문제를 해결할 수 있어야합니다. 처럼:

compile 'com.android.support:appcompat-v7:23.4.0'


답변

내 작업은 다음과 같습니다.

앱 수준 gradle

dependencies {
 compile 'com.android.support:appcompat-v7:23.4.0'
 compile 'com.android.support:design:23.4.0'
 compile 'com.google.android.gms:play-services:9.0.0'
}

루트 수준 gradle

dependencies {
    classpath 'com.google.gms:google-services:3.0.0'
}


답변

플레이 서비스 종속성을 업데이트했습니다. build.gradle

dependencies {
    compile 'com.google.android.gms:play-services:9.0.0'
}

google-services 플러그인의 버전을 업데이트하여 버전 충돌을 해결하려면 build.gradle프로젝트의 루트 폴더 아래 에있는 google-services를 업데이트해야했습니다.

dependencies {
    classpath 'com.google.gms:google-services:3.0.0'
}

여기 에서 google-services의 최신 업데이트를받을 수 있습니다 .

예외를 피하지는 않지만 내 쪽에서 더 이상 응용 프로그램을 충돌시키지 않습니다.

최신 정보

베타 채널에서 Android 스튜디오를 업데이트하여 충돌을 피할 수있었습니다. 그런 다음 platform/build-tools내부 SDK를 업데이트하십시오 .

여기에 이미지 설명 입력


답변

최신 Google Play 서비스 버전으로 업데이트하면 문제가 해결되었습니다.

플러그인 적용 : 하단에 ‘com.google.gms.google-services’…

dependencies {
    compile 'com.google.android.gms:play-services:9.0.0'
}

https://developers.google.com/android/guides/setup#add_google_play_services_to_your_project


답변

페이스 북이 sdk를 업데이트했기 때문에 나에게 일어났습니다.

compile 'com.facebook.android:facebook-android-sdk:4.+'

그것을 대체

compile 'com.facebook.android:facebook-android-sdk:4.15.0'

내 문제를 해결했습니다.

참고 : https://developers.facebook.com/docs/android/change-log-4.x


답변

모든 플레이 서비스의 패키지를 포함함으로써

dependencies {
  compile 'com.google.android.gms:play-services:9.0.0'
}

오류를 억제하지만 최종 결과는 GCM 토큰 검색이 작동하지 않거나 GCM의 인스턴스를 가져올 수 없다는 것입니다. 그래서 이것은 내 책에서 해결책이 아닙니다. 누가 무슨 일이 일어나고 있는지 아는 사람이 있으면 우리를 계몽하십시오.

편집하다:

GCM을 firebase로 교체하고, android studio를 2.1에서 2.2로 업데이트하여 firebase 분석의 즉각적인 실행 문제를 해결하고, 빌드 도구를 24-rc4로, 플랫폼 도구를 24-rc3으로 업데이트하고, 지원 라이브러리의 버전을 23.4.0으로 유지했습니다. 이제 모든 것이 잘 작동하는 것 같습니다.