web-dev-qa-db-ja.com

開発中にCrashlyticsを無効にする方法

開発中にCrashlytics Android SDKをオフにする簡単な方法はありますか?

バカなことをするたびにクラッシュを送信したくない

一方、Crashlytics.start()をコメントアウトしたくないので、コメントを外してコミットするのを忘れる可能性があります

225
Michael

Crashlyticsのマークはこちら。デバッグビルドの実行中にCrashlyticsを無効にする方法は次のとおりです。

  1. デバッグおよびリリースビルドに別のAndroid:versionStringを使用し、デバッグバージョンのCrashlytics Webダッシュボードからクラッシュレポートを無効にします。

  2. デバッグフラグをチェックするifステートメントでCrashlytics.start()の呼び出しをラップします。カスタムフラグまたはここで提案されているようなアプローチのいずれかを使用できます: APKが署名されているか「デバッグビルド」されているかどうかを確認する方法?

163
marcr

Crashlyticsのソリューションを見つけました(Fabric統合を使用)

アプリケーションクラスonCreate()内に次のコードを配置します

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

編集:

Crashalitics 2.3以降では、これは非推奨です。正しいコードは次のとおりです。

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

または

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

Crashlytics非推奨のメソッドdisabled() からコピー)


EDIT2:

オプションでこれをgradleのbuildTypeに追加することもできます。このコマンドは、crashlyticsマッピングファイルの送信を無効にし、各ビルドのIDを生成します。これにより、これらのフレーバーのgradleビルドが高速化されます。 (実行時にCrashlyticsが無効になることはありません。) マイクBの回答はこちら

buildTypes {
    release {
           ....
    }
    debug {
        ext.enableCrashlytics = false
    }
}
367
xialin

選択された答えはもう正しくありません。 Google 統合を変更 Crashlytics。私の現在のバージョンは2.9.1であり、私がしなければならない唯一のことは、implementation 'com.crashlytics.sdk.Android:crashlytics:2.9.1'をGradleファイルに追加することです。これ以上のことは必要ありませんが、これはCrashlyticsが常に実行されていることを意味します。

ソリューション1

リリースバージョンでのみCrashlyticsをコンパイルします。

dependencies {
   ...
   releaseImplementation 'com.crashlytics.sdk.Android:crashlytics:2.9.1' // update version
}

ソリューション2

追加でCrashlyticsを構成する を実行する場合、Crashlyticsクラスがデバッグビルドに見つからないため、ソリューション1は機能しません。したがって、Gradleの実装を次のように変更します。

implementation 'com.crashlytics.sdk.Android:crashlytics:2.9.1' // update version

次に、マニフェストに移動し、次のmeta-dataタグをapplicationタグ内に追加します。

<application
        Android:name="...>

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

...

</application>

Launch-Activityに追加します(すべてのアクティビティではなく、1回だけ必要です)

if (!BuildConfig.DEBUG) { // only enable bug tracking in release version
   Fabric.with(this, new Crashlytics());
}

これにより、リリースバージョンでのみCrashlyticsが有効になります。 Crashlyticsを構成するときにBuildConfig.DEBUGも確認してください。

if (!BuildConfig.DEBUG) {
   Crashlytics.setUserIdentifier("HASH_ID");
}
34
Spipau

Gradleを使用する場合、これをフレーバーに追加するだけです。

ext.enableCrashlytics = false
27
user1998494

最新のドキュメントをご覧ください。 https://docs.fabric.io/Android/crashlytics/build-tools.html#gradle-advanced-setup

Build.gradeでext.enableCrashlytics = falseを追加する以外に、必要なことは、

Crashlytics crashlyticsKit = new Crashlytics.Builder()
    .core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build())
    .build();

// Initialize Fabric with the debug-disabled crashlytics.
Fabric.with(this, crashlyticsKit);
26

this が最も簡単な解決策であることがわかりました。

    release {
        ...
        buildConfigField 'Boolean', 'enableCrashlytics', 'true'
    }
    debug {
        buildConfigField 'Boolean', 'enableCrashlytics', 'false'
    }

上記の行は、enableCrashlyticsファイルにBuildConfigという静的ブールフィールドを作成します。これを使用して、Fabricを開始するかどうかを決定できます。

    if (BuildConfig.enableCrashlytics)
        Fabric.with(this, new Crashlytics());

注:この方法では、Fabricsはリリースビルドでのみ初期化されます(上記のコードに示すように)。これは、以下に示すように、Fabricsが初期化されているかどうかを確認するCrashlyticsクラスのifクラスのstaticメソッドへの呼び出しを配置する必要があることを意味します。

if (Fabric.isInitialized())
    Crashlytics.logException(e);

そうしないと、エミュレータでのテスト時にアプリがMust Initialize Fabric before using singleton()エラーでクラッシュします。

23
fahmy

これをMyApplication#onCreate()で使用します

if (!BuildConfig.DEBUG) Crashlytics.start(this);

EDITFabricにアップグレードした場合は、代わりにこれ answer を使用してください。

