วิธีปิดการใช้งาน Crashlytics ระหว่างการพัฒนา


245

มีวิธีง่าย ๆ ในการปิด Crashlytics Android SDK ในขณะที่กำลังพัฒนาหรือไม่?

ฉันไม่ต้องการให้ส่งการขัดข้องทุกครั้งที่ฉันทำอะไรที่โง่

ในทางกลับกันฉันไม่ต้องการที่จะแสดงความคิดเห็นCrashlytics.start()และอาจมีความเสี่ยงที่จะลืมที่จะไม่แสดงความคิดเห็นและกระทำ


คุณได้ลองลบคีย์ api ออกจากรายการแล้วหรือไม่ฉันจำไม่ได้ว่าเป็นความผิดพลาดหรือไม่
Timmetje

@timmied มันขัดข้อง นอกจากนี้ยังแสดงความคิดเห็นทั้งบรรทัดในManifestแอปขัดข้องดังนั้นสิ่งนี้ทำให้คำถามมีความถูกต้องมากขึ้น
Michael

คำตอบ:


172

Marc จาก Crashlytics ที่นี่ ต่อไปนี้เป็นสองวิธีในการปิดใช้งาน Crashlytics ขณะที่คุณกำลังสร้างการดีบัก!

  1. ใช้ android อื่น: versionString สำหรับการดีบักและปล่อยบิลด์จากนั้นปิดใช้งานการรายงานข้อขัดข้องจากแดชบอร์ดเว็บ Crashlytics สำหรับเวอร์ชันการดีบัก

  2. ล้อมรอบการเรียกไปยัง Crashlytics.start () ในคำสั่ง if ที่ตรวจสอบสถานะการดีบัก คุณสามารถใช้การตั้งค่าสถานะที่กำหนดเองหรือวิธีการเช่นเดียวกับที่เสนอไว้ที่นี่: จะตรวจสอบได้อย่างไรว่า APK มีการลงชื่อหรือ "debug build" หรือไม่


5
@marcr แล้วใช้แค่แค่ BuildConfig.DEBUG ล่ะ?
dannyroa

3
@dannyroa BuildConfig.DEBUG ไม่ใช่ธงมาตรฐานที่ใช้งานได้ในทุกสภาพแวดล้อมการสร้าง ฉันเชื่อว่ามันถูกตั้งค่าอย่างสม่ำเสมอเมื่อสร้างด้วย Eclipse & ADT แต่ไม่ใช่ที่อื่น
marcr

11
BuildConfig.DEBUGควรใช้หากคุณกำลังสร้างโดยใช้ Gradle มันจะถูกสร้างขึ้นอย่างถูกต้องเสมอ
Austyn Mahoney

3
@marcr แล้ว crashlytics รุ่นล่าสุด (ดูเหมือนว่าผสานกับ Fabric) แล้วไลบรารี่ทำการตรวจสอบภายในBuildConfig.DEBUGหรือไม่
akhy

2
@akhyar มันไม่ได้ถูกตรวจสอบโดยอัตโนมัติฉันใช้: ถ้า (! BuildConfig.DEBUG) {Fabric.with (นี่คือ Crashlytics ใหม่ ());}
Björn Kechel

387

ฉันพบโซลูชันจาก Crashlytics (พร้อมการรวม Fabric)

ใส่รหัสต่อไปนี้ในชั้นเรียนของคุณ 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 () )


EDIT2:

คุณยังสามารถเลือกที่จะเพิ่มสิ่งนี้ลงbuildTypeในการไล่ระดับสี คำสั่งนี้ปิดใช้งานการส่งไฟล์การจับคู่ crashlytics และสร้าง ID สำหรับแต่ละบิลด์ซึ่งเพิ่มความเร็วในการสร้างระดับของรสชาติเหล่านั้น (มันไม่ได้ปิดการใช้งาน Crashlytics ในเวลาทำงาน) ดูคำตอบของ Mike B ที่นี่

buildTypes {
    release {
           ....
    }
    debug {
        ext.enableCrashlytics = false
    }
}

