web-dev-qa-db-ja.com

Firebaseを使用したFabricのCrashlyticsは、DEBUGビルドでは無効にできません

Firebase経由でFabricのCrashlyticsを利用するアプリがあります。以下は、アプリケーションonCreateで最初に実行されるものです。

CrashlyticsCore crashlyticsCore = new CrashlyticsCore.Builder()
    .disabled(BuildConfig.DEBUG)
    .build();
Fabric.with(this, new Crashlytics.Builder().core(crashlyticsCore).build());

それにもかかわらず、クラッシュはDEBUG == trueモード。

次のバージョンを使用します

私のbuild.gradle classpath "io.fabric.tools:gradle:1.25.1"

私のapp/build.gradle implementation "com.crashlytics.sdk.Android:crashlytics:2.9.1"

残念ながら、クラッシュはまだ報告されています。アイデア、私が間違っていることは何ですか?

24
peshkira

Firebase Crashlyticsのドキュメント は、アプリセッションでレポートを有効にすると、無効にできないことを説明しています。

デフォルトでは、ContentProviderインスタンスが作成される前に実行されるCrashlyticsInitProviderという名前のApplicationでCrashlyticsレポートが有効になっています。 CrashlyticsInitProviderは、デフォルトでtrueであるメタデータ値_firebase_crashlytics_collection_enabled_に基づいてレポートを有効または無効にします。

レポートを無効にする場合は、マニフェストメタデータが存在し、falseに設定されていることが重要です。

_<meta-data
    Android:name="firebase_crashlytics_collection_enabled"
    Android:value="false" />
_

アプリの初期化中にlogcatでメッセージを確認します。

_CrashlyticsInitProvider: CrashlyticsInitProvider initialization successful
_

メッセージが存在する場合、_firebase_crashlytics_collection_enabled_はtrueです。メッセージが存在しない場合、メタデータを正常に設定してクラッシュレポートを無効にしました。

メタデータが見つからないかtrueに設定されている場合、Fabric.with(...)の呼び出しを使用してコード内のレポートを無効にすることはできません。

別の回答へのコメントで、メタデータを使用してレポートを無効にしようとしたが成功しなかったことを示しています。タイプミスをチェックし、宣言が_<application>_要素に正しく配置されていることを確認してください。私のテストでは、メタデータを使用してレポートを無効にし、実行時に有効にすることができます。

23
Bob Snyder

正解は Bob Snyder および niqueco によってすでに投稿されていますが、実際のリリースAPKをビルドするたびにメタデータ値を変更するのは面倒なようです。ここに解決策があります。いわゆる manifestPlaceholder を使用し、trueに応じてfalseor buildTypeに値を自動的に変更します。

アプリに次を追加しますbuild.gradle

Android {

    // ...

    buildTypes {
        debug {
            manifestPlaceholders = [enableCrashReporting:"false"]
        }
        release {
            manifestPlaceholders = [enableCrashReporting:"true"]
        }
    }

}

そしてこれをあなたのAndroidManifest.xml

<manifest ... >

    <application ...>

        // ...

        <meta-data Android:name="firebase_crashlytics_collection_enabled" Android:value="${enableCrashReporting}" />

    </application>

</manifest>

現在の値を確認するには、Merged Manifest tab AndroidManifest.xmlを開いたら。次のように表示されます。

Merged manifest meta-data value for crash reporting

78
reVerse

私はついに問題を発見しました。 Crashlyticsはコンテンツプロバイダーから初期化されるため、アプリケーションのonCreate()から無効にしようとする頃には遅すぎます。逆コンパイルされたコードを見てみると、マニフェストの<application>要素にメタデータを追加することで、その初期化を無効にできることがわかりました。

だから、私はこれをしています... app/src/debug/AndroidManifest.xmlにこれを追加しました

_<?xml version="1.0" encoding="utf-8"?><!--suppress ALL -->
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
   package="<your app package>">

   <application>
           <meta-data Android:name="firebase_crashlytics_collection_enabled" Android:value="false" />
   </application>

</manifest>
_

また、アプリモジュールのgradleビルドファイルでCrashlyticsを無効にして、次を追加しました。

_    debug {
        ext.enableCrashlytics = false
    }
_

驚いたことに、私はFabric.with(...)をする必要はありませんでした。上記で十分でした。

正常に機能しています。レポートはありません。

9
niqueco

アプリのbuild.gradleのCrashlyticsを無効にする必要があります。 デバッグビルドのCrashlyticsを無効にする

Android {
    buildTypes {
        debug {
          // Disable fabric build ID generation for debug builds
          ext.enableCrashlytics = false
          ...  
3
vm345

Android documentation Firebaseクラッシュレポートのカスタマイズ

オプトインレポートの有効化:デフォルトでは、Firebase Crashlyticsはアプリのすべてのユーザーのクラッシュレポートを自動的に収集します。ユーザーが送信するデータをより詳細に制御できるようにするには、代わりにオプトインレポートを有効にします。

これを行うには、自動収集を無効にし、オプトインユーザーに対してのみCrashlyticsを初期化する必要があります。

AndroidManifest.xmlファイルでメタデータタグを使用して自動収集をオフにします。

<meta-data
    Android:name="firebase_crashlytics_collection_enabled"
    Android:value="false" />

アプリのアクティビティの1つからCrashlyticsを初期化して、選択したユーザーのコレクションを有効にします。

Fabric.with(this, new Crashlytics());
2

Firebase Crashレポートを完全に無効にし、また追加する必要がない場合

com.crashlytics.sdk.Android:crashlytics:2.9.1

依存関係は、 @ reVerse の回答に従いますが、これをAndroidManifest.xmlにも追加します。

<application ...>

    // ...

    <meta-data 
            Android:name="firebase_crashlytics_collection_enabled" 
            Android:value="${enableCrashReporting}" />
    <meta-data
            Android:name="firebase_analytics_collection_deactivated"
            Android:value="true"/>
</application>
0
Phileo99