14
Austyn Mahoney

Googleによると、このコードを使用してCrashlyticsを無効にし、ビルドプロセスも改善します。

enter image description here

参照- https://developer.Android.com/studio/build/optimize-your-build

ここにはたくさんの良い答えがありますが、私のテストでは、クラッシュログがまだ非常に有用である社内ベータおよびラボ外のテストのためにデバッグビルドを使用します。 OPのように、私が望んでいたのは、アクティブな開発中にそれらを無効にして、クラッシュを頻繁に引き起こし、迅速に解決することだけでした。

すべてのデバッグクラッシュを削除するのではなく、次のコードを使用してデバイスが開発マシンに接続されている間のみレポートを無効にすることを選択できます。

if (!Debug.isDebuggerConnected()) {
    Fabric.with(this, new Crashlytics());
}
6

別のマニフェストファイルを必要としないため、私が好きな別の簡単なソリューション:

ステップ1-build.gradleでマニフェストプレースホルダーを定義する

Android {
    ...
    buildTypes {
        release {
            manifestPlaceholders = [crashlytics:"true"]
        }
        debug {
            manifestPlaceholders = [crashlytics:"false"]
        }
    }
    ...
}

ステップ2-AndroidManifest.xmlで使用する

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

すべてのクラッシュ(デバッグビルドとリリースビルド用)をキャプチャしたいが、Crashlyticsダッシュボードでそれらを分離したい場合、次のコード行をbuild.gradleに追加できます。

debug {
    versionNameSuffix "-DEBUG"
}

たとえば、アプリのversionNameが1.0.0の場合、リリースビルドは1.0.0としてタグ付けされ、デバッグビルドは1.0.0-DEBUGになります

6
Khronos

デバッグビルドでの迷惑なシンボルのアップロードを無効にすることもできます。

def crashlyticsUploadStoredDeobsDebug = "crashlyticsUploadStoredDeobsDebug"
def crashlyticsUploadDeobsDebug = "crashlyticsUploadDeobsDebug"
tasks.whenTaskAdded { task ->
    if (crashlyticsUploadStoredDeobsDebug.equals(task.name) ||
            crashlyticsUploadDeobsDebug.equals(task.name)) {

        println "Disabling $task.name."
        task.enabled = false
    }
}

アプリケーションモジュールのbuild.gradleに配置するだけです。

5
Ariel Cabib

問題は、どのソリューションも最新のcrashlytics SDKで機能しないことです。 (2.9.0を使用しています)

プロジェクトにコンパイルされ、アプリケーションのonCreateを呼び出す前に実行されるため、コードで無効にすることはできません。したがって、他の解決策は簡単です-不要な場合はcrashlyticsをコンパイルしないでください。 build.gradleファイル内の「compile」コールを「releaseCompile」に置き換えます。

 releaseCompile('com.crashlytics.sdk.Android:crashlytics:2.9.0@aar') {
        transitive = true
    }
5
Kvant

Gradleを使用してビルドする場合の最新の最も簡単なバージョン:

if (!BuildConfig.DEBUG) {
    Fabric.with(this, new Crashlytics());
}

Fabric for Crashlyticsの新しいビルトイン構文を使用し、Gradleビルドで自動的に動作します。

3
Björn Kechel

私が遭遇した奇妙な問題: xialin の回答(公式Webサイトにも表示されます)をたどりましたが、うまくいきませんでした。デバッグモードでもfalseに設定された静的DEBUG変数を含むFabricのパッケージでBuildConfigを参照していたことが判明しました。

したがって、前述の解決策に従ってもデバッグレポートが表示される場合は、これを参照していることを確認してください。

import com.yourpackagename.BuildConfig;

そしてこれではありません:

import io.fabric.sdk.Android.BuildConfig;    
3
Neria Nachum

BuildConfig.DEBUGが正しくセットアップされないことが心配な場合は、代わりにApplicationInfoを使用してください。

boolean isDebug = ( mAppContext.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE ) != 0;
Crashlytics crashlytics = new Crashlytics.Builder().disabled( isDebug ).build();
Fabric.with( uIContext, crashlytics );
2
Vaiden

デバッグ可能なリリースビルドが必要な場合は、次の方法があります。

buildTypes {
    release {
        signingConfig signingConfigs.config
        debuggable true //-> debuggable release build
        minifyEnabled true
        multiDexEnabled false
        ext.enableCrashlytics = true
        proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        buildConfigField 'boolean', 'BUILD_TYPE_DEBUG', 'false'
    }
    debug {
        minifyEnabled false
        multiDexEnabled true
        ext.enableCrashlytics = false
        ext.alwaysUpdateBuildId = false
        // Disable fabric build ID generation for debug builds
        proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        buildConfigField 'boolean', 'BUILD_TYPE_DEBUG', 'true'
    }
}

debuggable trueを設定すると、BuildConfig.DEBUGがtrueで初期化されるため、BuildConfigクラスにその変数を追加しました。

初期化ファブリック:

