カスタムUncaughtExceptionHandlerを使用してFirebaseCrashlyticsをアップグレードする

Truong Hieu

作業中Update your apps to use latest Firebase Crashlytics SDKs before November 15, 2020、カスタムをアクティブ化した後UncaughtExceptionHandler、Crashlyticsにクラッシュが送信されなくなりました。

以下のコードでは、の中onCreate()設定しましたApplication

        FirebaseCrashlytics crashlytics = FirebaseCrashlytics.getInstance();
        crashlytics.setCrashlyticsCollectionEnabled(!BuildConfig.DEBUG); // only release able to send.
        crashlytics.sendUnsentReports(); // send reports
        Thread.setDefaultUncaughtExceptionHandler((t, e) -> {
            FirebaseCrashlytics.getInstance().recordException(e); // record exception.
            // below things are restart app when crash appeared.
            PackageManager packageManager = getPackageManager();
            Intent intent = packageManager.getLaunchIntentForPackage(getPackageName());
            if (intent != null) {
                ComponentName componentName = intent.getComponent();
                Intent mainIntent = Intent.makeRestartActivityTask(componentName);
                startActivity(mainIntent);
                Runtime.getRuntime().exit(0);
            }
        });

カスタムを削除するとUncaughtExceptionHandler、Crashlyticsにレポートできます。

以下のコードは、Fabricライブラリを使用するときに完全に機能します。https://stackoverflow.com/a/49266303/4316327

        CrashlyticsCore core = new CrashlyticsCore.Builder()
                .disabled(BuildConfig.DEBUG)
                .build();
        Fabric.with(new Fabric.Builder(this).kits(new Crashlytics.Builder()
                .core(core).build()).initializationCallback(new InitializationCallback<Fabric>() {
            @Override
            public void success(Fabric fabric) {
                Thread.setDefaultUncaughtExceptionHandler((t, e) -> {
                    LogWrapper.logException(e);
                    PackageManager packageManager = getPackageManager();
                    Intent intent = packageManager.getLaunchIntentForPackage(getPackageName());
                    if (intent != null) {
                        ComponentName componentName = intent.getComponent();
                        Intent mainIntent = Intent.makeRestartActivityTask(componentName);
                        startActivity(mainIntent);
                        Runtime.getRuntime().exit(0);
                    }
                });
            }

            @Override
            public void failure(Exception e) {
                e.printStackTrace();
            }
        }).build());

これに関する解決策はありますか?どんな助けでも大歓迎です。どうもありがとうございます。

Truong Hieu

解決策はここに掲載されています変更したコードを探している人のために、ここに貼り付けます。

以下のコードはJavaで書かれています。Kotlinについては、元の投稿にアクセスしてください。

public class NewCrashHandlerContentProvider extends ContentProvider {
    public static final String TAG = "NewCrashHandler";
    static long PRE_DELAY_MILLIS = 3000L;
    static long POST_DELAY_MILLIS = 3000L;

    public static void initializeAfterFirebaseContentProvider() {
        Thread.setDefaultUncaughtExceptionHandler(new PreFirebaseCrashHandler(Thread.getDefaultUncaughtExceptionHandler()));
    }

