หากแอป 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 : เพิ่ม Crashlytics SDK สำหรับ NDK ลงในแอปของคุณ
ใน ไฟล์ Gradle ของโมดูล (ระดับแอป) (โดยปกติคือ<project>/<app-module>/build.gradle
) ให้เพิ่มการอ้างอิงสำหรับไลบรารี Crashlytics NDK Android ขอแนะนำให้ใช้ Firebase Android BoM เพื่อควบคุมการกำหนดเวอร์ชันของไลบรารีเพื่อประสบการณ์ที่ดีที่สุดกับ Crashlytics เราขอแนะนำให้ เปิดใช้ Google Analytics ในโครงการ Firebase และเพิ่ม Firebase SDK สำหรับ Google Analytics ลงในแอปของคุณ
Kotlin+KTX
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:31.2.0') // Add 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 { // Add 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.3.3' implementation 'com.google.firebase:firebase-analytics-ktx:21.2.0' }
Java
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:31.2.0') // Add 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 { // Add 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.3.3' implementation 'com.google.firebase:firebase-analytics:21.2.0' }
ขั้นตอนที่ 2 : เพิ่มปลั๊กอิน Crashlytics Gradle ลงในแอปของคุณ
ในไฟล์ Gradle ระดับรูท (ระดับโปรเจ็กต์) (
<project>/build.gradle
) ให้เพิ่มปลั๊กอิน Crashlytics Gradle เป็นการพึ่งพา buildscript:buildscript { repositories { // Make sure that you have the following two repositories google() // Google's Maven repository mavenCentral() // Maven Central repository } dependencies { ... classpath 'com.android.tools.build:gradle:7.2.0' // Make sure that you have the Google services Gradle plugin dependency classpath 'com.google.gms:google-services:4.3.15' // Add the dependency for the Crashlytics Gradle plugin classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.2' } }
ในไฟล์ Gradle ของ โมดูล (ระดับแอป) (โดยปกติคือ
<project>/<app-module>/build.gradle
) ให้เพิ่มปลั๊กอิน Crashlytics Gradle:plugins { id 'com.android.application' // Make sure that you have the Google services Gradle plugin id 'com.google.gms.google-services' // Add the Crashlytics Gradle plugin id 'com.google.firebase.crashlytics' ... }
ขั้นตอนที่ 3 : เพิ่มส่วนขยาย firebaseCrashlytics
ให้กับงานสร้างของคุณ
ใน ไฟล์ Gradle ของโมดูล (ระดับแอป) (โดยปกติคือ app/build.gradle
) ให้เพิ่มส่วนขยาย firebaseCrashlytics
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 } } } }
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 } } } }
ขั้นตอนที่ 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 ขึ้นอยู่กับการมีอยู่ของ ID บิวด์ GNU ภายในวัตถุที่ใช้ร่วมกันแบบเนทีฟ
คุณสามารถตรวจสอบการมีอยู่ของ ID นี้ได้โดยเรียกใช้
readelf -n
ในแต่ละไบนารี หากไม่มี ID บิลด์ ให้เพิ่ม-Wl,--build-id
ให้กับแฟล็กของระบบบิลด์ของคุณเพื่อแก้ไขปัญหา
ขั้นตอนที่ 5 : บังคับให้ทดสอบข้อขัดข้องเพื่อสิ้นสุดการตั้งค่า
หากต้องการตั้งค่า Crashlytics ให้เสร็จสิ้นและดูข้อมูลเริ่มต้นในแดชบอร์ด Crashlytics ของคอนโซล Firebase คุณต้องบังคับการทดสอบการหยุดทำงาน
เพิ่มโค้ดในแอปของคุณเพื่อบังคับให้ทดสอบข้อขัดข้อง
คุณสามารถใช้รหัสต่อไปนี้ใน
MainActivity
ของแอปเพื่อเพิ่มปุ่มลงในแอปของคุณ ซึ่งเมื่อกดแล้วจะทำให้เกิดข้อขัดข้อง ปุ่มนี้มีชื่อว่า "Test Crash"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))
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));
สร้างและเรียกใช้แอปของคุณ
บังคับให้ทดสอบข้อขัดข้องเพื่อส่งรายงานข้อขัดข้องแรกของแอปของคุณ:
เปิดแอปของคุณจากอุปกรณ์ทดสอบหรือโปรแกรมจำลอง
ในแอปของคุณ ให้กดปุ่ม "ทดสอบการขัดข้อง" ที่คุณเพิ่มโดยใช้โค้ดด้านบน
หลังจากแอปขัดข้อง ให้รีสตาร์ทเพื่อให้แอปส่งรายงานข้อขัดข้องไปยัง Firebase ได้
ไปที่ แดชบอร์ด Crashlytics ของคอนโซล Firebase เพื่อดูข้อขัดข้องในการทดสอบของคุณ
หากคุณรีเฟรชคอนโซลแล้ว แต่ยังไม่พบการทดสอบข้อขัดข้องหลังจากผ่านไปห้านาที ให้เปิดใช้งานการบันทึกการแก้ไขจุดบกพร่อง เพื่อดูว่าแอปของคุณส่งรายงานข้อขัดข้องหรือไม่
และนั่นแหล่ะ! ขณะนี้ Crashlytics กำลังตรวจสอบแอปของคุณเพื่อหาข้อขัดข้อง และคุณสามารถดูและตรวจสอบรายงานและสถิติข้อขัดข้องได้ในแดชบอร์ดของ Crashlytics
ตัวเลือกอื่นสำหรับการอัปโหลดสัญลักษณ์
เวิร์กโฟลว์หลักในหน้านี้ด้านบนใช้ได้กับงานสร้าง Gradle มาตรฐาน อย่างไรก็ตาม แอปบางตัวใช้การกำหนดค่าหรือเครื่องมืออื่น (เช่น กระบวนการสร้างอื่นที่ไม่ใช่ Gradle) ในสถานการณ์เหล่านี้ ตัวเลือกต่อไปนี้อาจมีประโยชน์สำหรับการอัปโหลดสัญลักษณ์ให้สำเร็จ
ตัวเลือก : อัปโหลดสัญลักษณ์สำหรับโมดูลไลบรารีและการพึ่งพาภายนอก
ตัวเลือกนี้มีประโยชน์ในสถานการณ์ต่อไปนี้:
- หากคุณใช้กระบวนการสร้าง NDK แบบกำหนดเองภายใน Gradle
- หากไลบรารีเนทีฟของคุณสร้างขึ้นในไลบรารี/โมดูลคุณลักษณะหรือให้บริการโดยบุคคลที่สาม
- หาก งานอัปโหลดสัญลักษณ์อัตโนมัติ ล้มเหลวหรือคุณเห็นข้อขัดข้องที่ไม่มีสัญลักษณ์ในแดชบอร์ด
งานอัปโหลดสัญลักษณ์ Crashlytics มาตรฐานจะถือว่าคุณกำลังสร้างไลบรารีเนทีฟโดยเป็นส่วนหนึ่งของโครงสร้าง Gradle ของโมดูลแอป โดยใช้เครื่องมือสร้าง 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
หากไลบรารีเนทีฟที่ไม่ได้สตริปมีไว้ให้คุณในลักษณะที่ไม่สามารถเข้าถึงได้ระหว่างการสร้าง Gradle
ตัวเลือกนี้กำหนดให้คุณเรียกใช้คำสั่ง Firebase CLI เมื่อคุณสร้างรุ่นวางจำหน่ายหรือรุ่นใดๆ ที่คุณต้องการดูสแต็กเทรซที่เป็นสัญลักษณ์ในคอนโซล Firebase
ตรวจสอบให้แน่ใจว่าคุณได้ทำงานเริ่มต้นต่อไปนี้จากเวิร์กโฟลว์หลักก่อนหน้านี้ในหน้านี้เสร็จแล้ว:
โปรดทราบว่าด้วยตัวเลือกนี้ คุณไม่จำเป็นต้องเพิ่มส่วนขยาย
firebaseCrashlytics
หรือตั้งค่าการอัปโหลดสัญลักษณ์อัตโนมัติ เพราะคุณจะใช้ Firebase CLI แทน (ขั้นตอนถัดไปด้านล่าง) เพื่อสร้างและอัปโหลดไฟล์สัญลักษณ์ของคุณตั้งค่าสภาพแวดล้อมและโครงการของคุณสำหรับการอัปโหลดสัญลักษณ์:
ทำตามคำแนะนำเพื่อ ติดตั้ง Firebase CLI
หากคุณได้ติดตั้ง CLI แล้ว อย่าลืม อัปเดตเป็นเวอร์ชันล่าสุด
(สำหรับแอปที่ใช้ Android API ระดับ 30+ เท่านั้น) อัปเดตเทมเพลต
AndroidManifest.xml
ของแอปเพื่อปิดใช้งานการแท็กตัวชี้:ทำเครื่องหมายที่ช่องสำหรับ Android Player Settings > Publishing Settings > Build > Custom Main Manifest
เปิดเทมเพลตรายการที่
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 แอป Android ของ Firebase:1:567383003300:android:17104a2ced0c9b9b
มีสองวิธีในการค้นหารหัสแอป Firebase ของคุณ:
ในไฟล์
google-services.json
รหัสแอปของคุณคือค่าmobilesdk_app_id
หรือในคอนโซล Firebase ให้ไปที่ การตั้งค่าโครงการ เลื่อนลงไปที่การ์ด แอปของคุณ จากนั้นคลิกแอป Firebase ที่ต้องการเพื่อค้นหา ID แอป
PATH/TO/SYMBOLS : เส้นทางไปยังไฟล์สัญลักษณ์ที่สร้างโดย CLI
ส่งออกไปยังโครงการ Android Studio — PATH/TO/SYMBOLS สามารถเป็นไดเร็กทอรีใดก็ได้ Firebase CLI จะค้นหาซ้ำในไดเร็กทอรีที่ระบุสำหรับไลบรารีเนทีฟที่มีนามสกุล .
.so
สร้าง APK โดยตรงจากภายใน Unity — PATH/TO/SYMBOLS คือเส้นทางของไฟล์สัญลักษณ์ zip ที่สร้างขึ้นในไดเร็กทอรีรากของโปรเจ็กต์เมื่องานสร้างของคุณเสร็จสิ้น (เช่น:
myproject/myapp-1.0-v100.symbols.zip
)
ดูตัวเลือกขั้นสูงสำหรับการใช้คำสั่ง Firebase CLI สำหรับการสร้างและอัปโหลดไฟล์สัญลักษณ์
ธง คำอธิบาย --generator=csym
ใช้ตัวสร้างไฟล์สัญลักษณ์ cSYM แบบดั้งเดิมแทนตัวสร้าง Breakpad เริ่มต้น
ไม่แนะนำให้ใช้ ขอแนะนำให้ใช้ตัวสร้างไฟล์สัญลักษณ์ Breakpad ที่เป็นค่าเริ่มต้น
--generator=breakpad
ใช้ตัวสร้างไฟล์สัญลักษณ์ Breakpad
โปรดทราบว่าค่าเริ่มต้นสำหรับการสร้างไฟล์สัญลักษณ์คือ Breakpad ใช้แฟล็กนี้เฉพาะเมื่อคุณเพิ่ม
symbolGenerator { csym() }
ในการกำหนดค่าบิลด์ของคุณ และคุณต้องการแทนที่เพื่อใช้ Breakpad แทน--dry-run
สร้างไฟล์สัญลักษณ์แต่ไม่ได้อัปโหลด
แฟล็กนี้มีประโยชน์หากคุณต้องการตรวจสอบเนื้อหาของไฟล์ที่ส่ง
--debug
ให้ข้อมูลการดีบักเพิ่มเติม สุดท้าย บังคับการทดสอบข้อขัดข้อง เพื่อตั้งค่า Crashlytics ให้เสร็จสิ้น และดูข้อมูลเริ่มต้นในแดชบอร์ด Crashlytics ของคอนโซล Firebase
หลังจากที่คุณสร้างแอปโดยเป็นส่วนหนึ่งของการบังคับใช้ข้อขัดข้อง อย่าลืมเรียกใช้คำสั่ง Firebase CLI
crashlytics:symbols:upload
เพื่ออัปโหลดไฟล์สัญลักษณ์ของคุณ
การแก้ไขปัญหา
หากคุณเห็นสแต็กเทรซที่แตกต่างกันในคอนโซล Firebase และใน logcat โปรดดู คู่มือการแก้ปัญหา
ขั้นตอนถัดไป
ปรับแต่งการตั้งค่ารายงานข้อขัดข้องของคุณ โดยเพิ่มการรายงานแบบเลือกรับ บันทึก คีย์ และการติดตามข้อผิดพลาดที่ไม่ร้ายแรง
ผสานรวมกับ Google Play เพื่อให้คุณสามารถกรองรายงานข้อขัดข้องของแอป Android ตามแทร็กของ Google Play ได้โดยตรงในแดชบอร์ด Crashlytics สิ่งนี้ทำให้คุณสามารถมุ่งเน้นแดชบอร์ดของคุณไปที่งานสร้างเฉพาะได้ดีขึ้น