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 compile
SDK 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.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'
}
플레이 서비스 종속성을 업데이트했습니다. 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 호환되지 않는 라이브러리에서 재정의해야합니다.
'programing' 카테고리의 다른 글
헤더 및 소스 (CPP)에 C ++ 네임 스페이스 만들기 (0) | 2020.10.08 |
---|---|
sed 오류 : "`s '명령의 RHS에 대한 잘못된 참조 \ 1" (0) | 2020.10.08 |
take ()에서 차단하는 BlockingQueue를 중단하는 방법은 무엇입니까? (0) | 2020.10.08 |
Android Studio-단일 창에서 여러 프로젝트를 여는 방법은 무엇입니까? (0) | 2020.10.08 |
Golang 미사용 가져 오기 오류를 비활성화하는 방법 (0) | 2020.10.08 |