web-dev-qa-db-ja.com

Android Build Tools 25.1.6 GCM / FCMへの更新後のIncompatibleClassChangeError

Android SDK Tools 25.1.6およびAndroid Support Repository 32.0.0(今朝)に更新したため、次のエラーが発生しました。コードを変更せず、同僚のコンピューターで引き続き動作しています(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)

クラッシュするコードは次のとおりです。

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からトークンを取得しようとしたときです。

私は、分割されたプレイサービスで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 Cloud Messageに移行する必要があると思います

EDIT2デバイスはGoogle Play Services 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 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 (*)

Diego 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'
37
stegranet

更新5月27日:

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

ありがとう!


元の回答5月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

build.gradleのplay-services依存関係を更新しました

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

Google-services here の最新のアップデートを入手できます。

例外を回避するわけではありませんが、私の側ではもうアプリケーションをクラッシュさせません。

更新

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

enter image description here

5
Reaz Murshed

私の仕事は次のとおりです。

アプリレベルのグラドル

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

ルートレベルのグラドル

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

Facebookで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

すべてのPlayサービスのパッケージを含めることにより

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

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

編集:

GCMをfirebaseに置き換え、Android studioを2.1から2.2に更新してfirebase分析のインスタントランの問題を修正し、ビルドツールを24-rc4に、プラットフォームツールを24-rc3に更新し、サポートライブラリを保持しました。 23.4.0へのバージョン。すべてがうまく機能しているようです。

1

GCM 2016のAndroidプッシュ通知の場合:

1)Android SDK-> SDK ToolsでGoogle Playサービスを確認します

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

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

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

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

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

0
Steven Elliott

まあ、私はAndroidを使用する初心者です。 Firebase Webサイトで提供されている指示に従ってFirebaseでユーザーの作成をテストしたかったのです。

これらの行を指定された場所に追加しました。

クラスパス '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.Method.invokeNative(Native Method)のJava.lang.reflect.InvocationTargetExceptionで、com.google.firebase.FirebaseApp.zza(UnknownのJava.lang.reflect.Method.invoke(Method.Java:515)でSource)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 )Android.app.ActivityThread.access $ 1600(ActivityThread.Java:169)at And roid.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)原因:Java.lang .NoSuchMethodError:com.google.Android.gms.measurement.AppMeasurementのcom.google.Android.gms.measurement.internal.zzx.zzbd(Unknown Source)のcom.google.Android.gms.common.internal.zzaa.zzz .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 )com.google.firebase.FirebaseApp.initializeAppで(Unknown S ource)com.google.firebase.FirebaseApp.initializeApp(Unknown Source)でcom.google.firebase.FirebaseApp.zzeh(Unknown Source)でcom.google.firebase.provider.FirebaseInitProvider.onCreate(Unknown Source)でAndroid.contentで.ContentProvider.attachInfo(ContentProvider.Java:1591)Android.content.ContentProvider.attachInfo(ContentProvider.Java:1562)at com.google.firebase.provider.FirebaseInitProvider.attachInfo(Unknown Source)Android.app.ActivityThread.installProvider (ActivityThread.Java:5118)Android.app.ActivityThread.installContentProviders(ActivityThread.Java:4713)Android.app.ActivityThread.handleBindApplication(ActivityThread.Java:4596)Android.app.ActivityThread.access $ 1600(ActivityThread.Java) :169)Android.app.ActivityThread $ H.handleMessage(ActivityThread.Java:1340)Android.os.Handler.dispatchMessage(Handler.Java:102)Android.os.Looper.loop(Looper.Java:146) Android.app.ActivityThread.main(ActivityThread.Java:5487)Java.lでang.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) com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1099)dalvik.system.NativeStart.main(Native Method)で07-09 18:53:37.022 13352-13352/jayground.firebasetest I/FirebaseInitProvider:FirebaseApp初期化成功

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/libraries /で互換性がないことを検出するplay-services-ads:8.4.0をplay-services-gcm:9.0.0と同時に宣言する場合

0
Tho Pham

同じ問題がありました。 SDKツールを25.1.7 rc1に更新すると、問題はなくなりました。

0
Tony Lin