IncompatibleClassChangeError después de actualizar a Android Build Tools 25.1.6 GCM / FCM

Desde que actualicé a Android SDK Tools 25.1.6 y Android Support Repository 32.0.0 (esta mañana), recibí el siguiente error, no cambié nada en mi código y todavía funciona en mi computadora colega (Android SDK Tools 25.1.1 + Android Support Repository 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.(Unknown Source) at com.google.android.gms.iid.zzd.(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) 

Aquí hay una pieza de código que se cuelga:

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

Es cuando bash obtener un token de Google Cloud Messaging.

Estoy importando GCM en Gradle con servicios de juego splited:

  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' 

EDITAR la desactivación de GCM solucionó el problema, así que supongo que debería migrar a Firebase Cloud Message

EDIT2 Mi dispositivo recibe Google Play Services 9.0 (ayer fue 8.4.x). Ahora ya no se cuelga, pero se queja del descriptor del módulo

  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. 

¿Alguien tiene un error similar y cómo solucionarlo?

FIJO especial gracias a @stegranet. ./gradlew -q app:dependencies --configuration compile ayuda a identificar qué dependencias incluyen SDK 24.x

El problema principal es que algunas bibliotecas importan la última biblioteca de soporte usando el signo + lugar de una versión. Esto causa el problema, al incluir la última versión disponible.

Así que evita + iniciar sesión en dependencias;)

Usé el árbol de dependencia de Gradle para resolver este error.

Simplemente ejecute la gradle -q app:dependencies --configuration compile y verifique la salida para entradas como esta:

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

Como Diego Giorgini dijo que esta versión es demasiado alta (> = 24). Así que actualice las dependencias en build.gradle como

 compile('com.mcxiaoke.viewpagerindicator:library:2.4.1') { exclude module: 'support-v4'; } compile 'com.android.support:support-v4:23.4.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:

El problema que está experimentando se debe a una incompatibilidad entre
play-services / firebase sdk v9.0.0 y com.android.support:appcompat-v7 >= 24
(la versión lanzada con android-N sdk)

Debería poder solucionarlo apuntando a una versión anterior de la biblioteca de soporte. Me gusta:

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

el mío trabajó con lo siguiente:

gradle de nivel de aplicación

 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' } 

nivel de raíz gradle

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

He actualizado las dependencias de servicios de juego en build.gradle

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

Para solucionar el conflicto de versión, ya sea actualizando la versión del complemento google-services, tuve que actualizar los servicios de google en build.gradle bajo la carpeta raíz del proyecto.

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

Puede obtener la última actualización de los servicios de google aquí .

Aunque no está evitando la excepción, pero no está bloqueando la aplicación más de mi lado.

Actualizar

Podría evitar el locking actualizando el estudio de Android desde Beta Channel. Luego actualice su platform/build-tools dentro de SDK.

enter image description here

La actualización a la última versión de los servicios de google play me solucionó el problema.

aplicar el complemento: ‘com.google.gms.google-services’ en la parte inferior …

 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

Me sucedió porque Facebook actualizó SDK y tuve

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

reemplazándolo

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

resuelto mi problema.

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

Incluyendo todos los paquetes de los servicios de juego

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

Suprime el error, pero el resultado final es que la recuperación del token de GCM no está funcionando ni podemos obtener una instancia del GCM. Entonces esta no es una solución en mis libros. Si alguien tiene alguna idea de lo que está pasando, por favor ilumínanos.

EDITAR:

Reemplacé GCM con firebase, actualicé Android Studio de 2.1 a 2.2 para solucionar el problema de ejecución inmediata con Firebase Analytics, actualicé las herramientas de comstackción a 24-rc4 y las herramientas de plataforma a 24-rc3, y mantuve mi versión de libs de soporte en 23.4.0. Todo parece estar funcionando bien ahora.

Tuve el mismo problema y se resolvió revertir desde Android Support Repository 32.0.0 a Android Support Repository 31.0.0.

Para la notificación push de Android con GCM 2016:

1) en Android SDK-> SDK Tools comprueba los servicios de Google Play

