web-dev-qa-db-fra.com

IncompatibleClassChangeError après la mise à jour vers Android Build Tools 25.1.6 GCM/FCM

Depuis que j'ai mis à jour Android SDK Tools 25.1.6 et Android Support Repository 32.0.0 (ce matin), le message d'erreur suivant s'affiche, je n'ai rien changé dans mon code et il fonctionne toujours sur l'ordinateur de mon collègue (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.<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)

Voici un morceau de code qui plante:

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

C'est lorsque j'essaie d'obtenir un jeton de Google Cloud Messaging.

J'importe GCM dans Gradle avec des services de jeu fractionnés:

 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'

EDIT la désactivation de GCM a résolu le problème. Je suppose que je devrais migrer vers Firebase Cloud Message 

EDIT2 Mon appareil reçoit Google Play Services 9.0 (hier, il était 8.4.x). Maintenant, il ne plante plus, mais se plaint du descripteur de module 

 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.

Est-ce que quelqu'un a une erreur similaire et comment la réparer?

CORRIG&EACUTE; grâce à @stegranet ../gradlew -q app:dependencies --configuration compile vous aide à identifier les dépendances incluses dans le SDK 24.x

Le problème principal est que certaines bibliothèques importent la dernière bibliothèque de support en utilisant le signe + au lieu d'une version. Cela cause le problème en incluant la dernière version disponible.

Donc, évitez les dépendances de connexion +;)

80
sonique

J'ai utilisé l'arbre de dépendance Gradle pour résoudre cette erreur pour moi.

Il suffit d’exécuter gradle -q app:dependencies --configuration compile.__ et de vérifier le résultat pour les entrées comme ceci:

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

Comme Diego Giorgini a dit que cette version est trop élevée (> = 24) . Mettez donc à jour les dépendances dans build.gradle comme 

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

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 dans ma première édition.
Veuillez mettre à jour vos dépendances et laissez-nous savoir s'il s'agit toujours d'un problème.

Merci!


réponse originale le 20 mai:

Le problème que vous rencontrez est dû à une incompatibilité entre
play-services / firebase sdk v9.0.0 et com.Android.support:appcompat-v7 >= 24
(la version publiée avec Android-N sdk)

Vous devriez pouvoir résoudre ce problème en ciblant une version antérieure de la bibliothèque de support. Comme:

compile 'com.Android.support:appcompat-v7:23.4.0'
35
Diego Giorgini

J'ai mis à jour les dépendances play-services dans build.gradle 

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

Pour résoudre le conflit de version en mettant à jour la version du plugin google-services - j'ai dû mettre à jour google-services dans le build.gradle du dossier racine du projet 

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

Vous pouvez obtenir la dernière mise à jour de google-services ici .

Bien que ce ne soit pas éviter l'exception, mais ne pas écraser l'application plus à mes côtés. 

Mettre à jour

Je pouvais éviter le crash en mettant à jour le studio Android à partir de Beta Channel. Puis mettez à jour votre platform/build-tools dans le SDK.

 enter image description here

5
Reaz Murshed

le mien a travaillé avec ce qui suit:

niveau d'application

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

niveau de racine

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

La mise à jour vers la dernière version de Google Play Services a résolu le problème pour moi.

appliquer le plug-in: "com.google.gms.google-services" en bas ...

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

https://developers.google.com/Android/guides/setup#add_google_play_services_to_votre_projet

4
synatest

M'est arrivé à cause de la mise à jour de facebook par sdk et j'avais 

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

le remplacer par 

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

résolu mon problème.

Réf.: https://developers.facebook.com/docs/Android/change-log-4.x

3
Vihaan Verma

En incluant tous les forfaits des services de jeu

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

vous supprimez l'erreur, mais le résultat final est que la récupération de jeton GCM ne fonctionne pas et que nous ne pouvons pas obtenir une instance de GCM. Donc, ce n'est pas une solution dans mes livres. Si quelqu'un a une idée de ce qui se passe, veuillez nous éclairer.

MODIFIER:

J'ai remplacé GCM par Firebase, le studio Android mis à jour de la version 2.1 à la version 2.2 pour résoudre le problème de l'analyse instantanée de Firebase, mis à jour les outils de compilation en 24-rc4 et les outils de plate-forme en 24-rc3, tout en maintenant la version 23.4.0 de la bibliothèque de support. Tout semble bien fonctionner maintenant.

1

Pour les notifications Push Android avec GCM 2016:

1) dans Android SDK-> SDK Tools, vérifiez les services Google Play

2) ajouter graduellement des dépendances sur une seule ligne: 

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

