หากแอป Android ของคุณมี ไลบรารี เนทีฟ คุณสามารถเปิดใช้การติดตามสแต็กแบบเต็มและรายงานข้อขัดข้องโดยละเอียดสำหรับโค้ดเนทีฟจาก Firebase Crashlytics โดยมีการอัปเดตเล็กน้อยในการกำหนดค่าบิวด์ของแอป
คู่มือนี้อธิบายวิธีกำหนดค่าการรายงานข้อขัดข้องด้วย Firebase Crashlytics SDK สำหรับ NDK
หากคุณกำลังมองหาวิธีเริ่มต้นใช้งาน Crashlytics ในโครงการ Unity ของคุณ โปรดดูคู่มือ การเริ่มต้นใช้งาน Unity
ก่อนจะเริ่ม
หากคุณยังไม่ได้ เพิ่ม Firebase ในโครงการ Android ของคุณ หากคุณไม่มีแอป Android คุณสามารถดาวน์โหลด แอปตัวอย่าง
แนะนำ : หากต้องการรับคุณลักษณะต่างๆ เช่น ผู้ใช้ที่ไม่มีข้อขัดข้อง บันทึกการแสดงเส้นทาง และการแจ้งเตือนความเร็ว คุณต้องเปิดใช้ Google Analytics ในโครงการ Firebase
หากโปรเจ็กต์ Firebase ที่คุณมีอยู่ไม่ได้เปิดใช้งาน Google Analytics คุณสามารถเปิดใช้งาน Google Analytics ได้จาก แท็บ การผสานการ ทำงานใน > การตั้ง ค่าโปรเจ็ กต์ในคอนโซล Firebase
หากคุณกำลังสร้างโปรเจ็กต์ Firebase ใหม่ ให้เปิดใช้ Google Analytics ระหว่างขั้นตอนการสร้างโปรเจ็กต์
ขั้นตอนที่ 1 : เพิ่ม Firebase Crashlytics SDK สำหรับ NDK ในแอปของคุณ
ใช้ Firebase Android BoM ประกาศการพึ่งพาสำหรับไลบรารี Crashlytics NDK Android ใน ไฟล์ Gradle ของโมดูล (ระดับแอป) (โดยปกติapp/build.gradle
)เพื่อประสบการณ์การใช้งาน Crashlytics ที่ดีที่สุด เราขอแนะนำให้ เปิดใช้ Google Analytics ในโปรเจ็กต์ Firebase และเพิ่ม Firebase SDK สำหรับ Google Analytics ในแอปของคุณ
Java
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:30.1.0') // Declare the dependencies for the Crashlytics NDK and Analytics libraries // When using the BoM, you don't specify versions in Firebase library dependencies implementation 'com.google.firebase:firebase-crashlytics-ndk' implementation 'com.google.firebase:firebase-analytics' }
เมื่อใช้ Firebase Android BoM แอปของคุณจะใช้ไลบรารี Firebase Android เวอร์ชันที่เข้ากันได้เสมอ
(ทางเลือก) ประกาศการพึ่งพาไลบรารี Firebase โดยไม่ ใช้ BoM
หากคุณเลือกที่จะไม่ใช้ Firebase BoM คุณต้องระบุเวอร์ชันไลบรารี Firebase แต่ละเวอร์ชันในบรรทัดการพึ่งพา
โปรดทราบว่าหากคุณใช้ไลบรารี Firebase หลายรายการ ในแอปของคุณ เราขอแนะนำอย่างยิ่งให้ใช้ BoM เพื่อจัดการเวอร์ชันของไลบรารี ซึ่งจะทำให้มั่นใจได้ว่าทุกเวอร์ชันจะเข้ากันได้
dependencies { // Declare the dependencies for the Crashlytics NDK and Analytics libraries // When NOT using the BoM, you must specify versions in Firebase library dependencies implementation 'com.google.firebase:firebase-crashlytics-ndk:18.2.11' implementation 'com.google.firebase:firebase-analytics:21.0.0' }
Kotlin+KTX
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:30.1.0') // Declare the dependencies for the Crashlytics NDK and Analytics libraries // When using the BoM, you don't specify versions in Firebase library dependencies implementation 'com.google.firebase:firebase-crashlytics-ndk' implementation 'com.google.firebase:firebase-analytics-ktx' }
เมื่อใช้ Firebase Android BoM แอปของคุณจะใช้ไลบรารี Firebase Android เวอร์ชันที่เข้ากันได้เสมอ
(ทางเลือก) ประกาศการพึ่งพาไลบรารี Firebase โดยไม่ ใช้ BoM
หากคุณเลือกที่จะไม่ใช้ Firebase BoM คุณต้องระบุเวอร์ชันไลบรารี Firebase แต่ละเวอร์ชันในบรรทัดการพึ่งพา
โปรดทราบว่าหากคุณใช้ไลบรารี Firebase หลายรายการ ในแอปของคุณ เราขอแนะนำอย่างยิ่งให้ใช้ BoM เพื่อจัดการเวอร์ชันของไลบรารี ซึ่งจะทำให้มั่นใจได้ว่าทุกเวอร์ชันจะเข้ากันได้
dependencies { // Declare the dependencies for the Crashlytics NDK and Analytics libraries // When NOT using the BoM, you must specify versions in Firebase library dependencies implementation 'com.google.firebase:firebase-crashlytics-ndk:18.2.11' implementation 'com.google.firebase:firebase-analytics-ktx:21.0.0' }
ขั้นตอนที่ 2 : เพิ่มปลั๊กอิน Firebase Crashlytics ในแอปของคุณ
ในไฟล์
build.gradle
ระดับโปรเจ็กต์ ของคุณ ให้เพิ่มปลั๊กอิน Crashlytics Gradle เป็นการพึ่งพา buildscriptbuildscript { repositories { // Check that you have Google's Maven repository (if not, add it). google() } dependencies { // ... // Check that you have the Google services Gradle plugin v4.3.2 or later // (if not, add it). classpath 'com.google.gms:google-services:4.3.10' // Add the Crashlytics Gradle plugin classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.0' } } allprojects { repositories { // Check that you have Google's Maven repository (if not, add it). google() } }
ในไฟล์
build.gradle
ระดับแอป ให้ใช้ปลั๊กอิน Crashlytics Gradle:apply plugin: 'com.android.application' apply plugin: 'com.google.gms.google-services' // Google services Gradle plugin // Apply the Crashlytics Gradle plugin apply plugin: 'com.google.firebase.crashlytics'
ขั้นตอนที่ 3 : เพิ่มส่วนขยาย firebaseCrashlytics
ให้กับงานสร้างของคุณ
ใน ไฟล์ Gradle ของโมดูล (ระดับแอป) (ปกติคือ app/build.gradle
) ให้เพิ่มส่วนขยาย firebaseCrashlytics
Java
// ... android { // ... buildTypes { release { // Add this extension firebaseCrashlytics { // Enable processing and uploading of native symbols to Firebase servers. // By default, this is disabled to improve build speeds. // This flag must be enabled to see properly-symbolicated native // stack traces in the Crashlytics dashboard. nativeSymbolUploadEnabled true } } } }
Kotlin+KTX
// ... android { // ... buildTypes { release { // Add this extension firebaseCrashlytics { // Enable processing and uploading of native symbols to Firebase servers. // By default, this is disabled to improve build speeds. // This flag must be enabled to see properly-symbolicated native // stack traces in the Crashlytics dashboard. nativeSymbolUploadEnabled true } } } }
ขั้นตอนที่ 4 : ตั้งค่าการอัปโหลดสัญลักษณ์ดั้งเดิมโดยอัตโนมัติ
ในการสร้างสแต็กเทรซที่อ่านได้จากการขัดข้องของ NDK Crashlytics จำเป็นต้องรู้เกี่ยวกับสัญลักษณ์ในไบนารีเนทีฟของคุณ ปลั๊กอิน Crashlytics Gradle มีงาน uploadCrashlyticsSymbolFile BUILD_VARIANT
เพื่อทำให้กระบวนการนี้เป็นแบบอัตโนมัติ
เพื่อให้คุณสามารถเข้าถึงงานสำหรับการอัปโหลดสัญลักษณ์อัตโนมัติ ตรวจสอบให้แน่ใจว่า
nativeSymbolUploadEnabled
ถูกตั้งค่าtrue
ในไฟล์ Gradle ของโมดูล (ระดับแอป)เพื่อให้ชื่อเมธอดปรากฏในสแต็กเทรซของคุณ คุณต้องเรียกใช้งาน
uploadCrashlyticsSymbolFile BUILD_VARIANT
อย่างชัดเจน หลังจากแต่ละบิลด์ของไลบรารี NDK ของคุณ ตัวอย่างเช่น:>./gradlew app:assembleBUILD_VARIANT\ app:uploadCrashlyticsSymbolFileBUILD_VARIANT
ทั้ง Crashlytics SDK สำหรับ NDK และปลั๊กอิน Crashlytics Gradle ขึ้นอยู่กับการมีอยู่ของ GNU build ID ภายในอ็อบเจ็กต์ที่แชร์ในเครื่อง
คุณสามารถตรวจสอบการมีอยู่ของ ID นี้ได้โดยเรียกใช้
readelf -n
ในแต่ละไบนารี หากไม่มี build ID ให้เพิ่ม-Wl,--build-id
ในแฟล็กของระบบบิลด์ของคุณเพื่อแก้ไขปัญหา
ขั้นตอนที่ 5 : บังคับให้หยุดการทดสอบเพื่อสิ้นสุดการตั้งค่า
หากต้องการตั้งค่า Crashlytics ให้เสร็จสิ้นและดูข้อมูลเบื้องต้นในแดชบอร์ด Crashlytics ของคอนโซล Firebase คุณต้องบังคับให้มีการทดสอบขัดข้อง
เพิ่มโค้ดในแอปของคุณเพื่อใช้บังคับการทดสอบขัดข้อง
คุณสามารถใช้โค้ดต่อไปนี้ใน
MainActivity
ของแอปเพื่อเพิ่มปุ่มลงในแอปที่เมื่อกดแล้วจะทำให้เกิดข้อขัดข้อง ปุ่มนี้มีชื่อว่า "Test Crash"Java
Button crashButton = new Button(this); crashButton.setText("Test Crash"); crashButton.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { throw new RuntimeException("Test Crash"); // Force a crash } }); addContentView(crashButton, new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
Kotlin+KTX
val crashButton = Button(this) crashButton.text = "Test Crash" crashButton.setOnClickListener { throw RuntimeException("Test Crash") // Force a crash } addContentView(crashButton, ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT))
สร้างและเรียกใช้แอปของคุณ
บังคับให้การทดสอบขัดข้องเพื่อส่งรายงานข้อขัดข้องแรกของแอป:
เปิดแอปของคุณจากอุปกรณ์ทดสอบหรือโปรแกรมจำลอง
ในแอปของคุณ ให้กดปุ่ม "ทดสอบการขัดข้อง" ที่คุณเพิ่มโดยใช้โค้ดด้านบน
หลังจากที่แอปของคุณขัดข้อง ให้รีสตาร์ทเพื่อให้แอปของคุณสามารถส่งรายงานข้อขัดข้องไปยัง Firebase
ไปที่ แดชบอร์ด Crashlytics ของคอนโซล Firebase เพื่อดูข้อขัดข้องของการทดสอบ
หากคุณได้รีเฟรชคอนโซลแล้วและยังไม่เห็นการทดสอบขัดข้องหลังจากผ่านไปห้านาที ให้เปิดใช้งานการบันทึกการแก้ไขข้อบกพร่อง เพื่อดูว่าแอปของคุณส่งรายงานข้อขัดข้องหรือไม่
และนั่นแหล่ะ! ตอนนี้ Crashlytics กำลังตรวจสอบแอปของคุณเพื่อหาข้อขัดข้อง และคุณสามารถดูและตรวจสอบรายงานข้อขัดข้องและสถิติในแดชบอร์ด Crashlytics
ตัวเลือกอื่นสำหรับการอัพโหลดสัญลักษณ์
เวิร์กโฟลว์หลักในหน้านี้ด้านบนใช้ได้กับรุ่น Gradle มาตรฐาน อย่างไรก็ตาม บางแอปใช้การกำหนดค่าหรือเครื่องมือที่แตกต่างกัน (เช่น กระบวนการสร้างอื่นที่ไม่ใช่ Gradle) ในสถานการณ์เหล่านี้ ตัวเลือกต่อไปนี้อาจเป็นประโยชน์สำหรับการอัปโหลดสัญลักษณ์ได้สำเร็จ
ตัวเลือก : อัปโหลดสัญลักษณ์สำหรับโมดูลไลบรารีและการพึ่งพาภายนอก
ตัวเลือกนี้จะมีประโยชน์ในสถานการณ์ต่อไปนี้:
- หากคุณใช้กระบวนการสร้าง NDK ที่กำหนดเองภายใน Gradle
- หากไลบรารีดั้งเดิมของคุณสร้างขึ้นในโมดูลไลบรารี/คุณลักษณะหรือจัดหาโดยบุคคลที่สาม
- หาก งานอัปโหลดสัญลักษณ์อัตโนมัติ ล้มเหลวหรือคุณเห็นการขัดข้องที่ไม่มีสัญลักษณ์ในแดชบอร์ด
งานอัปโหลดสัญลักษณ์ Crashlytics มาตรฐานถือว่าคุณกำลังสร้างไลบรารีเนทีฟโดยเป็นส่วนหนึ่งของ Gradle build ของโมดูลแอปโดยใช้เครื่องมือสร้าง NDK มาตรฐาน เช่น CMake
อย่างไรก็ตาม หากคุณใช้กระบวนการบิลด์ NDK ที่ปรับแต่งเองภายใน Gradle หรือไลบรารีดั้งเดิมของคุณสร้างขึ้นในโมดูลไลบรารี/ฟีเจอร์หรือจัดหาให้โดยบุคคลที่สาม คุณอาจต้องระบุพาธไปยังไลบรารีที่ไม่ได้แยกไว้อย่างชัดเจน ในการทำสิ่งนี้ให้สำเร็จ คุณสามารถเพิ่มคุณสมบัติ unstrippedNativeLibsDir
ภายในส่วนขยาย firebaseCrashlytics
ในไฟล์ build.gradle
ของคุณ
ตรวจสอบให้แน่ใจว่าคุณได้ทำงานเริ่มต้นต่อไปนี้จากเวิร์กโฟลว์หลักก่อนหน้านี้ในหน้านี้:
เพื่อให้งานอัพโหลดสัญลักษณ์อัตโนมัติสามารถค้นหาข้อมูลสัญลักษณ์ของคุณ ให้เพิ่มสิ่งต่อไปนี้ในไฟล์
build.gradle
ของโมดูล (ระดับแอป):// ... android { // ... buildTypes { release { firebaseCrashlytics { nativeSymbolUploadEnabled true unstrippedNativeLibsDir file("PATH/TO/UNSTRIPPED/DIRECTORY") } } } }
ปลั๊กอิน Crashlytics จะค้นหาไดเรกทอรีที่ระบุซ้ำสำหรับไลบรารีดั้งเดิมที่มีนามสกุล .
.so
จากนั้น Crashlytics จะดึงสัญลักษณ์การดีบักออกจากไลบรารีดังกล่าวทั้งหมด และอัปโหลดไปยังเซิร์ฟเวอร์ Firebaseนี่คือสิ่งที่คุณสามารถระบุในคุณสมบัติ
unstrippedNativeLibsDir
:อาร์กิวเมนต์ใดๆ ที่อนุญาตสำหรับ
org.gradle.api.Project#files(Object...)
รวมถึง:java.lang.String
,java.io.File
หรือorg.gradle.api.file.FileCollection
หลายไดเร็กทอรีสำหรับการสร้างรสชาติเดียวโดยระบุรายการหรืออินสแตนซ์
FileCollection
สุดท้าย บังคับให้ทดสอบขัดข้อง เพื่อตั้งค่า Crashlytics ให้เสร็จและดูข้อมูลเบื้องต้นในแดชบอร์ด Crashlytics ของคอนโซล Firebase
ตัวเลือก : อัปโหลดสัญลักษณ์สำหรับบิลด์ที่ไม่ใช่ Gradle หรือไลบรารีเนทีฟที่ไม่สามารถเข้าถึงได้
ตัวเลือกนี้จะมีประโยชน์ในสถานการณ์ต่อไปนี้:
หากคุณใช้กระบวนการสร้างอื่นที่ไม่ใช่ Gradle
หากไลบรารีเนทีฟแบบ unstripped ของคุณมีให้ในลักษณะที่ไม่สามารถเข้าถึงได้ระหว่าง Gradle builds
ตัวเลือกนี้กำหนดให้คุณต้องเรียกใช้คำสั่ง Firebase CLI เมื่อคุณสร้างบิลด์รุ่นหรือบิลด์ใดๆ ที่คุณต้องการดูสแต็กเทรซแบบสัญลักษณ์ในคอนโซล Firebase
ตรวจสอบให้แน่ใจว่าคุณได้ทำงานเริ่มต้นต่อไปนี้จากเวิร์กโฟลว์หลักก่อนหน้านี้ในหน้านี้:
โปรดทราบว่าด้วยตัวเลือกนี้ คุณไม่จำเป็นต้องเพิ่มส่วนขยาย
firebaseCrashlytics
หรือตั้งค่าการอัปโหลดสัญลักษณ์อัตโนมัติ เนื่องจากคุณจะใช้ Firebase CLI แทน (ขั้นตอนถัดไปด้านล่าง) เพื่อสร้างและอัปโหลดไฟล์สัญลักษณ์ของคุณตั้งค่าสภาพแวดล้อมและโครงการของคุณสำหรับการอัปโหลดสัญลักษณ์:
ทำตามคำแนะนำเพื่อ ติดตั้ง Firebase CLI
หากคุณได้ติดตั้ง CLI แล้ว อย่าลืม อัปเดตเป็นเวอร์ชันล่าสุด
(สำหรับแอปที่ใช้ Android API ระดับ 30 ขึ้นไปเท่านั้น) อัปเดตเทมเพลต
AndroidManifest.xml
ของแอปเพื่อปิดใช้งานการติดแท็กตัวชี้:ทำเครื่องหมายที่ช่องสำหรับ การตั้งค่าโปรแกรมเล่น Android > การตั้งค่าการเผยแพร่ > บิลด์ > รายการหลักที่กำหนดเอง
เปิดเทมเพลตรายการซึ่งอยู่ที่
Assets/Plugins/Android/AndroidManifest.xml
เพิ่มแอตทริบิวต์ต่อไปนี้ให้กับแท็กแอปพลิเคชัน:
<application android:allowNativeHeapPointerTagging="false" ... />
สร้างโครงการของคุณ
อัปโหลดข้อมูลสัญลักษณ์ของคุณ
เมื่อบิลด์ของคุณเสร็จสิ้น ให้สร้างไฟล์สัญลักษณ์ที่เข้ากันได้กับ Crashlytics และอัปโหลดไปยังเซิร์ฟเวอร์ Firebase โดยเรียกใช้คำสั่ง Firebase CLI ต่อไปนี้:
firebase crashlytics:symbols:upload --app=FIREBASE_APP_ID PATH/TO/SYMBOLS
FIREBASE_APP_ID : รหัสแอป Firebase Android ของคุณ (ไม่ใช่ชื่อแพ็คเกจของคุณ)
ตัวอย่าง ID แอป Firebase สำหรับ Android:1:567383003300:android:17104a2ced0c9b9b
มีสองวิธีในการค้นหา Firebase App ID ของคุณ:
ในไฟล์
google-services.json
ของคุณ App ID ของคุณคือค่าmobilesdk_app_id
หรือในคอนโซล Firebase ให้ไปที่ การตั้งค่าโปรเจ็ กต์ของคุณ เลื่อนลงไปที่การ์ด แอปของคุณ จากนั้นคลิกแอป Firebase ที่ต้องการเพื่อค้นหา ID แอป
PATH/TO/SYMBOLS : เส้นทางไปยังไฟล์สัญลักษณ์ที่สร้างโดย CLI
ส่งออกไปยังโปรเจ็กต์ Android Studio — PATH/TO/SYMBOLS สามารถเป็นไดเร็กทอรีใดก็ได้ Firebase CLI จะค้นหาไดเรกทอรีที่ระบุซ้ำสำหรับไลบรารีดั้งเดิมที่มีนามสกุล .
.so
สร้าง APK โดยตรงจากภายใน Unity — PATH/TO/SYMBOLS คือพาธของไฟล์สัญลักษณ์ซิปที่สร้างขึ้นในไดเรกทอรีรากของโปรเจ็กต์เมื่อบิลด์ของคุณเสร็จสิ้น (เช่น
myproject/myapp-1.0-v100.symbols.zip
)
ดูตัวเลือกขั้นสูงสำหรับการใช้คำสั่ง Firebase CLI สำหรับการสร้างและอัปโหลดไฟล์สัญลักษณ์
ธง คำอธิบาย --generator=csym
ใช้ตัวสร้างไฟล์สัญลักษณ์ cSYM ดั้งเดิมแทนตัวสร้างเบรกแพดเริ่มต้น
ไม่แนะนำให้ใช้ เราขอแนะนำให้ใช้ตัวสร้างไฟล์สัญลักษณ์เบรกแพดเริ่มต้น
--generator=breakpad
ใช้ตัวสร้างไฟล์สัญลักษณ์เบรกแพด
โปรดทราบว่าค่าเริ่มต้นสำหรับการสร้างไฟล์สัญลักษณ์คือเบรกแพด ใช้การตั้งค่าสถานะนี้เฉพาะเมื่อคุณได้เพิ่ม
symbolGenerator { csym() }
ในการกำหนดค่าบิลด์ของคุณและคุณต้องการแทนที่เพื่อใช้ Breakpad แทน--dry-run
สร้างไฟล์สัญลักษณ์แต่ไม่อัพโหลด
แฟล็กนี้มีประโยชน์หากคุณต้องการตรวจสอบเนื้อหาของไฟล์ที่ส่ง
--debug
ให้ข้อมูลการดีบักเพิ่มเติม สุดท้าย บังคับให้ทดสอบขัดข้อง เพื่อตั้งค่า Crashlytics ให้เสร็จและดูข้อมูลเบื้องต้นในแดชบอร์ด Crashlytics ของคอนโซล Firebase
หลังจากที่คุณสร้างแอปของคุณโดยเป็นส่วนหนึ่งของการบังคับให้เกิดข้อขัดข้อง อย่าลืมเรียกใช้คำสั่ง Firebase CLI
crashlytics:symbols:upload
เพื่ออัปโหลดไฟล์สัญลักษณ์ของคุณ
การแก้ไขปัญหา
หากคุณเห็นสแต็กเทรซต่างๆ ในคอนโซล Firebase และใน logcat ให้อ้างอิงกับ คู่มือการแก้ไขปัญหา
ขั้นตอนถัดไป
ปรับแต่งการตั้งค่ารายงานข้อขัดข้อง ด้วยการเพิ่มการรายงาน บันทึก คีย์ และการติดตามข้อผิดพลาดที่ไม่ร้ายแรง
ผสานรวมกับ Google Play เพื่อให้คุณสามารถกรองรายงานข้อขัดข้องของแอป Android ตามแทร็ก Google Play ได้โดยตรงในแดชบอร์ดของ Crashlytics ซึ่งจะทำให้คุณสามารถโฟกัสแดชบอร์ดของคุณไปที่บิลด์เฉพาะได้ดีขึ้น