2
นี่เป็นการใช้งานที่ดีกว่าและจะหยุดแอปของคุณลงหากคุณโทรไปยัง Crashlytics ในรหัสของคุณนอกคลาสแอปพลิเคชันของคุณ
speedynomads

1
มันเลิกใช้แล้วใน Crashlytics 2.3.0 :(
Damian Walczak

1
ext.enableCrashlytics = false ไม่ทำงานสำหรับฉันทั้งกับ 2.5 จริงๆแล้วมันไม่ทำงาน แม้กระทั่งก่อนผ้า
Bao-Long Nguyen-Trong

2
ฉันมีความกังวลที่นี่ สิ่งนี้จะเปิดใช้งานคำตอบและเบต้าหรือไม่ ดูเหมือนว่าสิ่งนี้ควรจะถูกต้องมากขึ้น: CrashlyticsCore core = new CrashlyticsCore.Builder (). ปิดการใช้งาน (BuildConfig.DEBUG). build (); Fabric.with (นี่คือ Answers ใหม่ (), เบต้าใหม่ (), Crashlytics.Builder ใหม่ (). core (core) .build ());
gbero

1
ext.enableCrashlytics = false จะไม่ผิดพลาดหากคุณใช้สิ่งนี้อย่างถูกต้อง วิธีการเอาชนะการแข่งขันอยู่ในเอกสารผ้า: docs.fabric.io/android/crashlytics/build-tools.html
Frank

46

คำตอบที่เลือกไม่ถูกต้องอีกต่อไป Google เปลี่ยนการบูรณาการของ Crashlytics เวอร์ชันปัจจุบันของฉันคือ2.9.1และสิ่งเดียวที่ฉันต้องทำคือเพิ่มimplementation 'com.crashlytics.sdk.android:crashlytics:2.9.1'ไฟล์ Gradle ของฉัน ไม่จำเป็นต้องมีสิ่งใดเพิ่มเติมที่ดี แต่นี่หมายความว่า Crashlytics นั้นทำงานอยู่ตลอดเวลา

โซลูชันที่ 1

รวบรวม Crashlytics เฉพาะในรุ่นที่วางจำหน่าย:

dependencies {
   ...
   releaseImplementation 'com.crashlytics.sdk.android:crashlytics:2.9.1' // update version
}

โซลูชันที่ 2

หากคุณต้องการกำหนดค่า Crashlytics เพิ่มเติมโซลูชัน 1 ไม่ทำงานเนื่องจากคลาส Crashlytics จะไม่พบใน Debug Builds ดังนั้นเปลี่ยนการใช้ Gradle กลับเป็น:

implementation 'com.crashlytics.sdk.android:crashlytics:2.9.1' // update version

จากนั้นไปที่ Manifest ของคุณและเพิ่มmeta-dataแท็กต่อไปนี้ภายในapplicationแท็ก:

<application
        android:name="...>

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

...

</application>

เพิ่มในกิจกรรมการเปิดตัวของคุณ (จำเป็นครั้งเดียวเท่านั้นไม่ใช่ทุกกิจกรรม)

if (!BuildConfig.DEBUG) { // only enable bug tracking in release version
   Fabric.with(this, new Crashlytics());
}

สิ่งนี้จะเปิดใช้งาน Crashlytics ในรุ่นที่วางจำหน่ายเท่านั้น ระวังตรวจสอบ BuildConfig.DEBUG ด้วยเมื่อคุณกำหนดค่า Crashlytics เช่น

if (!BuildConfig.DEBUG) {
   Crashlytics.setUserIdentifier("HASH_ID");
}

2
ดูเหมือนว่าสะอาด แทนที่จะเริ่มต้นในกิจกรรมหลักเมื่อไม่ได้อยู่ในอินสแตนซ์ของแอปพลิเคชันแทน?
จูลส์

พวกเขาระบุไว้ในเว็บไซต์: Enable collection for selected users by initializing Crashlytics from one of your app's activitiesแต่ฉันคิดว่ามันจะไม่เปลี่ยนแปลงมากนักหากคุณเริ่มต้น Crashlytics ในแอปพลิเคชัน คุณลองหรือยัง หากใช้งานได้ฉันสามารถเพิ่มลงในคำตอบของฉันได้ firebase.google.com/docs/crashlytics/customize-crash-reports
พอล Spiesberger

2
ฉันไม่สามารถแก้ไขปัญหาอื่น ๆ ให้ทำงานได้เพื่อปิดใช้งาน crashlytics ขณะใช้งานจริง โซลูชันที่ 1 ทำงานได้อย่างสมบูรณ์แบบ - ทำไมฉันไม่คิดอย่างนั้น

ขอบคุณสำหรับการแก้ปัญหา เมื่อฉันตั้งค่าfirebase_crashlytics_collection_enabledเป็นเท็จในรายการความผิดพลาดจะไม่ปรากฏบนคอนโซล (ฉันใช้ v2.9.9) ดังนั้นฉันจึงแก้ไขสิ่งนี้โดยการเพิ่มรายการแยกต่างหากสำหรับการดีบักfirebase_crashlytics_collection_enabled=falsetrue
บิลด์

30

หากคุณใช้ Gradle เพียงเพิ่มสิ่งนี้ลงในรสชาติ:

ext.enableCrashlytics = false

1
เพียงเพื่อรสชาติเท่านั้น สิ่งที่เกี่ยวกับการแก้ปัญหากับการเปิดตัว? ฉันพยายามที่จะปิดการใช้งานสำหรับการแก้ปัญหา แต่ยังคงส่งความผิดพลาด
xialin

ฉันคิดว่ามันใช้ได้กับรสชาติเท่านั้น IMO โดยใช้ธง Austyn และ Marcc แหลมเป็นวิธีที่ง่ายที่สุด
user1998494

ฉันพบวิธีแก้ปัญหา แต่ไม่แน่ใจว่าเข้ากันได้กับ Crashlytics รุ่นเก่าหรือไม่ เหมาะสำหรับ Crashlytics ใหม่ใน Fabric SDK ตรวจสอบคำตอบของฉันด้านล่าง
xialin

1
คำสั่งนี้ปิดใช้งานการส่งไฟล์การจับคู่ crashlytics และสร้าง ID สำหรับแต่ละบิลด์ซึ่งเพิ่มความเร็วในการสร้างระดับของรสชาติเหล่านั้น (มันไม่ได้ปิดการใช้งาน Crashlytics ในเวลาทำงาน) ดูคำตอบของ Mike B ได้ที่นี่: stackoverflow.com/questions/28339323/…
Aphex

18
สิ่งนี้ทำให้เกิดความเสียหาย ... " This app relies on Crashlytics."
Sakiboy

27

ลองดูเอกสารล่าสุด 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
Balflear

ฉันเดาว่าคุณหายไปext.enableCrashlytics = falseใน build.gradle
Abhishek Patidar

ไม่ฉันได้เพิ่มในประเภทบิลด์การดีบักในไฟล์ build.gradle อยู่ในbuildTypes -> debug, also i'm applying the plugin via ปลั๊กอินที่ใช้: 'io.fabric'`
Balflear

ฉันไม่แน่ใจว่าทำไมการแก้ปัญหานี้ถึงได้เพิ่มขึ้นถึง 24 เท่า เกิดปัญหากับThis app relies on Crashlytics. Please sign up for access at https://fabric.io/sign_up
TROD

24

ฉันพบว่านี่เป็นทางออกที่ง่ายที่สุด:

    release {
        ...
        buildConfigField 'Boolean', 'enableCrashlytics', 'true'
    }
    debug {
        buildConfigField 'Boolean', 'enableCrashlytics', 'false'
    }

บรรทัดด้านบนจะสร้างฟิลด์บูลีนสแตติกที่เรียกว่าenableCrashlyticsในBuildConfigไฟล์ซึ่งคุณสามารถใช้เพื่อตัดสินใจว่าจะเริ่มต้นFabricหรือไม่:

    if (BuildConfig.enableCrashlytics)
        Fabric.with(this, new Crashlytics());

หมายเหตุ:ด้วยวิธีการนี้เนื้อผ้าจะเริ่มต้นได้เฉพาะในรุ่นบิลด์ (ตามที่ระบุในรหัสด้านบน) ซึ่งหมายความว่าคุณต้องทำการโทรไปยังวิธีการทางสถิติในCrashlyticsชั้นเรียนในifบล็อกซึ่งตรวจสอบว่าผ้าได้รับการเริ่มต้นตามที่แสดงด้านล่าง

if (Fabric.isInitialized())
    Crashlytics.logException(e);

ไม่เช่นนั้นแอพจะมีปัญหาMust Initialize Fabric before using singleton()เมื่อทำการทดสอบตัวจำลอง


17

2562 คำตอบ

ฉันพยายามเปิดใช้งาน Crashlytics เฉพาะในรุ่นและปิดการใช้งานในการแก้ปัญหาเป็นเวลา 2 ชั่วโมงตรวจสอบคอนโซล Firebase เพื่อดูว่าข้อยกเว้นที่อัปโหลดหรือไม่

มี 2 ​​วิธีที่เป็นไปได้ในการทำเช่นนี้

ตัวเลือกที่ 1

มันทำงานได้ แต่ถ้าคุณเรียกร้องใด ๆCrashlyticsวิธีการในการแก้ปัญหาสร้าง app ที่จะผิดพลาด

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}" />