2) en gradle agregue dependencias solo una línea:

 compile 'com.google.android.gms:play-services-gcm:9.4.0' 

(no hay un classpath específico y funciona para mí)

3) debe crear 3 clases (GCMPushReceiverService, GCMRegistrationIntentService, GCMTokenRefreshListenerService)

4.1) código para GCMTokenRefreshListenerService:

 package com.myapp.android; /** * Created by skygirl on 02/08/2016. */ import android.content.Intent; import com.google.android.gms.iid.InstanceIDListenerService; public class GCMTokenRefreshListenerService extends InstanceIDListenerService { //If the token is changed registering the device again @Override public void onTokenRefresh() { Intent intent = new Intent(this, GCMRegistrationIntentService.class); startService(intent); } } 

4.2) Código para GCMRegistrationIntentService (cambie la entidad autorizada con su número de proyecto):

 package com.myapp.android; /** * Created by Skygirl on 02/08/2016. */ import android.app.IntentService; import android.content.Intent; import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import com.google.android.gms.gcm.GoogleCloudMessaging; import com.google.android.gms.iid.InstanceID; public class GCMRegistrationIntentService extends IntentService { //Constants for success and errors public static final String REGISTRATION_SUCCESS = "RegistrationSuccess"; public static final String REGISTRATION_ERROR = "RegistrationError"; //Class constructor public GCMRegistrationIntentService() { super(""); } @Override protected void onHandleIntent(Intent intent) { //Registering gcm to the device registerGCM(); } private void registerGCM() { //Registration complete intent initially null Intent registrationComplete = null; //Register token is also null //we will get the token on successfull registration String token = null; try { //Creating an instanceid InstanceID instanceID = InstanceID.getInstance(this); String authorizedEntity = "XXXXXXXXXX"; // your project number //Getting the token from the instance id token = instanceID.getToken(authorizedEntity, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null); //Displaying the token in the log so that we can copy it to send push notification //You can also extend the app by storing the token in to your server Log.w("GCMRegIntentService", "token:" + token); //on registration complete creating intent with success registrationComplete = new Intent(REGISTRATION_SUCCESS); //Putting the token to the intent registrationComplete.putExtra("token", token); } catch (Exception e) { //If any error occurred Log.w("GCMRegIntentService", "Registration error"); registrationComplete = new Intent(REGISTRATION_ERROR); } //Sending the broadcast that registration is completed LocalBroadcastManager.getInstance(this).sendBroadcast(registrationComplete); } } 

4.3) Código para GCMPushReceiverService:

 package com.myapp.android; /** * Created by Skygirl on 02/08/2016. */ import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.media.RingtoneManager; import android.os.Bundle; import android.support.v4.app.NotificationCompat; import com.google.android.gms.gcm.GcmListenerService; //Class is extending GcmListenerService public class GCMPushReceiverService extends GcmListenerService { //This method will be called on every new message received @Override public void onMessageReceived(String from, Bundle data) { //Getting the message from the bundle String message = data.getString("message"); //Displaying a notiffication with the message sendNotification(message); } //This method is generating a notification and displaying the notification private void sendNotification(String message) { Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); int requestCode = 0; PendingIntent pendingIntent = PendingIntent.getActivity(this, requestCode, intent, PendingIntent.FLAG_ONE_SHOT); NotificationCompat.Builder noBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.your_logo) .setContentTitle("Your Amazing Title") .setContentText(message) .setPriority(Notification.PRIORITY_MAX) .setContentIntent(pendingIntent); noBuilder.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)); NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(0, noBuilder.build()); //0 = ID of notification } } 

5) No te olvides de cambiar el nombre del paquete