(il n'y a pas de classpath spécifique et ça marche pour moi)

3) vous devez créer 3 classes (GCMPushReceiverService, GCMRegistrationIntentService, GCMTokenRefreshListenerService)

4.1) code pour 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) Code pour GCMRegistrationIntentService (modifiez allowedEntity avec votre numéro de projet): 

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) Code pour 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) N'oubliez pas de changer le nom du paquet 

6) Dans votre mainActivity, collez ce code: 

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) Dans votre AndroidManifest.xml, ajoutez les lignes suivantes: 

<uses-permission Android:name="Android.permission.INTERNET" />

8) dans votre console logcat, copiez votre jeton et collez-le sur ce site Ajoutez votre numéro de projet, votre jeton et un message. Ça marche bien pour moi :)

1
skygirl

J'ai eu le même problème et revenant de Android Support Repository 32.0.0 à Android Support Repository 31.0.0 l'a résolu.

1
BorisK

J'ai fait face à ce problème et je change de version de la version 1.5.0 à 2.0.0.

changer classpath 

com.Android.tools.build:gradle:1.5.0

à

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

0
Ankur

Après une journée bien remplie, je peux confirmer à 100% que la bibliothèque Optimizely se heurte également d’une autre manière et est à l’origine de cette erreur. Pour être précis, j'utilise Optimizely via Fabric. Il est impossible d’initialiser Firebase en utilisant Optimizely de cette manière (peut-être de toutes les manières?). 

J'ai posté sur leur github à ce sujet et les contacterai directement ...

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

0
Steven Elliott

Well, I am just beginner of using Android.I wanted to test creating users in Firebase following instructions which is provided in the Firebase website.

I added those lines in indicated places.

classpath 'com.google.gms:google-services:3.0.0'

compile 'com.google.firebase:firebase-auth:9.2.0'

apply plugin: 'com.google.gms.google-services'

But createUserWithEmailAndPassword Method kept showing failure in creating users. That's why I visited this question to figure out my problem. I read all and applied each advice. but IT kept showing failure. But When I upgrade Android Studio from 2.1.1 to 2.1.2, I could create users successfully.

But when I checked logcat, it first showed "Firebase API initialization failure" and then showed "FirebaseApp initialization successful".

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

this? java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) 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.zzeh(Unknown Source) at com.google.firebase.provider.FirebaseInitProvider.onCreate(Unknown Source) at android.content.ContentProvider.attachInfo(ContentProvider.java:1591) at android.content.ContentProvider.attachInfo(ContentProvider.java:1562) at com.google.firebase.provider.FirebaseInitProvider.attachInfo(Unknown Source) at android.app.ActivityThread.installProvider(ActivityThread.java:5118) at android.app.ActivityThread.installContentProviders(ActivityThread.java:4713) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4596) at android.app.ActivityThread.access$1600(ActivityThread.java:169) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1340) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:146) at android.app.ActivityThread.main(ActivityThread.java:5487) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.NoSuchMethodError: com.google.android.gms.common.internal.zzaa.zzz at com.google.android.gms.measurement.internal.zzx.zzbd(Unknown Source) at com.google.android.gms.measurement.AppMeasurement.getInstance(Unknown Source) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) 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.zzeh(Unknown Source) at com.google.firebase.provider.FirebaseInitProvider.onCreate(Unknown Source) at android.content.ContentProvider.attachInfo(ContentProvider.java:1591) at android.content.ContentProvider.attachInfo(ContentProvider.java:1562) at com.google.firebase.provider.FirebaseInitProvider.attachInfo(Unknown Source) at android.app.ActivityThread.installProvider(ActivityThread.java:5118) at android.app.ActivityThread.installContentProviders(ActivityThread.java:4713) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4596) at android.app.ActivityThread.access$1600(ActivityThread.java:169) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1340) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:146) at android.app.ActivityThread.main(ActivityThread.java:5487) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) at dalvik.system.NativeStart.main(Native Method) 07-09 18:53:37.022 13352-13352/jayground.firebasetest I/FirebaseInitProvider: FirebaseApp initialization successful

0
Jayground

mis à jour les outils du Kit de développement logiciel (SDK) vers 25.1.7 et résolu ce problème.

0
austin

Solution 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`
}

Solution 2: détectez l'incompatibilité dans le dossier .idie/libraries/ Parfois, vous déclarez play-services-ads: 8.4.0 en même temps que play-services-gcm: 9.0.0 .vous devez écraser les bibliothèques incompatibles build.grade que vous avez détectées

0
Tho Pham

J'ai eu le même problème . J'ai mis à jour les outils du SDK à 25.1.7 RC1, alors le problème avait disparu.

0
Tony Lin