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



после обновления до версии Android SDK-инструментов 25.1.6 и Android поддержки репозитория 32.0.0 (сегодня утром), я получаю следующую ошибку, я не менял ничего в мой код и он по-прежнему работает на моего коллегу компьютер (Андроид СДК инструменты 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 с splited play-услуги:



 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.икс.) Теперь он больше не падает, но жалуется на дескриптор модуля



 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



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



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

679   15  

15 ответов:

я использовал дерево зависимостей 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'

обновление 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'

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

уровень приложения 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'
}

я обновил зависимости 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-services здесь.

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

обновление

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

enter image description here

обновление до последней версии Google play services Исправлена проблема для меня.

применить плагин: 'com.гуглить.СБМ.google-сервисы' в самом низу ...

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

случилось со мной из-за facebook обновления его sdk и у меня было

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

заменить на

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

решен мой вопрос.

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

путем включения всех пакетов play services

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

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

EDIT:

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

У меня была та же проблема и возврат из репозитория поддержки Android 32.0.0 в репозиторий поддержки Android 31.0.0 решил ее.

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

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

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 (изменить authorizedEntity с номером вашего проекта):

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) в вашей mainActivity вставьте этот код:

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 скопируйте маркер и вставьте его сайт добавьте номер проекта, маркер и сообщение. Это прекрасно работает для меня:)

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

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

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

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

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

Ну, я просто новичок в использовании Андроида. Я хотел проверить создание пользователей в Firebase следуя инструкциям, которые приведены на веб-сайте Firebase.

я добавил Эти строки в указанных местах.

classpath 'com.гуглить.gms: google-services: 3.0.0'

compile ' com.гуглить.firebase: firebase-auth: 9.2.0'

применить плагин: 'com.гуглить.СБМ.google-services'

но createUserWithEmailAndPassword Метод продолжал показывать сбой в создании пользователей. Вот почему я посетил этот вопрос, чтобы выяснить мою проблему. Я прочитал все и применил каждый совет. но он продолжал показывать неудачу. Но когда я обновляю Android Studio from 2.1.1 to 2.1.2, я мог бы создать успешно пользователей.

но когда я проверил logcat, он впервые показал "Firebase API initialization failure" а затем показал "firebaseapp инициализации успешно".

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

этого? Ява.ленг.отражать.InvocationTargetException на Яве.ленг.отражать.Метод.invokeNative (родной метод) на Яве.ленг.отражать.Метод.метод Invoke.java: 515) на ком.гуглить.опорному пункту.FirebaseApp.зза(неизвестный источник) на ком.гуглить.опорному пункту.FirebaseApp.initializeApp(неизвестный источник) на ком.гуглить.опорному пункту.FirebaseApp.initializeApp(неизвестный источник) на ком.гуглить.опорному пункту.FirebaseApp.zzeh (неизвестный источник) на com.гуглить.опорному пункту.поставщик.FirebaseInitProvider.метод onCreate(неизвестный Источник) на андроид.содержание.ContentProvider.attachInfo (ContentProvider.java: 1591) на андроид.содержание.ContentProvider.attachInfo (ContentProvider.java: 1562) на com.гуглить.опорному пункту.поставщик.FirebaseInitProvider.attachInfo (неизвестно Источник) на андроид.приложение.ActivityThread.installProvider(ActivityThread.java:5118) на андроид.приложение.ActivityThread.installContentProviders (ActivityThread.java: 4713) на андроид.приложение.ActivityThread.handleBindApplication (ActivityThread.java: 4596) на Андроид.приложение.ActivityThread.доступ$1600(ActivityThread.java: 169) на андроид.приложение.ActivityThread$H. handleMessage (ActivityThread.java:1340) на андроид.ОС.Обработчик.dispatchMessage(обработчика.Ява:102) на Андроид.ОС.Петлитель.петля(Looper.Ява:146) на Андроид.приложение.ActivityThread.main (ActivityThread.java: 5487) на Яве.ленг.отражать.Метод.invokeNative (родной метод) на Яве.ленг.отражать.Метод.метод Invoke.java: 515) на com.андроид.внутренний.ОС.ZygoteInit$MethodAndArgsCaller.беги(Зиготеинит.java:1283) на ком.андроид.внутренний.ОС.Зиготеинит.главный(Зиготеинит.java:1099) на дальвик.система.NativeStart.main (собственный метод) Вызвано: java.ленг.NoSuchMethodError: com.гуглить.андроид.СБМ.общий.внутренний.zzaa.zzz на ком.гуглить.андроид.СБМ.измерение.внутренний.zzx.zzbd(неизвестный Источник) на com.гуглить.андроид.СБМ.измерение.AppMeasurement.getInstance (неизвестно Источник) на Яве.ленг.отражать.Метод.invokeNative (родной метод)  на Яве.ленг.отражать.Метод.метод Invoke.java: 515)  на ком.гуглить.опорному пункту.FirebaseApp.зза(неизвестный источник)  на ком.гуглить.опорному пункту.FirebaseApp.initializeApp(неизвестный источник)  на ком.гуглить.опорному пункту.FirebaseApp.initializeApp(неизвестный источник)  на ком.гуглить.опорному пункту.FirebaseApp.zzeh (неизвестный источник)  на com.гуглить.опорному пункту.поставщик.FirebaseInitProvider.метод onCreate(неизвестный Источник)  на андроид.содержание.ContentProvider.attachInfo (ContentProvider.java: 1591)  на андроид.содержание.ContentProvider.attachInfo (ContentProvider.java: 1562)  на com.гуглить.опорному пункту.поставщик.FirebaseInitProvider.attachInfo (неизвестно Источник)  на андроид.приложение.ActivityThread.installProvider(ActivityThread.java:5118)  на андроид.приложение.ActivityThread.installContentProviders (ActivityThread.java: 4713)  на андроид.приложение.ActivityThread.handleBindApplication (ActivityThread.java: 4596)  на Андроид.приложение.ActivityThread.доступ$1600(ActivityThread.java: 169)  на андроид.приложение.ActivityThread$H. handleMessage (ActivityThread.java:1340)  на андроид.ОС.Обработчик.dispatchMessage(обработчика.Ява:102)  на Андроид.ОС.Петлитель.петля(Looper.Ява:146)  на Андроид.приложение.ActivityThread.main (ActivityThread.java: 5487)  на Яве.ленг.отражать.Метод.invokeNative (родной метод)  на Яве.ленг.отражать.Метод.метод Invoke.java: 515)  на com.андроид.внутренний.ОС.ZygoteInit$MethodAndArgsCaller.беги(Зиготеинит.java:1283)  на ком.андроид.внутренний.ОС.Зиготеинит.главный(Зиготеинит.java:1099)  на дальвик.система.NativeStart.main (собственный метод)  07-09 18:53: 37.022 13352-13352/jayground.firebasetest I/FirebaseInitProvider: инициализация FirebaseApp успешно

я столкнулся с этой проблемой, и я меняю свою версию приложения gradle с 1.5.0 на 2.0.0.

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

com.android.tools.build:gradle:1.5.0

до

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

Решение 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/библиотеки/ .какое-то время вы объявляете играть-сервисы-объявления:8.4.0 одновременно с игрой-услуги-ГКМ:9.0.0 .вы должны переопределить на сборке.класс несовместимых библиотек вы обнаружили

Comments

    Ничего не найдено.