2016-05-20 11 views
24

Moja aplikacja na Androida zaczęła się dzisiaj zawieszać podczas generowania tokena dla Google Cloud Messaging (GCM). Dzieje się tak na wielu urządzeniach i wersji Androida. Myślę, że może mieć to związek z nowymi funkcjami Firebase ogłoszonymi przez Google w Google IO.Awaria generowania tokenu Google Cloud Messaging (GCM) po aktualizacji usług Google Play związanej z Firebase

Nie pracowałem przy kodzie związanym z GCM, kiedy to się zaczęło, więc było nieoczekiwanie. Jeśli odinstaluję aktualizacje usług Google Play z ustawień systemu Android, aplikacja nie będzie już działać. Natychmiast po ponownym zainstalowaniu najnowszego aplikacja ponownie się zawiesza.

FATAL EXCEPTION: IntentService[MyGCMRegistrationIntentService] 
Process: <my process>, PID: 26036 
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 <package>.MyGCMRegistrationIntentService.onHandleIntent(MyGCMRegistrationIntentService.java:<line number>); 
    at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.os.HandlerThread.run(HandlerThread.java:61) 

Oto moja usługa rejestracji:

public class MyGCMRegistrationIntentService extends IntentService 
{ 
    public static final String KEY_GCM_TOKEN = "gcm_token"; 

    public static final String KEY_GCM_INSTANCE_ID = "gcm_instance_id"; 

    private static final String NAME = MyGCMRegistrationIntentService.class.getSimpleName(); 

    public MyGCMRegistrationIntentService() 
    { 
     super(NAME); 
    } 

    @Override 
    protected void onHandleIntent(final Intent intent) 
    { 
     try 
     { 
      final InstanceID instanceId = InstanceID.getInstance(this); 
      final String token = instanceId.getToken(getGCMSenderID(), GoogleCloudMessaging.INSTANCE_ID_SCOPE, null); 
      final String instanceIdId = instanceId.getId(); 
      sendTokenToMyServer(token, instanceIdId); 
     } 
     catch (final IOException e) 
     { 
      Timber.e(e, "Error getting GCM token."); 
     } 
    } 
} 

najwyższego poziomu Gradle zbudować plik:

buildscript { 
    repositories { 
     jcenter() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:2.1.0' 
     classpath 'de.felixschulze.gradle:gradle-hockeyapp-plugin:3.3' 
     classpath 'com.android.tools.build:gradle:2.1.0' 
     classpath 'com.google.gms:google-services:2.1.0' 
     classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3' 
    } 
} 

allprojects { 
    repositories { 
     jcenter() 
     maven { url 'https://jitpack.io' } 
    } 
} 

App poziomie Gradle budować zależności czynienia z Google:

dependencies { 
    compile 'com.android.support:appcompat-v7:23.3.0' 
    compile 'com.android.support:multidex:1.0.1' 
    compile 'com.android.support:design:23.3.0' 
    compile 'com.android.support:recyclerview-v7:23.3.0' 
    compile 'com.android.support:support-annotations:23.3.0' 
    compile 'com.android.support:support-v4:23.3.0' 
    compile 'com.android.support:support-v13:23.3.0' 
    compile 'com.google.android.gms:play-services-analytics:8.4.0' 
    compile 'com.google.android.gms:play-services-gcm:8.4.0' 

    ...(and then the rest of my dependecies) 
} 

Zależności bibliotek czynienia z Google (wiem, że to wszystko jest brudny i niektóre rzeczy są zbędne, przepraszam):

dependencies { 
    compile 'com.android.support:appcompat-v7:23.3.0' 
    compile 'com.android.support:cardview-v7:23.3.0' 
    compile 'com.android.support:recyclerview-v7:23.3.0' 
    compile 'com.android.support:support-v4:23.3.0' 
    compile 'com.android.support:support-v13:23.3.0' 
    compile 'com.google.android.gms:play-services-location:8.4.0' 
    compile 'com.google.android.gms:play-services-analytics:8.4.0' 
    compile 'com.google.android.gms:play-services-gcm:8.4.0' 

    ...(and then the rest of my dependecies) 
} 

Pomyślałam modernizacji wersje pomoże. Oto, co zaktualizowałem:

com.google.gms:google-services:2.1.0 -> com.google.gms:google-services:3.0.0 
com.google.android.gms:play-services-XXX:8.4.0' -> com.google.android.gms:play-services-XXX:9.0.0 

Aplikacja nadal się zawiesza, ale w inny sposób. Najpierw loguje się, ale nie ulega awarii.