6) En su actividad principal, pegue este código:

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Setup view setContentView(R.layout.main); mRegistrationBroadcastReceiver = new BroadcastReceiver() { //When the broadcast received //We are sending the broadcast from GCMRegistrationIntentService public void onReceive(Context context, Intent intent) { //If the broadcast has received with success //that means device is registered successfully if(intent.getAction().equals(GCMRegistrationIntentService.REGISTRATION_SUCCESS)){ //Getting the registration token from the intent String token = intent.getStringExtra("token"); //Displaying the token as toast Toast.makeText(getApplicationContext(), "Registration token:" + token, Toast.LENGTH_LONG).show(); //if the intent is not with success then displaying error messages } else if(intent.getAction().equals(GCMRegistrationIntentService.REGISTRATION_ERROR)){ Toast.makeText(getApplicationContext(), "GCM registration error!", Toast.LENGTH_LONG).show(); } else { Toast.makeText(getApplicationContext(), "Error occurred", Toast.LENGTH_LONG).show(); } } }; //Checking play service is available or not int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext()); //if play service is not available if(ConnectionResult.SUCCESS != resultCode) { //If play service is supported but not installed if(GooglePlayServicesUtil.isUserRecoverableError(resultCode)) { //Displaying message that play service is not installed Toast.makeText(getApplicationContext(), "Google Play Service is not install/enabled in this device!", Toast.LENGTH_LONG).show(); GooglePlayServicesUtil.showErrorNotification(resultCode, getApplicationContext()); //If play service is not supported //Displaying an error message } else { Toast.makeText(getApplicationContext(), "This device does not support for Google Play Service!", Toast.LENGTH_LONG).show(); } //If play service is available } else { //Starting intent to register device Intent itent = new Intent(this, GCMRegistrationIntentService.class); startService(itent); } } //Unregistering receiver on activity paused @Override public void onPause() { super.onPause(); Log.w("MainActivity", "onPause"); LocalBroadcastManager.getInstance(this).unregisterReceiver(mRegistrationBroadcastReceiver); } @Override public void onResume() { super.onResume(); Log.w("MainActivity", "onResume"); LocalBroadcastManager.getInstance(this).registerReceiver(mRegistrationBroadcastReceiver, new IntentFilter(GCMRegistrationIntentService.REGISTRATION_SUCCESS)); LocalBroadcastManager.getInstance(this).registerReceiver(mRegistrationBroadcastReceiver, new IntentFilter(GCMRegistrationIntentService.REGISTRATION_ERROR)); } 

7) En su AndroidManifest.xml agregue las siguientes líneas:

  

8) en su consola logcat copie su token y pegue en este sitio agregue su número de proyecto, su token y un mensaje. Funciona bien para mí 🙂

Después de un día completo de esto, puedo confirmar al 100% que la biblioteca de Optimizely también está chocando de alguna manera y causando este error. Para ser específico, estoy usando Optimizely a través de Fabric. Es imposible hacer que Firebase se inicialice mientras se usa Optimizely de esta forma (¿tal vez en todos los sentidos?).

He publicado sobre su github y los contactaré directamente …

https://github.com/optimizely/Optimizely-Android-SDK/issues/11

Yo tuve el mismo problema. Actualicé las herramientas de SDK a 25.1.7 rc1, luego el problema desapareció.

actualizado las herramientas de SDK a 25.1.7 y solucionó este problema.

Bueno, solo soy principiante de usar Android. Quería probar la creación de usuarios en Firebase siguiendo las instrucciones que se proporcionan en el sitio web de Firebase.

Agregué esas líneas en lugares indicados.

classpath ‘com.google.gms: google-services: 3.0.0’

compile ‘com.google.firebase: firebase-auth: 9.2.0’

aplicar el complemento: ‘com.google.gms.google-services’

Pero el método createUserWithEmailAndPassword siguió mostrando fallas en la creación de usuarios. Es por eso que visité esta pregunta para resolver mi problema. Lo leí todo y apliqué cada consejo. pero siguió mostrando fallas. Pero cuando actualizo Android Studio from 2.1.1 to 2.1.2 , pude crear usuarios con éxito.

Pero cuando revisé logcat , primero mostró "Firebase API initialization failure" y luego mostró “Inicialización de FirebaseApp exitosa”.

 07-09 18:53:37.012 13352-13352/jayground.firebasetest A/FirebaseApp: Firebase API initialization failure. How can I solve 

