programing

Android 빌드 도구 25.1.6 GCM / FCM으로 업데이트 한 후 IncompatibleClassChangeError

nasanasas 2020. 10. 8. 08:05
반응형

Android 빌드 도구 25.1.6 GCM / FCM으로 업데이트 한 후 IncompatibleClassChangeError


Android SDK 도구 25.1.6 및 Android 지원 리포지토리 32.0.0 (오늘 아침)으로 업데이트 한 이후 다음 오류가 발생했습니다. 코드에서 아무것도 변경하지 않았으며 동료 컴퓨터에서 계속 작동합니다 (Android SDK 도구 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'

편집 내 생각 엔 내가 중포 기지 클라우드 메시지로 마이그레이션해야하므로 사용하지 GCM은 문제를 해결

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 compileSDK 24.x를 포함하는 종속성을 식별하는 데 도움이됩니다.

주요 문제는 일부 라이브러리 +가 버전 대신 서명을 사용하여 최신 지원 라이브러리를 가져 오는 것입니다. 이로 인해 사용 가능한 최신 버전이 포함되어 문제가 발생합니다.

따라서 +로그인 종속성을 하십시오.)


이 오류를 해결하기 위해 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'

업데이트 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'

내 작업은 다음과 같습니다.

앱 수준 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'
}

플레이 서비스 종속성을 업데이트했습니다. 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'
}

여기 에서 google-services의 최신 업데이트를받을 수 있습니다 .

예외를 피하지는 않지만 내 쪽에서 더 이상 응용 프로그램을 충돌 시키지는 않습니다.

최신 정보

베타 채널에서 Android 스튜디오를 업데이트하여 충돌을 피할 수있었습니다. 그런 다음 platform/build-tools내부 SDK를 업데이트하십시오 .

여기에 이미지 설명 입력


최신 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


페이스 북이 그것을 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


모든 플레이 서비스의 패키지를 포함함으로써

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으로 유지했습니다. 이제 모든 것이 잘 작동하는 것 같습니다.


나는 같은 문제가 있었고 Android Support Repository 32.0.0에서 Android Support Repository 31.0.0으로 되 돌리면 해결되었습니다.


GCM 2016을 사용하는 Android 푸시 알림 :

1) Android SDK-> SDK 도구에서 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 용 코드 (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에서 토큰을 복사하여이 사이트붙여넣고 프로젝트 번호, 토큰 및 메시지를 추가하십시오. 그것은 나를 위해 잘 작동합니다 :)


하루 종일이 작업을 마치면 Optimizely 라이브러리도 어떤 식 으로든 충돌하여이 오류가 발생하고 있음을 100 % 확인할 수 있습니다. 구체적으로는 Fabric을 통해 Optimizely를 사용하고 있습니다. Optimizely를 이런 방식으로 사용하는 동안 Firebase를 초기화하는 것은 불가능합니다 (모든면에서?).

나는 그것에 대해 그들의 github에 게시했으며 그들에게 직접 연락 할 것입니다 ...

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


나는 같은 문제가 있었다. SDK 도구를 25.1.7 rc1로 업데이트했는데 문제가 사라졌습니다.


updated SDK tools to 25.1.7 and fixed this issue.


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


이 문제에 직면했으며 앱 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 / libraries / 폴더에서 호환되지 않음을 감지합니다. 가끔 play-services-ads : 8.4.0을 play-services-gcm : 9.0.0과 동시에 선언합니다. 감지 한 build.grade 호환되지 않는 라이브러리에서 재정의해야합니다.

참고 URL : https://stackoverflow.com/questions/37312340/incompatibleclasschangeerror-after-updating-to-android-build-tools-25-1-6-gcm

반응형