Як вимкнути Firebase Crash Reporting, коли додаток працює під час налагодження?


75

Я успішно реалізував Firebase Crash Reporting, але мені потрібно відключити службу, коли додаток працює, скасувати варіант налагодження збірки, щоб уникнути нереальних збоїв у консолі під час розробки.

В офіційній документації про це нічого не сказано.


if (!development) { FirebaseCrash.report(e);}
вухатка

1
Дякую, @James_Parsons, але я цього не мав на увазі. Мені потрібно відключити автоматичне повідомлення про аварійне завершення роботи, а не лише виклики API вручну.
facundomr

releaseCompile 'com.google.firebase:firebase-crash:9.8.0' це не спрацює? передбачається додавати залежність лише для ваших збірок випусків, отже, під час розробки бібліотека не буде додана до проекту, так?
Ankit Mundada

перевірити цю відповідь: stackoverflow.com/a/48384549/3166417
itzhar

Відповіді:


48

ОНОВЛЕНО: За допомогою Google Play Services / Firebase 11+ ви тепер можете вимкнути звіт про аварійне завершення роботи під час роботи. FirebaseCrash.setCrashCollectionEnabled()(Дякую @Tyler Carberry )

СТАРИЙ ВІДПОВІДЬ:

Офіційної підтримки для цього немає, наскільки громада змогла припустити. Найкращий спосіб, який я б запропонував зробити, це налаштувати на своїй інформаційній панелі кілька програм Firebase, по одному для кожного типу збірки, і налаштувати кілька файлів google_services.json, що спрямовують до кожного іншого додатку, залежно від варіанту збірки.


22
Привіт, я з командою звітування про аварії. Ми прагнемо запропонувати вам спосіб програмного відключення звітування про збої. Ми також виявили, що деяким розробникам у деяких частинах світу заборонено збирати збої з юридичних причин, і їм також потрібен спосіб вимкнути звіт про збої під час виконання.
Дуг Стівенсон,

8
@DougStevenson минуло досить багато часу з моменту вашого коментаря, і я, здається, не знаходжу жодного способу відключити автоматичне повідомлення про аварійне завершення роботи. Будь-який спосіб зробити це на даний момент?
Алін

5
детальніше про цю відповідь див .: firebase.googleblog.com/2016/08/…
Френк

3
@ColinWhite На жаль, поки що нічого не доступно. Якщо ви стежите за Firebase у твіттері (або мені CodingDoug), ви, ймовірно, почуєте про будь-які нові речі таким чином.
Дуг Стівенсон,

6
За допомогою Google Play Services 11.0 тепер ви можете вимкнути звіт про збої під час роботи. FirebaseCrash.setCrashCollectionEnabled (! BuildConfig.DEBUG);
Тайлер Карберрі,

31

За допомогою Google Play Services 11.0 тепер ви можете вимкнути звіт про збої під час роботи.

FirebaseCrash.setCrashCollectionEnabled(!BuildConfig.DEBUG);

25

Нещодавно була представлена ​​можливість вимкнення звітів про збої Firebase офіційним способом. Вам потрібно оновити firebase android sdk принаймні до версії 11.0.0

Для цього вам потрібно відредагувати AndroidManifest.xmlта додати:

<meta-data
   android:name="firebase_crashlytics_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"/>
...

Чи працює прапор firebase_crash_collection_enabledдля версії 9.2.1 Firebase?
rraallvv

@rraallvv ні, функція ще не була доступною
evi

Це чудове рішення і засноване на задокументованому механізмі роботи інвалідів Crashlytics. Ключ маніфесту, до речі, тепер "firebase_crashlytics_collection_enabled".
Леон

@ Леон, вибачте, товаришу, ви помиляєтесь. Цей підхід є фактичним стандартом Android для ввімкнення / вимкнення речей у маніфесті, той факт, що схожий на підхід, використаний у документації Crashlytics, абсолютно випадковий!
evi

Не "firebase_crash_collection_enabled", а "firebase_crashlytics_collection_enabled" - з firebase.google.com/docs/crashlytics/customize-crash-reports
Алекс Шевелєв

11

у моєму класі 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

 final UncaughtExceptionHandler oldHandler = Thread.getDefaultUncaughtExceptionHandler();

поза процесом обробки


11

Ви можете змінити залежність аварійного завершення роботи Firebase на залежність лише випуску.

Для цього ви визначаєте це як залежність releaseCompile

releaseCompile 'com.google.firebase:firebase-crash:9.4.0'