ตัวเลือก 2

อีกทางเลือกหนึ่งหากอนุญาตให้คุณโทรหา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}"ไม่ใช่เหรอ
JaydeepW

ข้อดีอีกอย่างของตัวเลือก # 2 คือคุณเริ่มต้นด้วยคอลเลกชันการวิเคราะห์ในขั้นต้นปิดใช้งานและจากนั้นสามารถถามผู้ใช้ก่อนว่ามันก็โอเคที่จะติดตามการใช้แอพของพวกเขา (คิดว่า GDPR) จากนั้นคุณจะใช้ Fabric.with ถ้าผู้ใช้ยินยอมให้ติดตามเท่านั้น
ต่อ Christian Henden

ข้อเสียเพียงข้อเดียวของตัวเลือก # 2 คือมันยังคงสร้างเวอร์ชันการแก้ไขข้อบกพร่องในแดชบอร์ด Firebase แม้ว่าจะไม่มีการขัดข้องจะปรากฏที่นั่น (เนื่องจากถูกปิดใช้งาน) สิ่งนี้ทำให้เกิดปัญหาสองประการ - ประการแรกมันยากที่จะหารุ่นที่วางจำหน่าย second - แดชบอร์ด Firebase แสดงเฉพาะ 100 เวอร์ชันล่าสุด - ซึ่งอาจทำให้คุณไม่เห็นการล่มในเวอร์ชันเก่าบางรุ่น ในแดชบอร์ดผ้าคุณสามารถปิดใช้งานเวอร์ชันเฉพาะได้ซึ่งเป็นไปไม่ได้ในแผงควบคุมของ Firebase
Alex Lipov

