Как отключить отчет о сбоях Firebase при запуске приложения при отладке?
Я успешно применил Firebase Crash Reporting, но мне нужно отключить службу, когда приложение работает, отменив вариант "debug" Build Variant, чтобы избежать непредвиденных сбоев в консоли во время разработки.
Официальная документация об этом ничего не говорит.
Ответы
Ответ 1
ОБНОВЛЕНО:
В Google Play Services/Firebase 11+ теперь можно отключить отчеты о сбоях во время выполнения. FirebaseCrash.setCrashCollectionEnabled()
(Спасибо @Tyler Carberry)
СТАРЫЙ ОТВЕТ:
Официальной поддержки для этого не существует, поскольку сообщество смогло догадаться. Лучший способ предложить это - настроить несколько приложений Firebase на панели управления, по одному для каждого типа сборки и настроить несколько файлов google_services.json, направляющих каждое приложение в зависимости от варианта сборки.
Ответ 2
В Google Play Services 11.0 теперь можно отключить отчеты о сбоях во время выполнения.
FirebaseCrash.setCrashCollectionEnabled(!BuildConfig.DEBUG);
Ответ 3
В последнее время появилась возможность отключить отчет о сбоях Firebase официальным способом. Вам необходимо обновить sdk firebase android до версии 11.0.0
Чтобы сделать это, вам нужно отредактировать свой AndroidManifest.xml
и добавить:
<meta-data
android:name="firebase_crash_collection_enabled"
android:value="false" />
Внутри блока <application>
.
Вы можете проверить, включен ли отчет о сбое Firebase во время выполнения, используя FirebaseCrash.isCrashCollectionEnabled().
Ниже приведен полный пример для отключения отчетов о сбоях Firebase в ваших отладочных сборках.
build.gradle
...
buildTypes {
release {
...
resValue("bool", "FIREBASE_CRASH_ENABLED", "true")
}
debug {
...
resValue("bool", "FIREBASE_CRASH_ENABLED", "false")
}
}
...
dependencies {
...
compile "com.google.firebase:firebase-core:11.0.0"
compile "com.google.firebase:firebase-crash:11.0.0"
...
}
AndroidManifest.xml
<application>
<meta-data
android:name="firebase_crash_collection_enabled"
android:value="@bool/FIREBASE_CRASH_ENABLED"/>
...
Ответ 4
в моем классе Application, onCreate()
if (BuildConfig.DEBUG) {
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread paramThread, Throwable paramThrowable) {
Log.wtf("Alert", paramThrowable.getMessage(), paramThrowable);
System.exit(2); //Prevents the service/app from freezing
}
});
}
Он работает, потому что он принимает oldHandler, который включает Firebase one
final UncaughtExceptionHandler oldHandler = Thread.getDefaultUncaughtExceptionHandler();
из пути обработки
Ответ 5
Вы можете изменить зависимость сбоя firebase к зависимости только от версии.
Чтобы сделать это, вы определяете его как зависимость releaseCompile
releaseCompile 'com.google.firebase:firebase-crash:9.4.0'
Теперь он будет включен только в сборку релизов. Если у вас есть другие пользовательские типы сборки, для которых требуется отчет о сбоях, вы можете добавить их к ним.
customBuildTypeCompile 'com.google.firebase:firebase-crash:9.4.0'
Ответ 6
Простой и простой трюк, который я использовал, заключается в том, чтобы добавить зависимость отчетов о сбоях в firebase в сборке выпуска только в файле build.gradle
.
Это приведет к удалению библиотеки отчетов об ошибках из типа сборки отладки и добавит это только в сборку выпуска.
dependencies {
releaseCompile 'com.google.firebase:firebase-crash:10.2.0'
}
Ответ 7
Вдохновленный этот связанный ответ и другие здесь, я придумал это удобное решение.
Используя Timber для ведения журнала, я создал различные реализации подкласса дерева для отладки и выпуска. При отладке он отлаживает DebugTree, который записывает в logcat. В выпуске он пересылает исключения и журналы с высоким приоритетом в Firebase, отбрасывая остальные.
build.gradle
dependencies {
...
compile 'com.jakewharton.timber:timber:4.3.0'
releaseCompile 'com.google.firebase:firebase-crash:9.0.2'
}
ЦСИ/отладки/Java/[пакет]/ForestFire.java
import timber.log.Timber;
public class ForestFire extends Timber.DebugTree {}
ЦСИ/выпуск/Java/[пакет]/ForestFire.java
import android.util.Log;
import com.google.firebase.crash.FirebaseCrash;
import timber.log.Timber;
public class ForestFire extends Timber.Tree {
@Override
protected void log(int priority, String tag, String message, Throwable t) {
if (Log.WARN <= priority) {
FirebaseCrash.log(message);
if (t != null) {
FirebaseCrash.report(t);
}
}
}
}
Запуск приложения
Timber.plant(new ForestFire());
Ответ 8
Сначала инициализируйте переменные в файле gradle и проверьте, находится ли он в режиме отладки или в режиме выпуска. Лучший способ отправить отчет о сбое - это класс приложения.
build.gradle
buildTypes {
release {
buildConfigField "Boolean", "REPORT_CRASH", '"true"'
debuggable false
}
debug {
buildConfigField "Boolean", "REPORT_CRASH", '"false"'
debuggable true
}
}
Теперь сначала проверьте режим и отправьте отчет о сбое, если он разбился.
Application.java
/** Report FirebaseCrash Exception if application crashed*/
Thread.setDefaultUncaughtExceptionHandler (new Thread.UncaughtExceptionHandler()
{
@Override
public void uncaughtException (Thread thread, Throwable e)
{
/** Check whether it is development or release mode*/
if(BuildConfig.REPORT_CRASH)
{
FirebaseCrash.report( e);
}
}
});
Ответ 9
В настоящее время вы не можете отключить создание отчетов о сбоях Firebase, хотя вы можете отключить аналитику Firebase.
Таким образом, один из способов сделать это - создать другое приложение с другим идентификатором в одном проекте Firebase. После этого вам просто нужно изменить appID, чтобы включить или отключить создание отчетов о сбоях Firebase. Для удобства я создал два приложения:
AppID: com.android - для версии сборки
AppID: com.android.debug - для отладочного типа сборки
Пожалуйста, перейдите по ссылке ниже для получения более подробной информации:
https://firebase.googleblog.com/2016/08/organizing-your-firebase-enabled-android-app-builds.html
Изменить:
Вам не нужно менять appID в проекте Android снова и снова. Есть лучший способ использовать разные appID для отладочной сборки type-
android {
defaultConfig {
applicationId "com.android"
...
}
buildTypes {
debug {
applicationIdSuffix ".debug"
}
}
}
Проверьте ссылку для более подробной информации:
https://developer.android.com/studio/build/application-id.html
Edit2:
В основном в приведенном выше решении вы создаете два разных приложения в проекте Firebase, и таким образом вы можете разделить ошибки разработки и производства.
FYI Firebase отчеты о сбоях устарели. Вам следует использовать Fabrics Crashlytics (принадлежит Google). У него есть действительно классные функции.
Ответ 10
Для класса FirebaseAnalytics
.
Отключить сбор: setAnalyticsCollectionEnabled(false);
Включить сбор: setAnalyticsCollectionEnabled(true);
или напишите в AndroidManifest.xml
в теге приложения: <meta-data android:name="firebase_analytics_collection_enabled" android:value="false" />
Возможное использование:
if (BuildConfig.DEBUG){ //disable for debug
mFirebaseAnalytics.setAnalyticsCollectionEnabled(false);
}
Источник
Ответ 11
Сначала вам нужно будет создать варианты debug
и release
build, а затем установить переменную с логическим значением. Затем вам нужно будет получить это значение из вашего java файла, который расширяет application
i.e, откуда вы включаете отчет о сбоях Fabric
.
Ниже приведен пример кода.
В вашем приложении build.gradle
добавьте следующие строки для создания 2 вариантов сборки debug
и release
, а затем добавьте переменную с логическим значением.
defaultConfig {
buildConfigField 'boolean', 'ENABLE_ANALYTICS', 'true'
}
buildTypes {
debug {
applicationIdSuffix ".debug"
versionNameSuffix 'DEBUG'
buildConfigField 'boolean', 'ENABLE_ANALYTICS', 'false'
}
release {
minifyEnabled false
}
}
Затем, когда вы пытаетесь добавить отчет о сбоях Fabric
, проверьте значение ENABLE_ANALYTICS
Открытый класс Test расширяет приложение {
private GoogleAnalytics googleAnalytics;
private static Tracker tracker;
@Override
public void onCreate() {
super.onCreate();
if (BuildConfig.ENABLE_ANALYTICS)
Fabric.with(this, new Crashlytics());
}
}
Вы можете увидеть значение ENABLE_ANALYTICS
на ctrl
+ щелчок по значению. Надеюсь, это поможет.
Ответ 12
Я использую versionCode
как фильтр для локальных/производственных сборок.
gradle.properties
VERSION_CODE=1
приложение /build.gradle
android {
defaultConfig {
versionCode VERSION_CODE as int
}
}
При публикации новой версии приложения просто установите новое значение из командной строки:
./gradlew build -PVERSION_CODE=new_value
В противном случае, когда вы будете строить из Android Studio, вы всегда получите тот же versionCode
, чтобы вы могли легко отличать отчеты о сбоях в консоли Firebase.
Ответ 13
Как уже было сказано, официального способа сделать это не существует. Но худшим обходным решением для меня, как упомянуто @mark-d, является reset DefaultUncaughtExceptionHandler
(fooobar.com/questions/99670/...).
Но если вы просто вызываете System.exit(2)
, как было предложено, приложение будет немедленно закрыто на исключение, без какого-либо диалогового сообщения и жесткого получения журналов отладки. Если это важно для вас, есть способ восстановить обработчик по умолчанию:
if (BuildConfig.DEBUG) {
final Thread.UncaughtExceptionHandler currentHandler = Thread.getDefaultUncaughtExceptionHandler();
if (currentHandler.getClass().getPackage().getName()
.startsWith("com.google.firebase")) {
final Thread.UncaughtExceptionHandler defaultHandler =
getPrivateFieldByType(currentHandler, Thread.UncaughtExceptionHandler.class);
Thread.setDefaultUncaughtExceptionHandler(defaultHandler);
}
}
Где
public static <T> T getPrivateFieldByType(Object obj, Class<T> fieldType) {
if (obj != null && fieldType != null) {
for (Field field : obj.getClass().getDeclaredFields()) {
if (field.getType().isAssignableFrom(fieldType)) {
boolean accessible = field.isAccessible();
if (!accessible) field.setAccessible(true);
T value = null;
try {
//noinspection unchecked
value = (T) field.get(obj);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
if (!accessible) field.setAccessible(false);
return value;
}
}
}
return null;
}
Ответ 14
public class MyApp extends Application {
public static boolean isDebuggable;
public void onCreate() {
super.onCreate();
isDebuggable = (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE));
FirebaseCrash.setCrashCollectionEnabled(!isDebuggable);
}
}
Ответ 15
Самое простое решение для пользователей, когда они используют приложение в режиме отладки или в режиме выпуска:
AndroidManifest.xml:
<meta-data
android:name="firebase_crash_collection_enabled"
android:value="${analytics_deactivated}"/>
build.gradle(Module:app)
buildTypes {
debug {
manifestPlaceholders = [analytics_deactivated: "false"]
}
release {
manifestPlaceholders = [analytics_deactivated: "true"]
}
}
Следовательно, когда приложение находится в режиме выпуска, аварийные сбои будут включены, а для приложения в режиме выпуска отключены