    @Override
    public boolean onCreate() {
        try {
            Log.i(TAG, "+onCreate()");
            Thread.setDefaultUncaughtExceptionHandler(new PostFirebaseCrashHandler(Thread.getDefaultUncaughtExceptionHandler()));
            return true;
        }finally {
            Log.i(TAG, "-onCreate()");
        }
    }

    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
        return null;
    }

    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        return null;
    }

    @Nullable
    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
        return null;
    }

    @Override
    public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
        return 0;
    }

    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
        return 0;
    }


    static class PreFirebaseCrashHandler implements Thread.UncaughtExceptionHandler {
        Thread.UncaughtExceptionHandler previousUncaughtExceptionHandler;
        public static final String TAG = "PreFirebaseCrashHandler";

        public PreFirebaseCrashHandler(Thread.UncaughtExceptionHandler previousUncaughtExceptionHandler) {
            this.previousUncaughtExceptionHandler = previousUncaughtExceptionHandler;
        }

        @Override
        public void uncaughtException(@NonNull Thread t, @NonNull Throwable e) {
            LogWrapper.logException(e);
            try {
                // my own logic
                Thread.sleep(PRE_DELAY_MILLIS);
            }catch (Throwable throwable) {
                LogWrapper.e(TAG, throwable.getLocalizedMessage());
            } finally {
                previousUncaughtExceptionHandler.uncaughtException(t,e);
            }
        }
    }

    static class PostFirebaseCrashHandler implements Thread.UncaughtExceptionHandler {
        Thread.UncaughtExceptionHandler previousUncaughtExceptionHandler;
        public static final String TAG = "PostFirebaseCrashHandler";

        public PostFirebaseCrashHandler(Thread.UncaughtExceptionHandler previousUncaughtExceptionHandler) {
            this.previousUncaughtExceptionHandler = previousUncaughtExceptionHandler;
        }

        @Override
        public void uncaughtException(@NonNull Thread t, @NonNull Throwable e) {
            LogWrapper.e(TAG, "+uncaughtException($thread, $throwable)");
            try {
                Thread.sleep(POST_DELAY_MILLIS);
            }catch (Throwable throwable) {
                LogWrapper.e(TAG, throwable.getLocalizedMessage());
            }finally {
                previousUncaughtExceptionHandler.uncaughtException(t,e);
            }
            LogWrapper.e(TAG, e.getLocalizedMessage());
        }
    }

}

アプリケーションファイルに、次のonCreate()メソッドを書き込みます

NewCrashHandlerContentProvider.initializeAfterFirebaseContentProvider();

また、更新することを忘れないでください manifests

<provider
            android:authorities="${applicationId}"
            android:name=".utils.NewCrashHandlerContentProvider"
            android:exported="false"
            android:initOrder="101"
            android:grantUriPermissions="false"/>

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

カスタムUncaughtExceptionHandlerを使用してFirebaseクラッシュレポートとカスタムアプリケーションクラスを処理する

分類Dev

xamarin.formsでfirebasecrashlyticsをアップグレードする方法

分類Dev

カスタムスタイリングを使用してブートストラップグリッドレイアウトを印刷する

分類Dev

アプリケーションのすべてのスレッドに対して1つのグローバルUncaughtExceptionHandlerを定義する

分類Dev

Field()のカスタム実装を必要とするカスタムフォームを使用してフィールドをアップロードする

分類Dev

Carrierwaveを使用してカスタムS3メタデータをアップロードする方法

分類Dev

NVIDIAドライバーを使用しているシステムでカーネルを手動でアップグレードするのは安全ですか?

分類Dev

Laravel-ストレージを使用して画像をアップロードするときにカスタム名を作成する

分類Dev

quantedaを使用してカスタムストップワードとフレーズを削除する

分類Dev

FirebaseCrashlyticsプラットフォームを介してテスターを追加する

分類Dev

upload-symbolsを使用してFirebaseCrashlyticsにappDsyms.zipをアップロードする正しい方法

分類Dev

すでにリリースされているMSIのアップグレード中のカスタムアクションを抑制します

分類Dev

Wordpressで、ファイルアップロードオプションを使用してカスタムフォームをコーディングし、MySqlにレコードを保存するにはどうすればよいですか?

分類Dev

カスタムドローアブルを使用してプログラムでスクリーンショットを作成する方法

分類Dev

カスタム列とカスタムオーダーを使用してC#でデータグリッドのレポートを作成する

分類Dev

テレグラムボットAPIを使用してPythonで垂直カスタムキーボードレイアウトをプログラムで作成するにはどうすればよいですか?

分類Dev

gcloudコマンドからGPUを使用してインスタンスをアップグレードする

分類Dev

Google ストレージ バケットを指すカスタム サブドメインを使用して SSL アプリ エンジンを追加する

分類Dev

jQueryextendメソッドを使用して要素またはクラスセレクターのカスタムプラグインを作成する方法

分類Dev

スレッドを使用してリーダー/ライタープログラムを実装する方法

分類Dev