14

ใช้สิ่งนี้ใน MyApplication#onCreate()

if (!BuildConfig.DEBUG) Crashlytics.start(this);

แก้ไข หากคุณอัพเกรดเป็นผ้าให้ใช้คำตอบนี้แทน


BuildConfig.DEBUG ไม่ได้ตั้งค่าอย่างถูกต้องเสมอไป การใช้เพื่อเปิด / ปิดการใช้งาน Crashlytics ทำให้เกิดปัญหาเล็กน้อยสำหรับฉันขณะใช้ IntelliJ
Zeb Barnett

5
คุณใช้เครื่องมือสร้างอะไร Gradle จะตั้งค่าเสมอ มันเป็นปัญหาเมื่อปีที่แล้ว แต่เครื่องมือสร้างใหม่นั้นดีกว่ามาก
Austyn Mahoney

ฉันใช้ v0.9. + ของปลั๊กอิน Gradle สำหรับ IntelliJ และ v1.11 สำหรับ Gradle เอง
Zeb Barnett

ฉันไม่เห็นปัญหาใด ๆ ในแอพใด ๆ ของฉัน BuildConfigถูกสร้างโดยงาน Gradle ซึ่งรับประกันว่าจะทำงาน ฉันยังใช้buildConfigFieldเพื่อตั้งค่าฟิลด์ที่กำหนดเองและใช้งานได้ตลอด tools.android.com/recent/androidstudio045releasedBuildConfig.DEBUGยังแสดงให้เห็นว่าคุณใช้
Austyn Mahoney