¿esta? java.lang.reflect.InvocationTargetException en java.lang.reflect.Method.invokeNative (método nativo) en java.lang.reflect.Method.invoke (Method.java:515) en com.google.firebase.FirebaseApp.zza (Desconocido Fuente) en com.google.firebase.FirebaseApp.initializeApp (Fuente desconocida) en com.google.firebase.FirebaseApp.initializeApp (Fuente desconocida) en com.google.firebase.FirebaseApp.zzeh (Fuente desconocida) en com.google.firebase .provider.FirebaseInitProvider.onCreate (origen desconocido) en android.content.ContentProvider.attachInfo (ContentProvider.java:1591) en android.content.ContentProvider.attachInfo (ContentProvider.java:1562) en com.google.firebase.provider.FirebaseInitProvider .attachInfo (Fuente desconocida) en android.app.ActivityThread.installProvider (ActivityThread.java:5118) en android.app.ActivityThread.installContentProviders (ActivityThread.java:4713) en android.app.ActivityThread.handleBindApplication (ActivityThread.java:4596 ) en android.app.ActivityThread.access $ 1600 (ActivityThread.java:169) at y roid.app.ActivityThread $ H.handleMessage (ActivityThread.java:1340) en android.os.Handler.dispatchMessage (Handler.java:102) en android.os.Looper.loop (Looper.java:146) en android.app .ActivityThread.main (ActivityThread.java:5487) en java.lang.reflect.Method.invokeNative (método nativo) en java.lang.reflect.Method.invoke (Method.java:515) en com.android.internal.os .ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1283) en com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1099) en dalvik.system.NativeStart.main (Método nativo) Causado por: java.lang .NoSuchMethodError: com.google.android.gms.common.internal.zzaa.zzz en com.google.android.gms.measurement.internal.zzx.zzbd (Fuente desconocida) en com.google.android.gms.measurement.AppMeasurement .getInstance (Fuente desconocida) en java.lang.reflect.Method.invokeNative (Método nativo) en java.lang.reflect.Method.invoke (Method.java:515) en com.google.firebase.FirebaseApp.zza (Fuente desconocida ) en com.google.firebase.FirebaseApp.initializeApp (Fuente desconocida) en com.google.firebase.FirebaseApp.initializeApp (Fuente desconocida) en com.google.firebase.FirebaseApp.zzeh (Fuente desconocida) en com.google.firebase.provider.FirebaseInitProvider.onCreate (Fuente desconocida) en android.content.ContentProvider .attachInfo (ContentProvider.java:1591) en android.content.ContentProvider.attachInfo (ContentProvider.java:1562) en com.google.firebase.provider.FirebaseInitProvider.attachInfo (origen desconocido) en android.app.ActivityThread.installProvider (ActivityThread .java: 5118) en android.app.ActivityThread.installContentProviders (ActivityThread.java:4713) en android.app.ActivityThread.handleBindApplication (ActivityThread.java:4596) en android.app.ActivityThread.access $ 1600 (ActivityThread.java:169 ) en android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1340) en android.os.Handler.dispatchMessage (Handler.java:102) en android.os.Looper.loop (Looper.java:146) en android .app.ActivityThread.main (ActivityThread.java:5487) en java.lang.reflect.Method.invokeNative (Nati Método ve) en java.lang.reflect.Method.invoke (Method.java:515) en com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1283) en com.android.internal.os. ZygoteInit.main (ZygoteInit.java:1099) en dalvik.system.NativeStart.main (Método nativo) 07-09 18: 53: 37.022 13352-13352 / jayground.firebasetest I / FirebaseInitProvider: inicialización de FirebaseApp exitosa

Me he enfrentado a este problema, y ​​cambio mi aplicación gradle versión de 1.5.0 a 2.0.0.

cambiar classpath

com.android.tools.build:gradle:1.5.0

a

classpath 'com.android.tools.build:gradle:2.0.0

Solución 1:

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

Solución 2: detectar incompatible en la carpeta .idie / libraries / .Alguna vez declaras play-services-ads: 8.4.0 concurrente con play-services-gcm: 9.0.0. Debes anular las bibliotecas incompatibles comstackción.grade que has detectado