カスタムキーボードショートカットを使用してフォーカスのあるプログラムを強制終了する方法

分類Dev

カスタムリンク構造を使用してSquarespaceにファイルをアップロードする

分類Dev

greendaoでOpenHelperを使用してデータベースをアップグレードする

分類Dev

グーグルタグマネージャーを使用してカスタムポップアップを追加する

分類Dev

Extjs5を使用して、ツリーからグリッドにカスタムドラッグアンドドロップします。

分類Dev

投稿タイプ名とは異なるアーカイブスラッグを使用してカスタム投稿タイプを作成する方法

分類Dev

カスタムデータとレイアウトプロパティを使用してプログラムでアイコンを作成する

分類Dev

Mapbox gljsを使用してカスタムマーカーにホバリングする際のポップアップを追加する

分類Dev

カスタムフォントをアップロードしてAngular6で動的に使用する方法

Related 関連記事

  1. 1

    カスタムUncaughtExceptionHandlerを使用してFirebaseクラッシュレポートとカスタムアプリケーションクラスを処理する

  2. 2

    xamarin.formsでfirebasecrashlyticsをアップグレードする方法

  3. 3

    カスタムスタイリングを使用してブートストラップグリッドレイアウトを印刷する

  4. 4

    アプリケーションのすべてのスレッドに対して1つのグローバルUncaughtExceptionHandlerを定義する

  5. 5

    Field()のカスタム実装を必要とするカスタムフォームを使用してフィールドをアップロードする

  6. 6

    Carrierwaveを使用してカスタムS3メタデータをアップロードする方法

  7. 7

    NVIDIAドライバーを使用しているシステムでカーネルを手動でアップグレードするのは安全ですか?

  8. 8

    Laravel-ストレージを使用して画像をアップロードするときにカスタム名を作成する

  9. 9

    quantedaを使用してカスタムストップワードとフレーズを削除する

  10. 10

    FirebaseCrashlyticsプラットフォームを介してテスターを追加する

  11. 11

    upload-symbolsを使用してFirebaseCrashlyticsにappDsyms.zipをアップロードする正しい方法

  12. 12

    すでにリリースされているMSIのアップグレード中のカスタムアクションを抑制します

  13. 13

    Wordpressで、ファイルアップロードオプションを使用してカスタムフォームをコーディングし、MySqlにレコードを保存するにはどうすればよいですか?

  14. 14

    カスタムドローアブルを使用してプログラムでスクリーンショットを作成する方法

  15. 15

    カスタム列とカスタムオーダーを使用してC#でデータグリッドのレポートを作成する

  16. 16

    テレグラムボットAPIを使用してPythonで垂直カスタムキーボードレイアウトをプログラムで作成するにはどうすればよいですか?

  17. 17

    gcloudコマンドからGPUを使用してインスタンスをアップグレードする

  18. 18

    Google ストレージ バケットを指すカスタム サブドメインを使用して SSL アプリ エンジンを追加する

  19. 19

    jQueryextendメソッドを使用して要素またはクラスセレクターのカスタムプラグインを作成する方法

  20. 20

    スレッドを使用してリーダー/ライタープログラムを実装する方法

  21. 21

    カスタムキーボードショートカットを使用してフォーカスのあるプログラムを強制終了する方法

  22. 22

    カスタムリンク構造を使用してSquarespaceにファイルをアップロードする

  23. 23

    greendaoでOpenHelperを使用してデータベースをアップグレードする

  24. 24

    グーグルタグマネージャーを使用してカスタムポップアップを追加する

  25. 25

    Extjs5を使用して、ツリーからグリッドにカスタムドラッグアンドドロップします。

  26. 26

    投稿タイプ名とは異なるアーカイブスラッグを使用してカスタム投稿タイプを作成する方法

  27. 27

    カスタムデータとレイアウトプロパティを使用してプログラムでアイコンを作成する

  28. 28

    Mapbox gljsを使用してカスタムマーカーにホバリングする際のポップアップを追加する

  29. 29

    カスタムフォントをアップロードしてAngular6で動的に使用する方法

ホットタグ

アーカイブ