ในฐานะนักอุดมคติฉันมั่นใจว่าจะสามารถใช้มันได้เพราะมันจะช่วยลดขั้นตอนการสร้างที่ไม่อัตโนมัติสำหรับ บริษัท ขนาดเล็กที่ฉันทำงาน มันเป็นเพียงการที่เราเปิดตัวการผลิตงานสร้างที่ขึ้นอยู่กับธงนั้นและ Crashlytics ไม่เคยเห็นมันมีชีวิตจริง หลังจากเรากลับไปที่การสลับมันด้วยตนเอง Crashlytics จะเห็นมันทันที
Zeb Barnett


9

อีกวิธีง่ายๆที่ฉันชอบเพราะมันไม่ต้องการไฟล์รายการที่แตกต่าง:

ขั้นตอนที่ 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}" />

6

โปรดสังเกตว่าคุณยังสามารถปิดใช้งานการอัปโหลดสัญลักษณ์ที่น่ารำคาญในการสร้างข้อบกพร่อง:

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โมดูลแอปพลิเคชันของคุณ


6

หากคุณต้องการดักจับข้อขัดข้องทั้งหมด (สำหรับการดีบักและปล่อยบิลด์) แต่ต้องการแยกพวกมันออกจากแดชบอร์ด Crashlytics คุณสามารถเพิ่มโค้ดบรรทัดนี้เพื่อ build.gradle:

debug {
    versionNameSuffix "-DEBUG"
}

ตัวอย่างเช่นถ้า versionName ของแอปของคุณคือ 1.0.0 บิลด์ของคุณจะถูกติดแท็กเป็น 1.0.0 ในขณะที่ debug builds จะเป็น 1.0.0-DEBUG


นี่ไง? ไม่จำเป็นต้องทำรสชาติ?
portfoliobuilder

6

มีคำตอบที่ดีมากมายที่นี่ แต่สำหรับการทดสอบของฉันฉันใช้ debug builds สำหรับ betas ภายในและการทดสอบนอกห้องปฏิบัติการซึ่งบันทึกการทำงานผิดพลาดยังคงมีประโยชน์มากและฉันยังต้องการรายงานพวกเขา เช่นเดียวกับ OP สิ่งที่ฉันต้องการคือปิดใช้งานพวกเขาในระหว่างการพัฒนาที่ฉันมักก่อให้เกิดและแก้ไขข้อขัดข้องได้อย่างรวดเร็ว

แทนที่จะลบข้อผิดพลาดทั้งหมดที่คุณสามารถเลือกที่จะปิดการใช้งานรายงานในขณะที่อุปกรณ์เชื่อมต่อกับเครื่องพัฒนาของคุณด้วยรหัสต่อไปนี้

if (!Debug.isDebuggerConnected()) {
    Fabric.with(this, new Crashlytics());
}

มันผิด. ฉันบันทึกข้อยกเว้นที่ไม่ร้ายแรงในรหัสของฉันโดยใช้Crashlytics.logException(e)และคำสั่งนี้จะโยนข้อยกเว้นในการสร้างการดีบักเนื่องจาก Fabric singleton ไม่ได้เริ่มต้น หากคุณใช้ Crashlytics ให้เตรียมค่าเริ่มต้นให้กับ Fabric singleton เสมอ ดูคำตอบของ fahmy
naXa

5