Тепер він буде включений лише у збірки випусків. Якщо у вас є інші власні типи збірки, для яких ви хочете повідомляти про збої, ви можете додати їх до них.

customBuildTypeCompile 'com.google.firebase:firebase-crash:9.4.0'

6
FYI, навіть використовуючи цей метод, здається, що Firebase зберігає всі збої в базі даних, і якщо ви коли-небудь встановите версію випуску на свій емулятор (наприклад, для тестування ProGuard), він потім завантажить ВСІ збережені збої.
Джоел

9

Простий і легкий трюк, який я використав, - це додати залежність звітування про збої Firebase у збірці випуску лише у build.gradleфайлі.

Це видалить бібліотеку звітів про збої з типу побудови налагодження та додасть її лише у версії збірки.

dependencies {
    releaseCompile 'com.google.firebase:firebase-crash:10.2.0'
}

7

Натхненний цією відповідною відповіддю та іншими тут, я придумав це зручне рішення.

Використовуючи Timber для ведення журналу, я створив різні реалізації підкласу Tree для налагодження та випусків. Під час налагодження він переходить на DebugTree, який пише в logcat. У випуску він пересилає винятки та журнали з високим пріоритетом до Firebase, скидаючи решту.

build.gradle

dependencies {
  ...
  compile 'com.jakewharton.timber:timber:4.3.0'
  releaseCompile 'com.google.firebase:firebase-crash:9.0.2'
}

src / debug / java / [пакет] /ForestFire.java

import timber.log.Timber;

public class ForestFire extends Timber.DebugTree {}

src / release / 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());

6

Спочатку ініціалізуйте змінні у файлі gradle та перевірте, чи перебуває він у режимі налагодження чи у звільненому режимі. Найкращий спосіб подати звіт про збій - у класі Application.

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
для першої частини ви можете просто використовувати BuildConfig.DEBUG
Бронкс

4

Наразі ви не можете вимкнути звіт про збої 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

Редагувати: Вам не потрібно знову і знову змінювати ідентифікатор app в проекті Android. Існує кращий спосіб використовувати інший ідентифікатор app для налагодження типу побудови -

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). У ньому є кілька справді класних особливостей.


2

Для 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);
}

Джерело


1

Спочатку вам доведеться створити debugта releaseпобудувати варіанти, а потім встановити змінну з логічним значенням. Тоді вам потрібно буде отримати це значення з вашого файлу Java, яке поширюється, applicationтобто з того місця, де ви вмикаєте 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

тест публічного класу розширює додаток {

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+ клацніть на значення. Сподіваюся, це допомагає.


1

Найпростіше рішення для користувачів під час запуску програми в режимі налагодження або в режимі випуску :

AndroidManifest.xml:

<meta-data
            android:name="firebase_crash_collection_enabled"
            android:value="${analytics_deactivated}"/>

build.gradle (модуль: додаток)

buildTypes {

        debug {
            manifestPlaceholders = [analytics_deactivated: "false"]
        }

        release {
            manifestPlaceholders = [analytics_deactivated: "true"]

        }
    }

Отже, коли програма перебуває в режимі випуску , програма збоїв буде ввімкнена, а програма працює в режимі налагодження , її буде вимкнено.


0

Я використовую versionCodeяк фільтр для локальних / виробничих збірок.

gradle.properties

VERSION_CODE=1

app / build.gradle

android {
    defaultConfig {
        versionCode VERSION_CODE as int
    }
}

При публікації нової версії програми просто встановіть нове значення з командного рядка:

./gradlew build -PVERSION_CODE=new_value

В іншому випадку, коли ви будуєте з Android Studio, ви завжди отримуватимете те саме versionCode, тому ви зможете легко розрізнити звіти про збої в консолі Firebase.


0

Як уже було сказано раніше, офіційного способу зробити це не існує. Але найгіршим обхідним шляхом для мене, як згадувалось @ mark-d, є скидання DefaultUncaughtExceptionHandler( https://stackoverflow.com/a/39322734/4245651 ).

Але якщо ви просто зателефонуєте, 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;
}

0
public class MyApp extends Application {
    public static boolean isDebuggable;

    public void onCreate() {
        super.onCreate();
        isDebuggable = (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE));
        FirebaseCrash.setCrashCollectionEnabled(!isDebuggable);
    }
}

0

Я припускаю, що нещодавній крашлітик Firebase має це реалізацію.

 FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(!BuildConfig.DEBUG)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.