it-roy-ru.com

IncompatibleClassChangeError после обновления до Android Build Tools 25.1.6 GCM/FCM

Поскольку я обновил до Android SDK Tools 25.1.6 и Android Support Repository 32.0.0 (этим утром), я получил следующую ошибку, я ничего не изменил в своем коде, и он все еще работает на моем коллегном компьютере (Android SDK Tools 25.1.1 + Репозиторий поддержки Android 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)

Вот фрагмент кода, который вылетает:

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

Это когда я пытаюсь получить токен из Google Cloud Messaging.

Я импортирую GCM в Gradle с разделенными игровыми сервисами:

 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 отключение GCM устранило проблему, поэтому я думаю, что мне нужно перейти на Firebase Cloud Message 

EDIT2 Мое устройство получает сервисы Google Play 9.0 (вчера было 8.4.x). Теперь он больше не падает, но жалуется на дескриптор модуля 

 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.

У кого-нибудь есть похожая ошибка, и как ее исправить?

ИСПРАВЛЕНО особая благодарность @stegranet ../gradlew -q app:dependencies --configuration compile помогает вам определить, какие зависимости включают SDK 24.x.

Основная проблема заключается в том, что некоторые библиотеки импортируют последнюю версию библиотеки поддержки, используя знак + вместо версии. Это вызывает проблему, включая последнюю доступную версию.

Так что избегайте + входа в зависимости;)

80
sonique

Я использовал дерево зависимостей gradle, чтобы решить эту ошибку для меня.

Просто запустите gradle -q app:dependencies --configuration compile И проверьте вывод на наличие таких записей:

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

Как Диего Джорджини сказал, что эта версия слишком высока (> = 24) . Так что обновите зависимости в build.gradle как 

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

Обновление 27 мая:

мы только что выпустили обновление (version 9.0.1) для исправления несовместимости, о которой я упоминал в своем первом редактировании.
Пожалуйста, обновите ваши зависимости и сообщите нам, если это все еще проблема.

Спасибо!


оригинальный ответ 20 мая:

Проблема, с которой вы столкнулись, связана с несовместимостью
play-services / firebase sdk v9.0.0 и com.Android.support:appcompat-v7 >= 24
(версия, выпущенная с Android-N SDK)

Вы должны быть в состоянии исправить это, нацеливаясь на более раннюю версию библиотеки поддержки. Подобно:

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

Я обновил зависимости play-services в build.gradle 

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

Чтобы исправить конфликт версий, либо обновив версию плагина google-services - мне пришлось обновить google-services в build.gradle в корневой папке проекта 

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

Вы можете получить последнее обновление google-сервисов здесь .

Хотя это не избежать исключения, но это не сбой приложения больше в мою сторону. 

Обновление

Я мог избежать сбоя, обновив Android-студию с бета-канала. Затем обновите свой platform/build-tools внутри SDK.

 enter image description here

5
Reaz Murshed

мой работал со следующим:

gradle уровня приложения

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

gradle уровня корня

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

Обновление до последней версии сервисов Google Play исправило проблему для меня.

применить плагин: «com.google.gms.google-services» внизу ...

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

4
synatest

Случилось со мной из-за обновления фейсбука sdk и у меня было 

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

заменить его на 

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

решил мой вопрос.

Ссылка: https://developers.facebook.com/docs/Android/change-log-4.x

3
Vihaan Verma

Включая все пакеты игровых сервисов

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

вы подавляете ошибку, но в результате получается, что поиск токена GCM не работает, и мы не можем получить экземпляр GCM. Так что это не решение в моих книгах. Если кто-нибудь знает, что происходит, пожалуйста, просветите нас.

Правка:

Я заменил GCM на firebase, обновил Android-студию с 2.1 до 2.2, чтобы исправить проблему мгновенного запуска с аналитикой firebase, обновил инструменты сборки до 24-rc4 и инструменты платформы до 24-rc3 и сохранил версию моих библиотек поддержки до 23.4.0. Кажется, сейчас все работает хорошо.

1
Stilianos Tzouvaras

Для Android Push-уведомлений с GCM 2016:

1) в Android SDK-> SDK Tools проверьте сервисы Google Play

2) в gradle добавить в зависимости всего одну строку: 

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

(нет определенного пути к классам, и он работает для меня)

3) необходимо создать 3 класса (GCMPushReceiverService, GCMRegistrationIntentService, GCMTokenRefreshListenerService)

4.1) код для 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) Код для GCMRegistrationIntentService (измените authorEntity с номером вашего проекта): 

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) Код для 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) Не забудьте изменить имя пакета 

6) В вашей основной деятельности вставьте этот код: 

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) В вашем AndroidManifest.xml добавьте следующие строки: 

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

8) в консоли logcat скопируйте свой токен и вставьте на этот сайт Добавьте номер своего проекта, свой токен и сообщение. Это нормально работает для меня :)

1
skygirl

У меня возникла та же проблема, и ее можно было решить, вернувшись из Android Support Repository 32.0.0 в Android Support Repository 31.0.0.

1
BorisK

Я столкнулся с этой проблемой, и я изменил версию своего приложения Gradle с 1.5.0 до 2.0.0.

изменить Путь к классам 

com.Android.tools.build:gradle:1.5.0

в

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

0
Ankur

После полного рабочего дня я могу на 100% подтвердить, что библиотека Optimizely также каким-то образом конфликтует и вызывает эту ошибку. Если быть точным, я использую Optimizely через Fabric. Невозможно заставить Firebase инициализироваться при использовании Optimizely таким образом (может быть, во всех отношениях?). 

Я написал об этом на их github и свяжусь с ними напрямую ...

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

обновил инструменты SDK до 25.1.7 и исправил эту проблему.

0
austin

Решение 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`
}

Решение 2: обнаружение несовместимого в папке .idie/library/ . Иногда вы объявляете play-services-ads: 8.4.0 одновременно с play-services-gcm: 9.0.0 Вы должны переопределить в build.grade несовместимые библиотеки, которые вы обнаружили

0
Tho Pham

У меня была та же проблема .. Я обновил инструменты SDK до 25.1.7 rc1, затем проблема исчезла.

0
Tony Lin