ปัญหาคือไม่มีวิธีแก้ปัญหาใดที่ทำงานได้กับ sdk crashlytics ล่าสุด (ฉันใช้ 2.9.0)

คุณไม่สามารถปิดการใช้งานด้วยรหัสเพราะมันรวบรวมในโครงการของคุณและทำงานก่อนที่จะมีการโทรในการสร้างใบสมัครของคุณ ดังนั้นโซลูชันอื่น ๆ จึงเป็นเรื่องง่าย - อย่าคอมไพล์ crashlytics เมื่อไม่ต้องการ แทนที่การเรียก 'คอมไพล์' ด้วย 'releaseCompile' ภายในไฟล์ build.gradle

 releaseCompile('com.crashlytics.sdk.android:crashlytics:2.9.0@aar') {
        transitive = true
    }

3

รุ่นที่ง่ายที่สุดถึงวันที่เมื่อใช้ Gradle เพื่อสร้าง:

if (!BuildConfig.DEBUG) {
    Fabric.with(this, new Crashlytics());
}

มันใช้ไวยากรณ์ในตัวใหม่จากเนื้อผ้าสำหรับ Crashlytics และทำงานโดยอัตโนมัติด้วยการสร้าง Gradle


3

ปัญหาแปลก ๆ ที่ฉันพบ: ฉันทำตามคำตอบของXialin (ซึ่งปรากฏบนเว็บไซต์ทางการ) และมันไม่ทำงาน กลับกลายเป็นว่าฉันอ้างอิงBuildConfigในแพ็คเกจของ Fabric ซึ่งมีตัวแปร DEBUG แบบคงที่ที่ตั้งค่าเป็นเท็จแม้ในโหมดดีบัก

ดังนั้นหากคุณทำตามวิธีการแก้ปัญหาข้างต้นและคุณยังได้รับรายงานการตรวจแก้จุดบกพร่องตรวจสอบให้แน่ใจว่าคุณกำลังอ้างอิงสิ่งนี้:

import com.yourpackagename.BuildConfig;

และไม่ใช่สิ่งนี้:

import io.fabric.sdk.android.BuildConfig;    

2

หากคุณกังวลว่าBuildConfig.DEBUGการตั้งค่าไม่ถูกต้องให้ใช้ApplicationInfoแทน:

boolean isDebug = ( mAppContext.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE ) != 0;
Crashlytics crashlytics = new Crashlytics.Builder().disabled( isDebug ).build();
Fabric.with( uIContext, crashlytics );

2

ใช้รสชาติหรือสร้างการกำหนดค่า ใช้ตัวระบุบิลด์แยกต่างหากสำหรับ dev บิลด์และข้อขัดข้องทั้งหมดของคุณจะยังคงเป็นแอปแยกต่างหาก สามารถมีประโยชน์ในกรณีที่แชร์บิลด์กับเพียร์หรือใช้โดยไม่ต้องดีบักเกอร์ บางสิ่งเช่นนี้ -

    productFlavors {
    dev {
        applicationId "io.yourapp.developement"
    }
    staging {
        applicationId "io.yourapp.staging"
    }

    production {
        applicationId "io.yourapp.app"
    }

2

หากคุณต้องการบิลด์ที่สามารถ debuggable ได้นี่คือวิธี:

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 trueBuildConfig.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เนื่องจากพวกเขาดูเหมือนจะไม่ได้รับการอ้างอิงทุกที่ ฉันพลาดอะไรไปรึเปล่า?
จูลส์

@jules อยู่ในเอกสารdocs.fabric.io/android/crashlytics/build-tools.html
M. Reza Nasirloo

BuildConfig.BUILD_TYPE_DEBUG ซ้ำซ้อน BuildConfig.DEBUG สามารถใช้ในการรับค่าเดียวกัน
Antonis Radz

@AntonisRadz เพราะฉันต้องการรุ่นวางจำหน่ายที่สามารถ debuggable ได้
M. Reza Nasirloo

1

เราสามารถใช้วิธีการ isDebuggable () ของเนื้อผ้า

import static io.fabric.sdk.android.Fabric.isDebuggable;

if(! isDebuggable()){
    // set Crashlytics ... 
}

Happy coding :)


