Как отключить отчеты о сбоях Firebase, когда приложение работает на отладке?


Я успешно реализовал Firebase Crash Reporting, но мне нужно отключить службу, когда приложение работает отменить вариант сборки "debug", чтобы избежать нереальных сбоев в консоли во время разработки.

в официальной документации об этом ничего не говорится.

14 66

14 ответов:

обновление: С помощью Google Play Services / Firebase 11+ Теперь вы можете отключить отчеты о сбоях во время выполнения. FirebaseCrash.setCrashCollectionEnabled() (спасибо @Tyler Carberry)

ОТВЕТ:

нет никакой официальной поддержки для этого, насколько сообщество смогло догадаться. Лучший способ, который я бы предложил сделать это, - настроить несколько приложений Firebase на панели мониторинга, по одному для каждого типа сборки и настроить несколько google_services.JSON файлы, направляющие в каждое другое приложение в зависимости от варианта сборки.

С Google Play Services 11.0 теперь вы можете отключить отчеты о сбоях во время выполнения.

FirebaseCrash.setCrashCollectionEnabled(!BuildConfig.DEBUG);

недавно была введена возможность отключить Firebase crash reporting в официальном порядке. Вам необходимо обновить firebase android sdk по крайней мере до версии 11.0.0

для этого вам нужно отредактировать свой AndroidManifest.xml и добавить:

<meta-data
   android:name="firebase_crash_collection_enabled"
   android:value="false" />

внутри <application> блок.

вы можете проверить, включен ли отчет о сбое Firebase во время выполнения с помощью FirebaseCrash.isCrashCollectionEnabled ().

ниже a полный пример отключения отчетов о сбоях Firebase в отладочных сборках.

построить.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"/>
...

в моем классе приложений, 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();

из пути переработки

вы можете изменить зависимость сбоя firebase на зависимость только для выпуска.

для этого вы определяете его как зависимость releaseCompile

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

теперь он будет включен только в сборку выпуска. Если у вас есть другие пользовательские типы сборки, для которых вы хотите создавать отчеты о сбоях, вы можете добавить их к ним.

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

простой и легкий трюк, который я использовал, - это добавить зависимость от отчетов о сбоях firebase в сборке выпуска только в .

это удалит библиотеку отчетов о сбоях из типа сборки отладки и добавит ее только в сборку выпуска.

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

вдохновленный это связано ответа и другие здесь, я придумал это удобное решение.

используя Лесной для ведения журнала я создал различные реализации подкласса дерева для сборки debug и release. В debug он переносится на DebugTree, который записывает в logcat. В выпуске он пересылает исключения и высокоприоритетные журналы в Firebase, отбрасывая остальное.

построить.gradle

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

src/debug/java/[package] / ForestFire.java

import timber.log.Timber;

public class ForestFire extends Timber.DebugTree {}

src / release/java/[package] / 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());

сначала инициализируйте переменные в файле gradle и проверьте, находится ли он в режиме отладки или в режиме выпуска. Лучший способ отправить отчет о сбое находится в классе приложения.

построить.gradle

    buildTypes {
         release {
             buildConfigField "Boolean", "REPORT_CRASH", '"true"'
             debuggable false
         }
         debug {
             buildConfigField "Boolean", "REPORT_CRASH", '"false"'
             debuggable true
         }
    }

теперь сначала проверьте режим и отправить отчет об аварии, если разбился .

приложение.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);
            }
        }
    });

В настоящее время вы не можете отключить Firebase crash reporting, хотя вы можете отключить firebase analytics.

таким образом, один из способов сделать это-создать другое приложение с другим идентификатором в том же проекте firebase. После этого вам просто нужно изменить appID, чтобы включить или отключить отчеты о сбоях firebase. Я создал два приложения для моего удобства:

AppID: com.android - по версии сборки типа

AppID: com.андроид.отладка - для отладка типа сборки

пожалуйста, перейдите по ссылке ниже для получения более подробной информации:

https://firebase.googleblog.com/2016/08/organizing-your-firebase-enabled-android-app-builds.html

Edit: Вам не нужно менять appID в проекте android снова и снова. Существует лучший способ использовать другой appID для отладки типа сборки -

android {
    defaultConfig {
        applicationId "com.android"
        ...
    }
    buildTypes {
        debug {
            applicationIdSuffix ".debug"
        }
    }
}

Проверьте ссылку для получения дополнительной информации подробности:

https://developer.android.com/studio/build/application-id.html

Edit2:

в основном в вышеуказанном решении вы делаете два разных приложения в проекте Firebase, и таким образом вы можете отделить свои ошибки разработки и производства.

к вашему сведению военнослужащих отчетности аварии является устаревшим. Вы должны использовать Ткани Crashlytics (принадлежит Google). Он имеет некоторые действительно интересные функции.

на 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);
}

источник

сначала вам придется создать debug и release построить варианты, а затем установить переменную с логическим значением. Тогда вам нужно будет получить это значение из вашего java-файла, который расширяет application т. е. Откуда вы включаете Fabric сообщения об ошибках.

пример кода приведен ниже.

в вашем приложении добавьте следующие строки, чтобы создать 2 варианта сборки debug и release и затем добавить переменную типа boolean значение.

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 by ctrl + щелчок на значении. Надеюсь, это поможет.

я использую versionCode как фильтр для локальных / производственных сборок.

gradle.свойства

VERSION_CODE=1

приложения/строить.gradle

android {
    defaultConfig {
        versionCode VERSION_CODE as int
    }
}

при публикации новой версии приложения, просто установите новое значение из командной строки:

./gradlew build -PVERSION_CODE=new_value

в противном случае, когда вы строите из Android Studio, вы всегда будете получать то же самое versionCode, Так что вы можете легко отличить отчеты о сбоях в консоли Firebase.

как уже было сказано ранее-нет официального способа сделать это. Но худший обходной путь для меня, как уже упоминалось @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;
}
public class MyApp extends Application {
    public static boolean isDebuggable;

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