Androidビルドツール25.1.6GCM / FCMに更新した後のIncompatibleClassChangeError


80

Android SDK Tools 25.1.6とAndroidSupport 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クラウドメッセージングからトークンを取得しようとしたときです。

分割されたプレイサービスを使用してGradleにGCMをインポートしています:

 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 CloudMessageに移行する必要があると思います

EDIT2 私のデバイスはGooglePlay開発者サービス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.

誰かが同様のエラーを抱えていますか、そしてそれを修正する方法はありますか?

FIXED @stegranetに特別な感謝を。 ./gradlew -q app:dependencies --configuration compileSDK24.xに含まれる依存関係を特定するのに役立ちます

主な問題は+、バージョンの代わりに記号を使用して最新のサポートライブラリをインポートするライブラリです。これにより、利用可能な最新バージョンが含まれるため、問題が発生します。

したがって、+サインインの依存関係は避けてください;)


どうやらGoogleクラウドメッセージングは​​Firebaseクラウドメッセージングになります:firebase.google.com/docs/cloud-messagingそれが関連しているかどうかわからない、まだ調査中です。
ソニーク2016年

これはビルドツールの問題ではないと思います。それはグーグルプレイサービスと関係があります。バージョン9.0.0を使用していますが、エラーに加えて、署名が無効であるという不満があります...
Arnold Balliu 2016年

携帯電話でGooglePlay開発者サービスのバージョンをどのように確認しますか?Google Playミュージック、ゲームなどは表示されますが、Play開発者サービスのようなものはありません。
bschandramohan 2016年

回答:


36

このエラーを解決するために、gradle依存関係ツリーを使用しました。

実行してgradle -q app:dependencies --configuration compile 、次のようなエントリの出力を確認してください。

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

ディエゴ・Giorginiが、このバージョンは、(> = 24)が高すぎると述べました。したがって、次のbuild.gradleように依存関係を更新します

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

主な問題は、いくつかのモジュールが+(あなたの例のように)記号を使用してサポートライブラリをインポートすることでした。そのため、gradleには、ケースに収まらない最新バージョンが含まれています。ありがとう!
ソニーク2016年

1
すべてを24未満に指定している場合、Androidが24を超える依存関係をプロジェクトに組み込む方法がわかりません。これは新しい問題のようで、現在、アプリのデバッグバージョンが壊れており、かなりの混乱を招いています-一方、同じコードのストアバージョンは問題ないようです
Daniel Wilson

確認してくれてありがとうstegranet。これを修正するためのアップデートをリリースするだけです。バージョン9.0.1をお試しください
Diego

プロジェクトを分析するためのAndroidStudioGradleViewプラグイン
Jignesh Patel 2016

次のコードはどこで実行しますか?"gradle -q app:dependencies --configuration compile"
Roee 2016

34

5月27日更新:

version 9.0.1最初の編集で述べた非互換性を修正するためのアップデート()をリリースしました。
依存関係を更新して、これがまだ問題であるかどうかをお知らせください。

ありがとう!


元の回答5月20日:

発生している問題は、
play-services / firebase sdk v9.0.0com.android.support:appcompat-v7 >= 24
(android-N sdkでリリースされたバージョン)の間の非互換性が原因です。

以前のバージョンのサポートライブラリをターゲットにすることで、修正できるはずです。お気に入り:

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

2
これがうまくいったと思われる唯一の解決策です、ありがとう。私の言うことを気にしないのであれば、そのようなバグが製品リリースに滑り込む可能性があるのは少し怖いです!
ダニエルウィルソン

私はそれを行い、更新しました:-'com.google.android.gms:play-services-gcm:9.0.2'もcom.google.gms:google-services:3.0.0 'にコンパイルしますが、multidexエラーが発生します。何か案が!!
Rohit 2016年

'com.google.android.gms:play-services-gcm:9.0.2'にはまだこの問題があります
Tom Bevelander 2016年

プロジェクトビルドのすべての「play-services」モジュールと「com.google.gms:google-services:3.0.0」に9.0.2を使用します。最近リリースされた24.0.0サポートライブラリも使用します。「compile'c​​om.google.android.gms:play-services-gcm:9.0.2 '」を「compile'c​​om.google.firebase:firebase-messaging:9.0.2'」に置き換えるエラーを削除できました
c0deblooded 2016年

バージョンを9.0.1に変更しようとすると、このエラーが発生しました> google-servicesプラグインのバージョンを更新して、バージョンの競合を修正してください(最新バージョンに関する情報はbintray.com/android/android-tools/…で入手できます))またはcom.google.android.gmsのバージョンを9.0.0に更新します。@Diego Giorgini
Roger Alien

5

私は以下で働いた:

アプリレベルの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'
}

2
これは私のために働きました...私はすべてのバージョン24.2.1を23.4.0に変更しました、そしてgetTokenは再び働きます...これはひどいです!今、私はバージョンをアップグレードするのが怖いです。
EZDsIt 2016

5

Play開発者サービスの依存関係を更新しました build.gradle

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

google-servicesプラグインのバージョンを更新してバージョンの競合を修正するにはbuild.gradle、プロジェクトのルートフォルダーの下にあるgoogle-servicesを更新する必要がありました。

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

ここでグーグルサービスの最新のアップデートを入手できます

例外を回避していませんが、私の側ではアプリケーションをクラッシュさせていません。

更新

ベータチャネルからAndroidStudioを更新することで、クラッシュを回避できました。次に、platform/build-tools内部SDKを更新します。

ここに画像の説明を入力してください


