notificaciones - Bloqueo de la generación de tokens de Google Cloud Messaging(GCM) de Android después de la actualización de los Servicios de Google Play relacionados con Firebase
notificaciones push android google cloud messaging(gcm) (5)
Mi aplicación para Android comenzó a fallar hoy al generar un token para Google Cloud Messaging (GCM). Esto sucede en múltiples dispositivos y versiones de Android. Creo que puede tener que ver con las nuevas características de Firebase anunciadas por Google ayer en Google IO.
No estaba trabajando con el código relacionado con GCM cuando esto comenzó a suceder, por lo que fue inesperado. Si desinstalo las actualizaciones de los Servicios de Google Play desde la configuración del sistema de Android, la aplicación ya no se bloquea. Tan pronto como vuelvo a instalar la última, la aplicación comienza a fallar de nuevo cada vez.
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)
Aquí está mi servicio de registro:
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.");
}
}
}
Archivo de compilación Gradle de nivel superior:
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'' }
}
}
Dependencias de compilación de Gradle a nivel de aplicación que tratan con 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)
}
Dependencias de la biblioteca que se ocupan de Google (sé que todo esto es complicado y algunas cosas son redundantes, lo siento):
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)
}
Pensé que quizás mejorar las versiones ayudaría. Esto es lo que actualicé:
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
La aplicación todavía se cuelga, pero de una manera diferente. Primero registra lo siguiente, pero no falla.
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)
Después de moverme en la aplicación que desencadena el registro GCM, obtengo la misma pila que antes junto con esta línea antes de colgar:
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)
Entonces, el problema es que tiene dependencias que incluyen versiones antiguas de la biblioteca de soporte. Verifique este hilo:
Android UrbanAirship Crash en takeOff
Hacer esto podría ayudar (a partir del hilo):
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''
}
}
Intenta esto, lo resolverá
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 todavía tienes un problema, puedes resolverlo como,
Se actualizaron las dependencias de servicios de juego en build.gradle
dependencies {
compile ''com.google.android.gms:play-services:9.0.0''}
Si algún conflicto de versión lo soluciona agregando esto en build.gradle (gradle del proyecto)
dependencies {
classpath ''com.google.gms:google-services:3.0.0''}
Si ya ha actualizado el repositorio de soporte de Android, revíselo reemplazando la carpeta m2repository en la ruta sdk .
Primera descarga Repositorio m2 anterior :
https://dl-ssl.google.com/android/repository/android_m2repository_r31.zip
Simplemente apague su biblioteca de GCM, solucionará su problema.
compile "com.google.android.gms:play-services-gcm:9.2.0"
actualización 27 de mayo:
acabamos de lanzar una actualización ( version 9.0.1
) para corregir la incompatibilidad que mencioné en mi primera edición.
Actualice sus dependencias y avísenos si esto sigue siendo un problema.
¡Gracias!
respuesta original 20 de mayo:
La versión 9.0.0 de los servicios de Google Play SDK incluye una incompatibilidad con la biblioteca de soporte versión 24.x (la versión lanzada para soportar Android-N)
Por favor, compruebe que está utilizando:
dependencies {
compile ''com.android.support:appcompat-v7:23.3.0''
}
y no com.android.support:appcompat-v7:24.*