Mon Android a commencé à planter aujourd'hui lors de la génération d'un jeton pour Google Cloud Messaging (GCM). Cela se produit sur plusieurs appareils et versions d'Android. Je pense que cela peut être lié aux nouvelles fonctionnalités de Firebase annoncées par Google hier à Google IO.
Je ne travaillais pas sur le code lié à GCM lorsque cela a commencé, donc c'était inattendu. Si je désinstalle les mises à jour des services Google Play de Android, l'application ne se bloque plus. Dès que je réinstalle la dernière version, l'application recommence à planter à chaque fois.
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)
Voici mon service d'inscription:
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.");
}
}
}
Fichier de construction Gradle de niveau supérieur:
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' }
}
}
Dépendances de construction Gradle au niveau de l'application traitant de 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)
}
Dépendances de bibliothèque traitant de Google (je sais que tout est compliqué et que certaines choses sont redondantes, désolé):
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)
}
Je pensais que peut-être mettre à jour les versions aiderait. Voici ce que j'ai amélioré:
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
L'application se bloque toujours, mais d'une manière différente. Il enregistre d'abord les éléments suivants, mais ne se bloque pas.
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)
Après avoir bougé dans l'application qui déclenche l'enregistrement GCM, j'obtiens la même pile qu'avant avec cette ligne avant de planter:
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)
Le problème est donc que vous avez des dépendances qui incluent les anciennes versions de la bibliothèque de support. Vérifiez ce fil:
Android UrbanAirship Crash dans takeOff
Cela pourrait aider (à partir du fil):
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'
}
}
Essayez cela, cela résoudra
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'
}
}
si vous avez toujours un problème, vous pouvez le résoudre comme,
Mise à jour des dépendances play-services dans build.gradle
dependencies {
compile 'com.google.Android.gms:play-services:9.0.0'}
Si un conflit de version le résout en l'ajoutant dans build.gradle (projet gradle)
dependencies {
classpath 'com.google.gms:google-services:3.0.0'}
mise à jour le 27 mai:
nous venons de publier une mise à jour (version 9.0.1
) pour corriger l'incompatibilité que j'ai mentionnée lors de mon premier montage.
Veuillez mettre à jour vos dépendances et faites-nous savoir si ce problème persiste.
Merci!
réponse originale le 20 mai:
La version 9.0.0 des services Google Play sdk comprend une incompatibilité avec la bibliothèque de support version 24.x (la version publiée pour prendre en charge Android-N)
Veuillez vérifier que vous utilisez:
dependencies {
compile 'com.Android.support:appcompat-v7:23.3.0'
}
et pas com.Android.support:appcompat-v7:24.*
Si vous avez déjà mis à jour Android Support Repository, annulez-le en remplaçant le dossier m2repository dans sdk chemin.
Téléchargez d'abord l'ancien m2repository :
https://dl-ssl.google.com/Android/repository/Android_m2repository_r31.Zip
Mettez à jour votre bibliothèque GCM, cela résoudra votre problème.
compile "com.google.Android.gms:play-services-gcm:9.2.0"