Firebase API initialization failure. 
java.lang.reflect.InvocationTargetException 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.google.firebase.FirebaseApp.zza(Unknown Source) 
    at com.google.firebase.FirebaseApp.initializeApp(Unknown Source) 
    at com.google.firebase.FirebaseApp.initializeApp(Unknown Source) 
    at com.google.firebase.FirebaseApp.zzbu(Unknown Source) 
    at com.google.firebase.provider.FirebaseInitProvider.onCreate(Unknown Source) 
    at android.content.ContentProvider.attachInfo(ContentProvider.java:1696) 
    at android.content.ContentProvider.attachInfo(ContentProvider.java:1671) 
    at com.google.firebase.provider.FirebaseInitProvider.attachInfo(Unknown Source) 
    at android.app.ActivityThread.installProvider(ActivityThread.java:4999) 
    at android.app.ActivityThread.installContentProviders(ActivityThread.java:4594) 
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4534) 
    at android.app.ActivityThread.access$1500(ActivityThread.java:151) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5254) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
    Caused by: 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.firebase.iid.zzg.zzeC(Unknown Source) 
    at com.google.firebase.iid.zzg.<init>(Unknown Source) 
    at com.google.firebase.iid.zzg.<init>(Unknown Source) 
    at com.google.firebase.iid.zzd.zzb(Unknown Source) 
    at com.google.firebase.iid.FirebaseInstanceId.getInstance(Unknown Source) 
    at java.lang.reflect.Method.invoke(Native Method)  
    at java.lang.reflect.Method.invoke(Method.java:372)  
    at com.google.firebase.FirebaseApp.zza(Unknown Source)  
    at com.google.firebase.FirebaseApp.initializeApp(Unknown Source)  
    at com.google.firebase.FirebaseApp.initializeApp(Unknown Source)  
    at com.google.firebase.FirebaseApp.zzbu(Unknown Source)  
    at com.google.firebase.provider.FirebaseInitProvider.onCreate(Unknown Source)  
    at android.content.ContentProvider.attachInfo(ContentProvider.java:1696)  
    at android.content.ContentProvider.attachInfo(ContentProvider.java:1671)  
    at com.google.firebase.provider.FirebaseInitProvider.attachInfo(Unknown Source)  
    at android.app.ActivityThread.installProvider(ActivityThread.java:4999)  
    at android.app.ActivityThread.installContentProviders(ActivityThread.java:4594)  
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4534)  
    at android.app.ActivityThread.access$1500(ActivityThread.java:151)  
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364)  
    at android.os.Handler.dispatchMessage(Handler.java:102)  
    at android.os.Looper.loop(Looper.java:135)  
    at android.app.ActivityThread.main(ActivityThread.java:5254)  
    at java.lang.reflect.Method.invoke(Native Method)  
    at java.lang.reflect.Method.invoke(Method.java:372)  
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)  
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)  

Po poruszać się po aplikacji, które wywołają rejestracji GCM, otrzymuję ten sam stos jak poprzednio wzdłuż tej linii przed upaść:

E/FA: Task exception on worker thread: 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): com.google.android.gms.measurement.internal.zzt.zzEd(Unknown Source) 
+0

Sprawdź w [wątku] (http://stackoverflow.com/questions/37312340/incompatibleclasschangeerror-after-updating-to-android-build-tools-25-1-6-gcm). Zalecają zaktualizowanie usług odtwarzania w celu kompilacji "com.google.android.gms: play-services: 9.0.0" i usług google do ścieżki klasy "com.google.gms: google-services: 3.0.0 ' – noogui

+0

[przejdź do moja odpowiedź, aby rozwiązać problem] (http://stackoverflow.com/a/38762136/6676886) To działa dla mnie z GCM 2016 – skygirl

Odpowiedz

29

Problem polega na tym, że istnieją zależności zależne od starszych wersji biblioteki pomocy.Sprawdź ten wątek się:

Android UrbanAirship Crash in takeOff

Rozwiązanie to może pomóc (z gwintem):

configurations.all { 
    resolutionStrategy { 
     force 'com.android.support:design:23.4.0' 
     force 'com.android.support:support-v4:23.4.0' 
     force 'com.android.support:appcompat-v7:23.4.0' 
    } 
} 
+2

To było rozwiązanie! Dzięki. – Stephen

+0

Pomaga mi też –

+0

To nie działa, dodałem GCM do mojego projektu, po tym otrzymuję ten błąd w API 18 i poniżej, jak zrobić to wsparcie. – YLS

4

aktualizacja może 27:

Właśnie wydaliśmy aktualizację (version 9.0.1), aby naprawić niezgodność wymienioną w mojej pierwszej edycji.
Zaktualizuj swoje zależności i daj nam znać, jeśli problem nadal występuje.

Dzięki!


oryginalna odpowiedź może 20:

Wersja 9.0.0 z usługi Google Play SDK zawiera niezgodności z 24.x wersji biblioteki wsparcie (wersja wydana na wsparcie Android-N)

Proszę sprawdzić, czy używasz:

dependencies { 
    compile 'com.android.support:appcompat-v7:23.3.0' 
} 

i nie com.android.support:appcompat-v7:24.*

+0

Używa kompilacji 'com.android.support:appcompat-v7:23.3.0' – EpicPandaForce

6

Spróbuj to będzie rozwiązać

configurations.all { 
resolutionStrategy { 
    force 'com.android.support:design:23.4.0' 
    force 'com.android.support:support-v4:23.4.0' 
    force 'com.android.support:appcompat-v7:23.4.0' 
} 

}

jeśli ciebie nadal masz problem, możesz go rozwiązać jako,

Updated zależności play-usług w build.gradle

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

Jeśli jakikolwiek konflikt wersji naprawić dodając ten w build.gradle (Gradle projektu)

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

Wystarczy upate biblioteki GCM, będzie ona rozwiązać Twój problem.

compile "com.google.android.gms:play-services-gcm:9.2.0" 
Powiązane problemy