おかげで、私はgoogle-servicesを3.0.0に更新しましたが、それは役に立ちません:(
sonique 2016年

私の場合、logcatで例外が発生しましたが、もうクラッシュしていません
Reaz Murshed 2016

フィードバックありがとうございます。Androidビルドツール25.1.6を使用していますか?
ソニーク2016年

そうです、Play開発者サービス9.0.0では機能しますが、分割サービスでは機能しません:(
sonique 2016年

私はそれを行い、コンパイルを更新しました 'com.google.android.gms:play-services-gcm:9.0.2'もcom.google.gms:google-services:3.0.0 'ですが、multidexエラーが発生します。何か案が!!
Rohit 2016年

4

最新のグーグルプレイサービスバージョンにアップデートすると、問題が修正されました。

プラグインを適用します:下部にある「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


ありがとう。私も更新しました9.0.0が、まだ問題があります。私は現在splitedを使用していgmsます。: 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'
ソニーク2016年

でコンパイルしようとしましたplay-services:9.0.0が、それでも同じ問題です。
ソニーク2016年

'com.google.android.gms:play-services-gcm:9.0.2'を使用していますが、同じ問題が発生しています
Tom Bevelander 2016年


1

すべてのプレイサービスのパッケージを含めることによって

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

エラーを抑制しますが、最終的には、GCMトークンの取得が機能せず、GCMのインスタンスを取得できません。したがって、これは私の本の解決策ではありません。誰かが何が起こっているのか考えているなら、私たちに教えてください。

編集:

GCMをfirebaseに置き換え、Android Studioを2.1から2.2に更新して、Firebase Analyticsのインスタント実行の問題を修正し、ビルドツールを24-rc4に、プラットフォームツールを24-rc3に更新し、サポートライブラリのバージョンを23.4.0に維持しました。今はすべてうまくいっているようです。


FCMを実装する必要があるようです
ソニーク2016年

私はそれをしました、そして、私はまだ同じエラーを受け取ります。GCMを完全に削除し、これに基づいてFCMに置き換えました:developers.google.com/cloud-messaging/android/…GCMまたはFCMパッケージではなくサポートライブラリに問題があります
Stilianos Tzouvaras 2016年

1

同じ問題が発生し、Androidサポートリポジトリ32.0.0からAndroidサポートリポジトリ31.0.0に戻すと解決しました。


3
Androidサポートリポジトリをどのように元に戻しますか?
Pratama Nur Wijaya 2016年

2
私が見つけた唯一の方法は、新しいリポジトリではなく古いリポジトリをコピーすることです。リポジトリは通常、「SDKマネージャー」が指しているAndroidフォルダーの下にあります(Macを使用している場合は、パス〜/ Library / Android / sdk / extrasである可能性があります)。extrasフォルダーで、「android」フォルダーと「google」フォルダーを古いフォルダーに置き換えます。
BorisK 2016年

ここでリポジトリを見つけました:dl-ssl.google.com/android/repository/…、それを../sdk/extras/androidに解凍し、既存のm2reposityを削除することは今のところうまくいくようです。
トムレッドマン2016年

1

GCM 2016を使用したAndroidプッシュ通知の場合:

1)Android SDK-> SDKツールでGooglePlay開発者サービスを確認します

2)gradleで、依存関係を1行だけ追加します。

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でトークンをコピーし、このサイトに貼り付けて 、プロジェクト番号、トークン、およびメッセージを追加します。それは私にとってはうまくいきます:)


こんにちは@Skygirl私はあなたの例に従っています、AndroidManifestの特別な要件はありますか?コードのその部分を追加していただけませんか?ありがとう
ziniestro 2016

0

これを丸一日行った後、Optimizelyライブラリも何らかの方法で衝突してこのエラーを引き起こしていることを100%確認できます。具体的には、Fabricを介してOptimizelyを使用しています。この方法でOptimizelyを使用しているときにFirebaseを初期化することは不可能です(おそらくすべての方法で?)。

私はそれについて彼らのgithubに投稿しました、そして彼らに直接連絡します...

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


0

私も同じ問題を抱えていました。SDKツールを25.1.7rc1に更新したところ、問題は解決しました。



0

ええと、私はAndroidを使い始めたばかりです。FirebaseFirebase Webサイトに記載されている手順に従って、ユーザーの作成をテストしたいと思いました。

示された場所にそれらの行を追加しました。

クラスパス 'com.google.gms:google-services:3.0.0'

コンパイル 'com.google.firebase:firebase-auth:9.2.0'

プラグインを適用する: 'com.google.gms.google-services'

しかし、createUserWithEmailAndPasswordメソッドは、ユーザーの作成に失敗し続けました。だから私は自分の問題を理解するためにこの質問に行きました。私はすべてを読み、それぞれのアドバイスを適用しました。しかし、ITは失敗を示し続けました。しかし、アップグレードすると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

この?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ソース)com.google.firebase.FirebaseApp.initializeApp(不明なソース)com.google.firebase.FirebaseApp。


OK。ありがとうございました。私がどのように問題を解決したかを共有するのは良いことだと思いました。(完全に解決したかどうかはわかりませんでした。AndroidStudioのバージョンを更新した後、com.google.firebase:firebase-auth:9.2.0でユーザーを作成できましたが、logcatでFirebaseAPIの初期化に失敗しているので疑問に思いました。 )次回は「質問ボタン」を使用します。
ジェイグラウンド2016

0

この問題に直面しました。アプリの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

解決策1:解決策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 / libraries /で互換性がないことを検出します。play-services-ads:8.4.0をplay-services-gcm:9.0.0と同時に宣言する場合があります。検出したbuild.grade互換性のないライブラリをオーバーライドする必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.