開発中にCrashlytics Android SDKをオフにする簡単な方法はありますか?
バカなことをするたびにクラッシュを送信したくない
一方、Crashlytics.start()
をコメントアウトしたくないので、コメントを外してコミットするのを忘れる可能性があります
Crashlyticsのマークはこちら。デバッグビルドの実行中にCrashlyticsを無効にする方法は次のとおりです。
デバッグおよびリリースビルドに別のAndroid:versionStringを使用し、デバッグバージョンのCrashlytics Webダッシュボードからクラッシュレポートを無効にします。
デバッグフラグをチェックするifステートメントでCrashlytics.start()の呼び出しをラップします。カスタムフラグまたはここで提案されているようなアプローチのいずれかを使用できます: APKが署名されているか「デバッグビルド」されているかどうかを確認する方法?
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
}
}
選択された答えはもう正しくありません。 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");
}
Gradleを使用する場合、これをフレーバーに追加するだけです。
ext.enableCrashlytics = false
最新のドキュメントをご覧ください。 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);
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()
エラーでクラッシュします。
これをMyApplication#onCreate()
で使用します
if (!BuildConfig.DEBUG) Crashlytics.start(this);
EDITFabricにアップグレードした場合は、代わりにこれ answer を使用してください。
Googleによると、このコードを使用してCrashlyticsを無効にし、ビルドプロセスも改善します。
参照- https://developer.Android.com/studio/build/optimize-your-build
ここにはたくさんの良い答えがありますが、私のテストでは、クラッシュログがまだ非常に有用である社内ベータおよびラボ外のテストのためにデバッグビルドを使用します。 OPのように、私が望んでいたのは、アクティブな開発中にそれらを無効にして、クラッシュを頻繁に引き起こし、迅速に解決することだけでした。
すべてのデバッグクラッシュを削除するのではなく、次のコードを使用してデバイスが開発マシンに接続されている間のみレポートを無効にすることを選択できます。
if (!Debug.isDebuggerConnected()) {
Fabric.with(this, new Crashlytics());
}
別のマニフェストファイルを必要としないため、私が好きな別の簡単なソリューション:
ステップ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}" />
すべてのクラッシュ(デバッグビルドとリリースビルド用)をキャプチャしたいが、Crashlyticsダッシュボードでそれらを分離したい場合、次のコード行をbuild.gradleに追加できます。
debug {
versionNameSuffix "-DEBUG"
}
たとえば、アプリのversionNameが1.0.0の場合、リリースビルドは1.0.0としてタグ付けされ、デバッグビルドは1.0.0-DEBUGになります
デバッグビルドでの迷惑なシンボルのアップロードを無効にすることもできます。
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
に配置するだけです。
問題は、どのソリューションも最新のcrashlytics SDKで機能しないことです。 (2.9.0を使用しています)
プロジェクトにコンパイルされ、アプリケーションのonCreateを呼び出す前に実行されるため、コードで無効にすることはできません。したがって、他の解決策は簡単です-不要な場合はcrashlyticsをコンパイルしないでください。 build.gradleファイル内の「compile」コールを「releaseCompile」に置き換えます。
releaseCompile('com.crashlytics.sdk.Android:crashlytics:2.9.0@aar') {
transitive = true
}
Gradleを使用してビルドする場合の最新の最も簡単なバージョン:
if (!BuildConfig.DEBUG) {
Fabric.with(this, new Crashlytics());
}
Fabric for Crashlyticsの新しいビルトイン構文を使用し、Gradleビルドで自動的に動作します。
私が遭遇した奇妙な問題: xialin の回答(公式Webサイトにも表示されます)をたどりましたが、うまくいきませんでした。デバッグモードでもfalseに設定された静的DEBUG変数を含むFabricのパッケージでBuildConfig
を参照していたことが判明しました。
したがって、前述の解決策に従ってもデバッグレポートが表示される場合は、これを参照していることを確認してください。
import com.yourpackagename.BuildConfig;
そしてこれではありません:
import io.fabric.sdk.Android.BuildConfig;
BuildConfig.DEBUG
が正しくセットアップされないことが心配な場合は、代わりにApplicationInfo
を使用してください。
boolean isDebug = ( mAppContext.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE ) != 0;
Crashlytics crashlytics = new Crashlytics.Builder().disabled( isDebug ).build();
Fabric.with( uIContext, crashlytics );
デバッグ可能なリリースビルドが必要な場合は、次の方法があります。
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);
フレーバーを使用するか、構成をビルドします。 devビルド用に個別のビルド識別子を使用すると、すべてのクラッシュが引き続き個別のアプリに進みます。ビルドをピアと共有する場合、またはデバッガーなしでビルドを使用する場合に便利です。このようなもの -
productFlavors {
dev {
applicationId "io.yourapp.developement"
}
staging {
applicationId "io.yourapp.staging"
}
production {
applicationId "io.yourapp.app"
}
2019年の回答
リリースではCrashlyticsのみを有効にし、デバッグでは2時間無効にしようと試みました。Firebaseコンソールをチェックして、例外がアップロードされたかどうかを確認しました。
これを行うには2つの方法があります。
動作しますが、デバッグビルドで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}" />
最初に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)
ファブリックのisDebuggable()メソッドを使用できます。
import static io.fabric.sdk.Android.Fabric.isDebuggable;
if(! isDebuggable()){
// set Crashlytics ...
}
ハッピーコーディング:)
デバッグモードには専用のマニフェストファイルを使用できます(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によって初期化されることがわかりました。ファブリックは既に初期化されているため、効果はありません。
これをアプリのbuild.gradleに追加します。
Android {
buildTypes {
debug {
// Disable fabric build ID generation for debug builds
ext.enableCrashlytics = false
...
実行時に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);
AndroidManifest.xmlで、追加します
<meta-data
Android:name="firebase_crashlytics_collection_enabled"
Android:value="false" />
私のためのこの仕事:
releaseCompile 'com.crashlytics.sdk.Android:crashlytics:2.9.9'
およびbuildTypesで:
debug {
ext.enableCrashlytics = false
}
IDEでのみ実行したい場合の別の方法は、プラグインからログアウトすることです。どうやら、再度ログインせずにビルドを生成している間、レポートの送信を停止するようです。
ステップ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