programing

앱이 디버그에서 실행 중일 때 Firebase 충돌 보고를 비활성화하는 방법은 무엇입니까?

magicmemo 2023. 6. 20. 21:32
반응형

앱이 디버그에서 실행 중일 때 Firebase 충돌 보고를 비활성화하는 방법은 무엇입니까?

Firebase 충돌 보고를 성공적으로 구현했지만, 개발 중 콘솔에서 실제 충돌이 발생하지 않도록 앱이 '디버그' 빌드 변형을 실행 취소할 때 서비스를 비활성화해야 합니다.

공식 문서에는 이것에 대해 아무 것도 나와 있지 않습니다.

업데이트됨:이제 Google Play Services / Firebase 11+를 사용하여 런타임에 충돌 보고를 비활성화할 수 있습니다. FirebaseCrash.setCrashCollectionEnabled()(@Tyler Carberry 감사합니다)

이전 답변:

커뮤니티가 추측할 수 있는 한, 이것에 대한 공식적인 지원은 없습니다.제가 제안하는 가장 좋은 방법은 대시보드에 빌드 유형별로 하나씩 여러 Firebase 앱을 설정하고 빌드 변형에 따라 서로 다른 앱을 가리키는 여러 Google_services.json 파일을 설정하는 것입니다.

이제 Google Play Services 11.0을 사용하여 런타임에 충돌 보고를 비활성화할 수 있습니다.

FirebaseCrash.setCrashCollectionEnabled(!BuildConfig.DEBUG);

최근 공식적인 방법으로 Firebase 충돌 보고를 비활성화할 수 있는 가능성이 도입되었습니다.Firebase Android sdk를 버전 11.0.0 이상으로 업그레이드해야 합니다.

이 작업을 수행하려면 다음 작업을 편집해야 합니다.AndroidManifest.xml추가:

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

내부<application>블록으로 막다

FirebaseCrash.isCrashCollectionEnabled()를 사용하여 Firebase 충돌 보고서가 런타임에 활성화되었는지 확인할 수 있습니다.

다음은 디버그 빌드에서 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"/>
...

내 응용 프로그램 클래스의 Create()

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

파이어베이스가 포함된 기존 핸들러를 사용하기 때문에 작동합니다.

 final UncaughtExceptionHandler oldHandler = Thread.getDefaultUncaughtExceptionHandler();

처리 경로를 벗어난

파이어베이스 충돌 종속성을 릴리스 전용 종속성으로 변경할 수 있습니다.

이를 위해 릴리스Compile 종속성으로 정의합니다.

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

이제 릴리스 빌드에만 포함됩니다.충돌 보고를 수행할 다른 사용자 정의 빌드 유형이 있는 경우 이를 에 추가할 수 있습니다.

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

제가 사용한 간단하고 쉬운 트릭은 릴리스 빌드에만 파이어베이스 충돌 보고 종속성을 추가하는 것입니다.build.gradle파일.

이렇게 하면 디버그 빌드 유형에서 충돌 보고 라이브러리가 제거되고 릴리스 빌드에만 이 라이브러리가 추가됩니다.

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

이와 관련된 답과 여기에 있는 다른 것들로부터 영감을 받아, 저는 이 편리한 해결책을 생각해냈습니다.

로깅용 Timber를 사용하여 디버그 및 릴리스 빌드용 Tree 하위 클래스의 여러 구현을 만들었습니다.디버그에서는 logcat에 쓰는 DebugTree를 참조합니다.릴리스에서 예외 및 우선 순위가 높은 로그는 Firebase로 전달하고 나머지는 삭제합니다.

빌드.그래들

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 파일에서 변수를 초기화하고 디버그 또는 릴리스 모드에 있는지 확인합니다.충돌 보고서를 제출하는 가장 좋은 방법은 응용 프로그램 클래스 내에 있는 것입니다.

빌드.그래들

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

이제 먼저 모드를 확인하고 충돌 시 충돌 보고서를 제출합니다.

어플.자바

    /** 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 분석을 비활성화할 수 있지만 Firebase 충돌 보고를 비활성화할 수 없습니다.

따라서 이를 위한 한 가지 방법은 동일한 파이어베이스 프로젝트 내에서 다른 ID를 가진 다른 앱을 만드는 것입니다.이 후에는 앱을 변경하면 됩니다.Firebase 충돌 보고를 활성화하거나 비활성화하는 ID입니다.저는 편의상 아래 두 개의 앱을 만들었습니다.

AppID:com.android - 릴리스 빌드 유형

AppID:com.android.debug - 디버그 빌드 유형용

자세한 내용은 아래 링크를 참조하십시오.

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

편집: 앱을 변경할 필요가 없습니다.안드로이드 프로젝트에 아이디가 계속해서 있습니다.다른 앱을 사용하는 더 좋은 방법이 있습니다.디버그 빌드 유형의 ID-

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

자세한 내용은 링크를 참조하십시오.

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

편집 2:

기본적으로 위 솔루션에서 당신은 Firebase 프로젝트에서 두 개의 다른 앱을 만들고 있으며, 이 방식으로 당신은 당신의 개발 오류와 생산 오류를 분리할 수 있습니다.

FYI Firebase 충돌 보고는 더 이상 사용되지 않습니다.Fabrics 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변수를 빌드한 다음 부울 값으로 변수를 설정합니다.은 당신의 된 자바 파일에서 그 할 것입니다.application즉, 할수있위치서에는용을 활성화할 Fabric충돌 보고

코드 예제는 다음과 같습니다.

build.gradle 변형을 .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값을 클릭합니다.이게 도움이 되길 바랍니다.

디버그 모드 또는 릴리스 모드에서 앱을 실행하는 사용자를 위한 가장 간단한 솔루션:

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"]

        }
    }

따라서 앱이 릴리스 모드일 때 크래시래틱이 켜지고 앱이 디버그 모드로 실행되면 꺼집니다.

최근의 화재 기반 충돌 분석은 이러한 구현을 가지고 있다고 생각합니다.

 FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(!BuildConfig.DEBUG)

사용합니다versionCode로컬/프로덕션 빌드용 필터로 사용할 수 있습니다.

Gradle.속성

VERSION_CODE=1

app/build.gradle

android {
    defaultConfig {
        versionCode VERSION_CODE as int
    }
}

새 버전의 앱을 게시할 때 명령줄에서 새 값을 설정하면 됩니다.

./gradlew build -PVERSION_CODE=new_value

Studio에서 때 한 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);
    }
}

언급URL : https://stackoverflow.com/questions/37396826/how-to-disable-firebase-crash-reporting-when-the-app-is-running-on-debug

반응형