回答:
CrashlyticsのMarcはこちら。デバッグビルドの実行中にCrashlyticsを無効にする方法がいくつかあります。
デバッグビルドとリリースビルドに別のandroid:versionStringを使用し、デバッグバージョンのCrashlyticsウェブダッシュボードからクラッシュレポートを無効にします。
Crashlytics.start()の呼び出しを、デバッグフラグをチェックするifステートメントにラップします。カスタムフラグまたはここで提案されているようなアプローチのいずれかを使用できます:APKが署名されているか、または「デバッグビルド」されているかどうかを確認する方法?
BuildConfig.DEBUG
Gradleを使用してビルドする場合に使用する必要があります。常に適切に生成されます。
BuildConfig.DEBUG
ますか?
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:
オプションでこれをbuildType
イングラドルに追加することもできます。このコマンドは、crashlyticsマッピングファイルの送信を無効にし、ビルドごとにIDを生成することで、これらのフレーバーのGradleビルドを高速化します。(実行時にCrashlyticsを無効にすることはありません。)ここでMike Bの回答を参照してください。
buildTypes {
release {
....
}
debug {
ext.enableCrashlytics = false
}
}
ext.enableCrashlytics = false
2.5でも動作しません。実際には、それは決して機能しませんでした。ファブリックの前でも。
選ばれた答えはもはや正しくありません。Google はCrashlytics の統合を変更しました。私の現在のバージョンは、Gradleファイル2.9.1
に追加implementation 'com.crashlytics.sdk.android:crashlytics:2.9.1'
することだけです。他に必要なことはありませんが、これは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");
}
Enable collection for selected users by initializing Crashlytics from one of your app's activities
しかし、アプリケーションでCrashlyticsを初期化しても、それほど変化しないと思います。やってみましたか?それが機能する場合、私はそれを私の答えに追加できます。 firebase.google.com/docs/crashlytics/customize-crash-reports
firebase_crashlytics_collection_enabled
マニフェストでfalse に設定すると、コンソールにクラッシュが表示されません(v2.9.9を使用しています)。私はデバッグビルドの別々のマニフェストを追加することで、これを固定だからfirebase_crashlytics_collection_enabled=false
とtrue
解放のために
Gradleを使用する場合は、これをフレーバーに追加するだけです。
ext.enableCrashlytics = false
This app relies on Crashlytics.
"
最新のドキュメントをご覧ください。 https://docs.fabric.io/android/crashlytics/build-tools.html#gradle-advanced-setup。
ext.enableCrashlytics = false
あなたがする必要があるbuild.gradeの追加とは別に、
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 app relies on Crashlytics. Please sign up for access at
ext.enableCrashlytics = false
build.gradleに欠落していると思います。
buildTypes -> debug, also i'm applying the plugin via
「io.fabric'`:プラグインの適用
This app relies on Crashlytics. Please sign up for access at https://fabric.io/sign_up
私が見つかりました。これは最も簡単な解決策になります。
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
ブロックのクラスの静的メソッドへの呼び出しを配置する必要があります。
if (Fabric.isInitialized())
Crashlytics.logException(e);
そうMust Initialize Fabric before using singleton()
しないと、エミュレータでテストするときにアプリがエラーでクラッシュします。
2019回答
Crashlyticsをリリースでのみ有効にし、デバッグで2時間だけ無効にして、Firebaseコンソールで例外がアップロードされているかどうかを確認しました。
これを行う方法は2つあります。
機能しますが、Crashlytics
デバッグビルドでメソッドを呼び出すと、アプリがクラッシュしますます。
app / build.gradle
android {
buildTypes {
release {
manifestPlaceholders = [crashlyticsEnabled: true]
}
debug {
manifestPlaceholders = [crashlyticsEnabled: false]
}
AndroidManifest.xml
<manifest
<application
<meta-data
android:name="firebase_crashlytics_collection_enabled"
android:value="${crashlyticsEnabled}" />
最初にCrashlytics
チェックせずにメソッドを呼び出すことができる場合の代替手段BuildConfig.DEBUG
。この設定により、次のようなメソッドを安全に呼び出すことができます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)
android:value="false"
変更する必要があると思いますandroid:value="${enableCrashlytics}"
。じゃない?
これを MyApplication#onCreate()
if (!BuildConfig.DEBUG) Crashlytics.start(this);
編集 ファブリックにアップグレードした場合は、代わりにこの回答を使用してください。
BuildConfig
実行が保証されているGradleタスクによって生成されます。buildConfigField
カスタムフィールドの設定にも使用しており、それらは常に機能します。tools.android.com/recent/androidstudio045releasedもを使用することを示唆していますBuildConfig.DEBUG
。
グーグルによると、Crashlyticsを無効にするためにこのコードを使用し、ビルドプロセスも改善します。
参照-https://developer.android.com/studio/build/optimize-your-build
別のマニフェストファイルを必要としないため、私が好むもう1つの簡単なソリューション:
ステップ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}" />
デバッグビルドでは、煩わしいシンボルのアップロードを無効にすることもできます。
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
アプリケーションモジュールのに入れるだけです。
ここには多くの良い答えがありますが、私のテストでは、社内ベータ版のデバッグビルドと、クラッシュログが依然として非常に有用であり、それらを報告したいというラボ外のテストを使用しています。OPと同様に、私が頻繁にクラッシュを引き起こして迅速に解決しているアクティブな開発中は、それらを無効にすることだけが必要でした。
すべてのデバッグクラッシュを削除するのではなく、次のコードを使用してデバイスが開発マシンに接続されている間のみレポートを無効にすることを選択できます。
if (!Debug.isDebuggerConnected()) {
Fabric.with(this, new Crashlytics());
}
問題は、どのソリューションも最新のcrashlytics SDKで機能しないことです。(私は2.9.0を使用しています)
これは、プロジェクトにコンパイルされ、アプリケーションのonCreateを呼び出す前に実行されるため、コードで無効にすることはできません。したがって、他の解決策は簡単です-不要なときにcrashlyticsをコンパイルしないでください。build.gradleファイル内の「compile」呼び出しを「releaseCompile」に置き換えます。
releaseCompile('com.crashlytics.sdk.android:crashlytics:2.9.0@aar') {
transitive = true
}
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は、私は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);
ext.enableCrashlytics
ありext.alwaysUpdateBuildId
、その目的は何ですか?何か不足していますか?
デバッグモード専用のマニフェストファイルを使用できます(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にのみ配置する必要があることに注意してください。
を使用するソリューションCrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()
は機能しませんでした。Application.onCreate()が呼び出される前、またはアクティビティが開始される前に、CrashlyticsInitProviderによってcrashlyticsが初期化されることがわかりました。つまり、アプリケーションまたはアクティビティでファブリックを手動で初期化すると、ファブリックはすでに初期化されているため、効果があります。
ステップ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
私にとってこの作品:
releaseCompile 'com.crashlytics.sdk.android:crashlytics:2.9.9'
そしてbuildTypesで:
debug {
ext.enableCrashlytics = false
}
次のバージョンのcom.google.firebase:firebase-crashlytics:17.0.0でFirebase Crashlyticsを無効にするには、2つのオプションがあります。
<meta-data android:name="firebase_crashlytics_collection_enabled" android:value="false" />
または
FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true)
これをアプリの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" />
2020ポストファブリックアンサー
以下のコードをアプリケーションクラスに貼り付け、setCrashlyticsState
アプリケーションのonCreateからメソッドを呼び出します。オプションで、テストデバイスIDをdebugDevices
HashSetに、リリースモードでビルドしている場合でも、個人用デバイスを無視できるようにすることもできます。
注意。によって返されるデバイスIDは、一意または一定であることが保証されSettings.Secure.getString(getContext().getContentResolver(), Settings.Secure.ANDROID_ID);
ていません(出荷時にリセットされたか、ルート化されたデバイスで手動で変更される可能性があります)。しかし、それで十分です。
private final HashSet<String> debugDevices = new HashSet<String>(Arrays.asList("6a3d5c2bae3fd32c"));
private boolean isDebugDevice(String deviceId) {
return debugDevices.contains(deviceId);
}
private void setCrashlyticsState() {
@SuppressLint("HardwareIds")
String deviceId = Settings.Secure.getString(getContext().getContentResolver(), Settings.Secure.ANDROID_ID);
if (BuildConfig.DEBUG || isDebugDevice(deviceId)) {
Log.v("DeviceId", deviceId);
FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(false);
}
}
そのBuildConfigを確認します。正しいBuildConfigクラスを調べています。多くの場合、いくつかのオプションがあり、間違ったオプションがドラッグされる可能性があります。