1

คุณสามารถใช้ไฟล์ Manifestสำหรับโหมดดีบัก (ใช้ได้กับฉันกับ Crashlytics 2.9.7):

สร้างไฟล์app/src/debug/AndroidManifest.xmlและเพิ่มสิ่งต่อไปนี้:

<application>

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

</application>

โปรดทราบว่าองค์ประกอบ meta-data นี้จะต้องใส่ลงใน debug / AndroidManifest.xml เท่านั้นและไม่เข้าไปใน AndroidManifest.xml ปกติ

วิธีแก้ปัญหาที่ใช้CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()ไม่ได้ผลสำหรับฉันและฉันพบว่า CrashlyticsInitProvider ถูกเตรียมใช้งานก่อนที่ CrashlyticsInitProvider ก่อนที่จะเรียก Application.onCreate () หรือกิจกรรมใด ๆ เริ่มต้นขึ้นซึ่งหมายความว่าการเริ่มต้นผ้าด้วยตนเองในแอปพลิเคชันหรือกิจกรรมไม่มี ผลกระทบเนื่องจากผ้าเริ่มต้นแล้ว


1

ขั้นตอนที่ 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


1

งานนี้สำหรับฉัน:

    releaseCompile  'com.crashlytics.sdk.android:crashlytics:2.9.9'

และใน buildTypes:

debug {
ext.enableCrashlytics = false
}

วิธีการเกี่ยวกับประเพณีของ Crashlytics ในรหัส? มันจะทำให้คุณรวบรวมข้อผิดพลาด
Micer

1

มีสองตัวเลือกในการปิดใช้งาน Firebase Crashlytics สำหรับ com.google.firebase รุ่นต่อไปนี้: firebase-crashlytics: 17.0.0:

  1. เพิ่มเมตาแท็กลงในรายการของแอป

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

หรือ

  1. กำหนดค่าโดยตรงในแอป (โปรดจำไว้ว่าเมื่อตั้งค่าเป็น "เท็จ" ค่าใหม่จะใช้ไม่ได้จนกว่าจะเรียกใช้แอปต่อไป)

FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true)


0

อีกวิธีหนึ่งถ้าคุณต้องการทำใน IDE ของคุณเท่านั้นคือออกจากปลั๊กอิน เห็นได้ชัดว่ามันจะหยุดส่งรายงานในขณะที่คุณกำลังสร้างงานสร้างโดยไม่ต้องเข้าสู่ระบบอีกครั้ง


0
  1. เพิ่มสิ่งนี้ลงใน build.gradle ของแอปของคุณ:

    android {
        buildTypes {
            debug {
              // Disable fabric build ID generation for debug builds
              ext.enableCrashlytics = false
              ...
  2. ปิดการใช้งานชุด 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);
  3. ใน AndroidManifest.xml ให้เพิ่ม

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

0

2020 ตอบผ้าโพสต์

วางรหัสด้านล่างในคลาสแอปพลิเคชันของคุณและเรียกวิธีการsetCrashlyticsStateจากแอปพลิเคชันของคุณบนสร้าง คุณสามารถเลือกที่จะเพิ่มรหัสอุปกรณ์ทดสอบลงในdebugDevicesHashSet ได้เช่นกันเพื่อให้สามารถละเว้นอุปกรณ์ส่วนบุคคลของคุณได้แม้ว่าจะสร้างในโหมดการเปิดตัวก็ตาม

บันทึก. รหัสอุปกรณ์ที่ส่งคืนโดย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 ที่ถูกต้อง มักจะมีหลายตัวเลือกและตัวเลือกที่ไม่ถูกต้องอาจถูกลากเข้ามา


-8

นี่เป็นคำตอบที่โง่ฉันรู้ว่า
เพิ่งออกความเห็นFabric.with(this, new Crashlytics());ทำงานและไม่แสดงความคิดเห็นเมื่อคุณต้องการปล่อย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.