답변:
Crashlytics의 마크가 여기 있습니다. 디버그 빌드를 수행하는 동안 Crashlytics를 비활성화하는 몇 가지 방법이 있습니다.
디버그 및 릴리스 빌드에 다른 android : versionString을 사용한 다음 디버그 버전에 대한 Crashlytics 웹 대시 보드에서 충돌보고를 사용하지 않도록 설정하십시오.
디버그 플래그를 확인하는 if 문에서 Crashlytics.start ()에 대한 호출을 래핑하십시오. 여기에 제안 된 것과 같은 사용자 정의 플래그 또는 접근 방식을 사용할 수 있습니다. APK가 서명되었는지 또는 "디버그 빌드"인지 확인하는 방법은 무엇입니까?
BuildConfig.DEBUG
Gradle을 사용하여 빌드하는 경우 사용해야합니다. 항상 올바르게 생성됩니다.
BuildConfig.DEBUG
합니까?
Crashlytics에서 솔루션을 찾았습니다 (패브릭 통합 사용).
Application 클래스에 다음 코드를 넣습니다. 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
gradle에 추가 할 수도 있습니다 . 이 명령은 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에 추가 (모든 활동이 아니라 한 번만 필요)
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());
참고 : 이 방법을 사용하면 패브릭은 릴리스 빌드에서만 초기화됩니다 (위 코드에서 표시). 즉, 아래 그림과 같이 Fabric이 초기화되었는지 여부를 확인 Crashlytics
하는 if
블록에 클래스의 static 메소드를 호출해야 합니다.
if (Fabric.isInitialized())
Crashlytics.logException(e);
그렇지 않으면 Must Initialize Fabric before using singleton()
에뮬레이터에서 테스트 할 때 앱에서 오류 가 발생 합니다.
2019 년 답변
릴리스에서 Crashlytics 만 사용하도록 설정하고 디버그에서 2 시간 동안 사용 중지하고 Firebase 콘솔에서 예외가 업로드되었는지 여부를 확인했습니다.
이를 수행 할 수있는 두 가지 방법이 있습니다.
작동하지만 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);
편집 Fabric으로 업그레이드 한 경우이 답변을 대신 사용하십시오 .
BuildConfig
Gradle 작업에 의해 생성되며 실행됩니다. 또한 buildConfigField
사용자 정의 필드를 설정 하는 데 사용 하며 항상 작동합니다. tools.android.com/recent/androidstudio045released 또한 사용을 제안합니다 BuildConfig.DEBUG
.
구글에 따르면이 코드를 사용하여 Crashlytics를 비활성화하면 빌드 프로세스가 향상됩니다.
참조 -https://developer.android.com/studio/build/optimize-your-build
다른 매니페스트 파일이 필요하지 않기 때문에 내가 좋아하는 또 다른 간단한 솔루션 :
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
응용 프로그램 모듈에 넣으십시오 .
디버그 및 릴리스 빌드의 모든 충돌을 캡처하고 Crashlytics 대시 보드에서 충돌을 분리하려는 경우 다음 코드 행을 build.gradle에 추가 할 수 있습니다.
debug {
versionNameSuffix "-DEBUG"
}
예를 들어 앱의 versionName이 1.0.0 인 경우 릴리스 빌드는 1.0.0으로 태그 지정되고 디버그 빌드는 1.0.0-DEBUG가됩니다.
여기에는 좋은 답변이 많이 있지만 테스트를 위해 충돌 로그가 여전히 매우 유용한 자체 베타 테스트 및 실험실 밖 테스트를 위해 디버그 빌드를 사용하고 여전히보고하고 싶습니다. OP와 마찬가지로 내가 원했던 것은 활발한 개발 중에 종종 충돌을 일으키는 원인이되는 신속하게 해결하는 것입니다.
모든 디버그 충돌을 제거하는 대신 다음 코드를 사용하여 장치가 개발 시스템에 연결되어있는 동안에 만 보고서를 비활성화하도록 선택할 수 있습니다.
if (!Debug.isDebuggerConnected()) {
Fabric.with(this, new Crashlytics());
}
Crashlytics.logException(e)
하고 Fabric 싱글 톤이 초기화되지 않았기 때문에 디버그 빌드에서 예외가 발생합니다. Crashlytics를 사용하는 경우 항상 Fabric 싱글 톤을 초기화하십시오. fahmy 's answer를 참조하십시오 .
문제는 어떤 솔루션도 최신 crashlytics SDK에 대해 작동하지 않는다는 것입니다. (2.9.0을 사용하고 있습니다)
코드는 프로젝트로 컴파일되어 응용 프로그램을 onCreate 호출하기 전에 실행되므로 코드로 비활성화 할 수 없습니다. 따라서 다른 솔루션은 간단합니다. 필요하지 않은 경우 crashlytics를 컴파일하지 마십시오. build.gradle 파일에서 'compile'호출을 'releaseCompile'로 바꾸십시오.
releaseCompile('com.crashlytics.sdk.android:crashlytics:2.9.0@aar') {
transitive = true
}
내가 겪은 이상한 문제 : 나는 xialin 의 답변 (공식 웹 사이트에도 나타남)을 따랐 는데 작동하지 않았다. BuildConfig
디버그 모드에서도 false로 설정된 정적 DEBUG 변수가 포함 된 Fabric 패키지를 참조 하고 있음이 밝혀졌습니다.
따라서 위에서 언급 한 솔루션을 따라도 디버그 보고서가 계속 표시되는 경우이를 참조하고 있는지 확인하십시오.
import com.yourpackagename.BuildConfig;
그리고 이것은 아닙니다.
import io.fabric.sdk.android.BuildConfig;
디버깅 가능한 릴리스 빌드를 원하는 경우 다음과 같은 방법이 있습니다.
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를 사용 중지하는 방법에는 두 가지가 있습니다.
<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 포스트 패브릭 답변
아래 코드를 Application 클래스에 붙여 넣고 setCrashlyticsState
onCreate 애플리케이션 에서 메소드 를 호출하십시오 . debugDevices
릴리스 모드에서 빌드 할 때도 개인 장치를 무시할 수 있도록 테스트 장치 ID를 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 클래스를보고 있습니다. 종종 몇 가지 옵션이 있으며 잘못된 옵션을 끌어 올 수 있습니다.