私のAndroid Google Cloud Messaging(GCM)のトークンを生成するときにアプリケーションがクラッシュし始めました。これは複数のデバイスとAndroidのバージョンで発生します。昨日Google IOでGoogleによって。
これが起こり始めたとき、私はGCMに関連するコードを回避していなかったので、予想外でした。 Androidシステム設定からGoogle Play Servicesの更新をアンインストールすると、アプリはクラッシュしなくなります。最新のものを再インストールすると、アプリは毎回クラッシュし始めます。
FATAL EXCEPTION: IntentService[MyGCMRegistrationIntentService]
Process: <my process>, PID: 26036
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 <package>.MyGCMRegistrationIntentService.onHandleIntent(MyGCMRegistrationIntentService.Java:<line number>);
at Android.app.IntentService$ServiceHandler.handleMessage(IntentService.Java:65)
at Android.os.Handler.dispatchMessage(Handler.Java:102)
at Android.os.Looper.loop(Looper.Java:135)
at Android.os.HandlerThread.run(HandlerThread.Java:61)
登録サービスは次のとおりです。
public class MyGCMRegistrationIntentService extends IntentService
{
public static final String KEY_GCM_TOKEN = "gcm_token";
public static final String KEY_GCM_INSTANCE_ID = "gcm_instance_id";
private static final String NAME = MyGCMRegistrationIntentService.class.getSimpleName();
public MyGCMRegistrationIntentService()
{
super(NAME);
}
@Override
protected void onHandleIntent(final Intent intent)
{
try
{
final InstanceID instanceId = InstanceID.getInstance(this);
final String token = instanceId.getToken(getGCMSenderID(), GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
final String instanceIdId = instanceId.getId();
sendTokenToMyServer(token, instanceIdId);
}
catch (final IOException e)
{
Timber.e(e, "Error getting GCM token.");
}
}
}
トップレベルのGradleビルドファイル:
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.Android.tools.build:gradle:2.1.0'
classpath 'de.felixschulze.gradle:gradle-hockeyapp-plugin:3.3'
classpath 'com.Android.tools.build:gradle:2.1.0'
classpath 'com.google.gms:google-services:2.1.0'
classpath 'com.github.dcendents:Android-maven-gradle-plugin:1.3'
}
}
allprojects {
repositories {
jcenter()
maven { url 'https://jitpack.io' }
}
}
Googleを扱うアプリレベルのGradleビルドの依存関係:
dependencies {
compile 'com.Android.support:appcompat-v7:23.3.0'
compile 'com.Android.support:multidex:1.0.1'
compile 'com.Android.support:design:23.3.0'
compile 'com.Android.support:recyclerview-v7:23.3.0'
compile 'com.Android.support:support-annotations:23.3.0'
compile 'com.Android.support:support-v4:23.3.0'
compile 'com.Android.support:support-v13:23.3.0'
compile 'com.google.Android.gms:play-services-analytics:8.4.0'
compile 'com.google.Android.gms:play-services-gcm:8.4.0'
...(and then the rest of my dependecies)
}
Googleを扱うライブラリの依存関係(これはすべて面倒で、いくつかは冗長であることがわかっていますが、申し訳ありません):
dependencies {
compile 'com.Android.support:appcompat-v7:23.3.0'
compile 'com.Android.support:cardview-v7:23.3.0'
compile 'com.Android.support:recyclerview-v7:23.3.0'
compile 'com.Android.support:support-v4:23.3.0'
compile 'com.Android.support:support-v13:23.3.0'
compile 'com.google.Android.gms:play-services-location:8.4.0'
compile 'com.google.Android.gms:play-services-analytics:8.4.0'
compile 'com.google.Android.gms:play-services-gcm:8.4.0'
...(and then the rest of my dependecies)
}
バージョンをアップグレードすると役立つと思いました。ここに私がアップグレードしたものがあります:
com.google.gms:google-services:2.1.0 -> com.google.gms:google-services:3.0.0
com.google.Android.gms:play-services-XXX:8.4.0' -> com.google.Android.gms:play-services-XXX:9.0.0
アプリケーションはクラッシュしますが、別の方法でクラッシュします。最初に以下を記録しますが、クラッシュしません。
Firebase API initialization failure.
Java.lang.reflect.InvocationTargetException
at Java.lang.reflect.Method.invoke(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:372)
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.zzbu(Unknown Source)
at com.google.firebase.provider.FirebaseInitProvider.onCreate(Unknown Source)
at Android.content.ContentProvider.attachInfo(ContentProvider.Java:1696)
at Android.content.ContentProvider.attachInfo(ContentProvider.Java:1671)
at com.google.firebase.provider.FirebaseInitProvider.attachInfo(Unknown Source)
at Android.app.ActivityThread.installProvider(ActivityThread.Java:4999)
at Android.app.ActivityThread.installContentProviders(ActivityThread.Java:4594)
at Android.app.ActivityThread.handleBindApplication(ActivityThread.Java:4534)
at Android.app.ActivityThread.access$1500(ActivityThread.Java:151)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1364)
at Android.os.Handler.dispatchMessage(Handler.Java:102)
at Android.os.Looper.loop(Looper.Java:135)
at Android.app.ActivityThread.main(ActivityThread.Java:5254)
at Java.lang.reflect.Method.invoke(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:372)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:903)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:698)
Caused by: 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.firebase.iid.zzg.zzeC(Unknown Source)
at com.google.firebase.iid.zzg.<init>(Unknown Source)
at com.google.firebase.iid.zzg.<init>(Unknown Source)
at com.google.firebase.iid.zzd.zzb(Unknown Source)
at com.google.firebase.iid.FirebaseInstanceId.getInstance(Unknown Source)
at Java.lang.reflect.Method.invoke(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:372)
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.zzbu(Unknown Source)
at com.google.firebase.provider.FirebaseInitProvider.onCreate(Unknown Source)
at Android.content.ContentProvider.attachInfo(ContentProvider.Java:1696)
at Android.content.ContentProvider.attachInfo(ContentProvider.Java:1671)
at com.google.firebase.provider.FirebaseInitProvider.attachInfo(Unknown Source)
at Android.app.ActivityThread.installProvider(ActivityThread.Java:4999)
at Android.app.ActivityThread.installContentProviders(ActivityThread.Java:4594)
at Android.app.ActivityThread.handleBindApplication(ActivityThread.Java:4534)
at Android.app.ActivityThread.access$1500(ActivityThread.Java:151)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1364)
at Android.os.Handler.dispatchMessage(Handler.Java:102)
at Android.os.Looper.loop(Looper.Java:135)
at Android.app.ActivityThread.main(ActivityThread.Java:5254)
at Java.lang.reflect.Method.invoke(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:372)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:903)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:698)
GCM登録をトリガーするアプリ内を移動した後、クラッシュする前にこの行とともに以前と同じスタックを取得します。
E/FA: Task exception on worker thread: 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): com.google.Android.gms.measurement.internal.zzt.zzEd(Unknown Source)
そのため、問題は、サポートライブラリの古いバージョンを含む依存関係があることです。このスレッドをチェックしてください:
Android UrbanAirshipがテイクオフでクラッシュする
これを行うと(スレッドから)役立つ場合があります:
configurations.all {
resolutionStrategy {
force 'com.Android.support:design:23.4.0'
force 'com.Android.support:support-v4:23.4.0'
force 'com.Android.support:appcompat-v7:23.4.0'
}
}
これを試して解決します
configurations.all {
resolutionStrategy {
force 'com.Android.support:design:23.4.0'
force 'com.Android.support:support-v4:23.4.0'
force 'com.Android.support:appcompat-v7:23.4.0'
}
}
それでも問題がある場合は、次のように解決できます。
build.gradleのplay-services依存関係を更新しました
dependencies {
compile 'com.google.Android.gms:play-services:9.0.0'}
バージョン競合があれば、これをbuild.gradle(プロジェクトgradle)に追加して修正します
dependencies {
classpath 'com.google.gms:google-services:3.0.0'}
更新する可能性があります27:
最初の編集で言及した非互換性を修正するための更新(version 9.0.1
)をリリースしました。
依存関係を更新し、これがまだ問題であるかどうかをお知らせください。
ありがとう!
元の回答5月20日:
Google PlayサービスSDKのバージョン9.0.0には、サポートライブラリバージョン24.x(Android-Nをサポートするためにリリースされたバージョン)との非互換性が含まれています
使用していることを確認してください:
dependencies {
compile 'com.Android.support:appcompat-v7:23.3.0'
}
com.Android.support:appcompat-v7:24.*
ではありません
すでにAndroid Support Repositoryを更新している場合は、sdkパスのm2repositoryフォルダーを置き換えて元に戻します。 。
最初のダウンロードm2repository:
https://dl-ssl.google.com/Android/repository/Android_m2repository_r31.Zip
GCMライブラリを更新するだけで、問題が解決します。
compile "com.google.Android.gms:play-services-gcm:9.2.0"