Crashlytics crashlytics = new Crashlytics.Builder()
            // disable crash reporting in debug build types with custom build type variable
            .core(new CrashlyticsCore.Builder().disabled(BuildConfig.BUILD_TYPE_DEBUG).build())
            .build();

    final Fabric fabric = new Fabric.Builder(this)
            .kits(crashlytics)
            //enable debugging with debuggable flag in build type 
            .debuggable(BuildConfig.DEBUG)
            .build();

    // Initialize Fabric with the debug-disabled crashlytics.
    Fabric.with(fabric);
2

フレーバーを使用するか、構成をビルドします。 devビルド用に個別のビルド識別子を使用すると、すべてのクラッシュが引き続き個別のアプリに進みます。ビルドをピアと共有する場合、またはデバッガーなしでビルドを使用する場合に便利です。このようなもの -

    productFlavors {
    dev {
        applicationId "io.yourapp.developement"
    }
    staging {
        applicationId "io.yourapp.staging"
    }

    production {
        applicationId "io.yourapp.app"
    }
2
ribhu

2019年の回答

リリースではCrashlyticsのみを有効にし、デバッグでは2時間無効にしようと試みました。Firebaseコンソールをチェックして、例外がアップロードされたかどうかを確認しました。

これを行うには2つの方法があります。

オプション1

動作しますが、デバッグビルドでCrashlyticsメソッドを呼び出すと、アプリはcrashになります。

app/build.gradle

Android {
    buildTypes {
        release {
            manifestPlaceholders = [crashlyticsEnabled: true]
        }
        release {
            manifestPlaceholders = [crashlyticsEnabled: false]
        }

AndroidManifest.xml

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

オプション2

最初にBuildConfig.DEBUGをチェックせずにCrashlyticsメソッドを呼び出すことができる場合の代替手段。このセットアップを使用すると、Crashlytics.logException()などのメソッドを安全に呼び出すことができます-デバッグビルドでは何もしません。デバッグでレポートがアップロードされていません。

app/build.gradle

Android {
    buildTypes {
        release {
            ext.enableCrashlytics = true
        }
        release {
            ext.enableCrashlytics = false
        }

AndroidManifest.xml

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

アプリケーションonCreate()

val crashlytics = Crashlytics.Builder()
    .core(CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build())
    .build()
Fabric.with(this, crashlytics)
2

ファブリックのisDebuggable()メソッドを使用できます。

import static io.fabric.sdk.Android.Fabric.isDebuggable;

if(! isDebuggable()){
    // set Crashlytics ... 
}

ハッピーコーディング:)

1
sadiq

デバッグモードには専用のマニフェストファイルを使用できます(Crashlytics 2.9.7で動作します):

ファイルapp/src/debug/AndroidManifest.xmlを作成し、次を追加します。

<application>

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

</application>

このメタデータ要素は、通常のAndroidManifest.xmlではなく、debug/AndroidManifest.xml onlyに配置する必要があることに注意してください。

CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()を使用するソリューションは機能しませんでした。Application.onCreate()が呼び出される前、またはアクティビティが開始される前にcrashlyticsがCrashlyticsInitProviderによって初期化されることがわかりました。ファブリックは既に初期化されているため、効果はありません。

1
josias
  1. これをアプリのbuild.gradleに追加します。

    Android {
        buildTypes {
            debug {
              // Disable fabric build ID generation for debug builds
              ext.enableCrashlytics = false
              ...
    
  2. 実行時にCrashlyticsキットを無効にします。そうでない場合、Crashlyticsキットはエラーをスローします。

    // Set up Crashlytics, disabled for debug builds
    // Add These lines in your app Application class onCreate method
    
    Crashlytics crashlyticsKit = new Crashlytics.Builder()
        .core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build())
        .build();
    
    // Initialize Fabric with the debug-disabled crashlytics.
    Fabric.with(this, crashlyticsKit);
    
  3. AndroidManifest.xmlで、追加します

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

私のためのこの仕事:

    releaseCompile  'com.crashlytics.sdk.Android:crashlytics:2.9.9'

およびbuildTypesで:

debug {
ext.enableCrashlytics = false
}
0

IDEでのみ実行したい場合の別の方法は、プラグインからログアウトすることです。どうやら、再度ログインせずにビルドを生成している間、レポートの送信を停止するようです。

0
neteinstein

ステップ1:build.gradeで

buildTypes {
        debug {
            debuggable true
            manifestPlaceholders = [enableCrashlytic:false]
        }
        release {
            debuggable false
            manifestPlaceholders = [enableCrashlytic:true]
        }
    }

ステップ2:マニフェスト内

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

ステップ3:アプリケーションまたは最初のアクティビティ

private void setupCrashReport() {
        if (BuildConfig.DEBUG) return;
        Fabric.with(this, new Crashlytics());
    }

手順3が必要かどうかはわかりませんが、リリースバージョンがクラッシュすることなく機能することを確認します。ソース: https://firebase.google.com/docs/crashlytics/customize-crash-reports#enable_opt-in_reporting

0
thanhbinh84