รับรายงานข้อขัดข้องของ Android NDK

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

คู่มือนี้อธิบายวิธีกำหนดค่าการรายงานข้อขัดข้องด้วย Firebase Crashlytics SDK สำหรับ NDK

หากคุณกำลังมองหาวิธีเริ่มต้นใช้งาน Crashlytics ในโปรเจ็กต์ Unity โปรดดู คู่มือเริ่มต้นใช้งาน Unity

ก่อนที่คุณจะเริ่มต้น

  1. หากคุณยังไม่ได้ ดำเนินการ ให้เพิ่ม Firebase ในโครงการ Android ของคุณ หากคุณไม่มีแอป Android คุณสามารถดาวน์โหลด แอปตัวอย่างได้

  2. แนะนำ : หากต้องการรับคุณลักษณะต่างๆ เช่น ผู้ใช้ที่ปราศจากข้อขัดข้อง บันทึกการแสดงเส้นทาง และการแจ้งเตือนความเร็ว คุณต้องเปิดใช้ Google Analytics ในโครงการ Firebase

    • หากโปรเจ็กต์ Firebase ที่มีอยู่ของคุณไม่ได้เปิดใช้งาน Google Analytics คุณสามารถเปิดใช้งาน Google Analytics จาก แท็บ การผสานรวม ของ > การตั้งค่าโปรเจ็กต์ ในคอนโซล Firebase

    • หากคุณกำลังสร้างโปรเจ็กต์ Firebase ใหม่ ให้เปิดใช้ Google Analytics ระหว่างเวิร์กโฟลว์การสร้างโปรเจ็กต์

ขั้นตอนที่ 1 : เพิ่ม Crashlytics SDK สำหรับ NDK ลงในแอปของคุณ

ใน ไฟล์ Gradle ของโมดูล (ระดับแอป) (โดยปกติคือ <project>/<app-module>/build.gradle.kts หรือ <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:32.3.1"))

    // 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.4.3")
    implementation("com.google.firebase:firebase-analytics-ktx:21.3.0")
}

Java

dependencies {
    // Import the BoM for the Firebase platform
    implementation(platform("com.google.firebase:firebase-bom:32.3.1"))

    // 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.4.3")
    implementation("com.google.firebase:firebase-analytics:21.3.0")
}

ขั้นตอนที่ 2 : เพิ่มปลั๊กอิน Crashlytics Gradle ลงในแอปของคุณ

  1. ในไฟล์ Gradle ระดับรูท (ระดับโปรเจ็กต์) ( <project>/build.gradle.kts หรือ <project>/build.gradle ) ให้เพิ่มปลั๊กอิน Crashlytics Gradle ลงในบล็อก plugins :

    Kotlin

    plugins {
        id("com.android.application") version "7.2.0" apply false
        // ...
    
        // Make sure that you have the Google services Gradle plugin dependency
        id("com.google.gms.google-services") version "4.3.15" apply false
    
        // Add the dependency for the Crashlytics Gradle plugin
        id("com.google.firebase.crashlytics") version "2.9.9" apply false
    }
    

    Groovy

    plugins {
        id 'com.android.application' version '7.2.0' apply false
        // ...
    
        // Make sure that you have the Google services Gradle plugin dependency
        id 'com.google.gms.google-services' version '4.3.15' apply false
    
        // Add the dependency for the Crashlytics Gradle plugin
        id 'com.google.firebase.crashlytics' version '2.9.9' apply false
    }
    
  2. ในไฟล์ Gradle ของ โมดูล (ระดับแอป) (โดยปกติคือ <project>/<app-module>/build.gradle.kts หรือ <project>/<app-module>/build.gradle ) ให้เพิ่มปลั๊กอิน Crashlytics Gradle:

    Kotlin

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

    Groovy

    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 : เพิ่มส่วนขยาย Crashlytics ให้กับงานสร้างของคุณ

ในไฟล์ Gradle ของ โมดูล (ระดับแอป) (โดยปกติคือ <project>/<app-module>/build.gradle.kts หรือ <project>/<app-module>/build.gradle ) ให้กำหนดค่าส่วนขยาย Crashlytics

Kotlin

import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsExtension

// ...

android {
  // ...
  buildTypes {
      getByName("release") {
          // Add this extension
          configure<CrashlyticsExtension> {
              // 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
          }
      }
  }
}

Groovy

// ...

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 เพื่อทำให้กระบวนการนี้เป็นไปโดยอัตโนมัติ

  1. เพื่อให้คุณสามารถเข้าถึงงานสำหรับการอัปโหลดสัญลักษณ์อัตโนมัติ ตรวจสอบให้แน่ใจว่าได้ตั้งค่า nativeSymbolUploadEnabled เป็น true ในไฟล์ Gradle โมดูลของคุณ (ระดับแอป)

  2. เพื่อให้ชื่อเมธอดปรากฏในสแต็กเทรซของคุณ คุณต้องเรียกใช้งาน uploadCrashlyticsSymbolFile BUILD_VARIANT หลังจากแต่ละบิลด์ของไลบรารี NDK ของคุณอย่างชัดเจน ตัวอย่างเช่น:

    >./gradlew app:assembleBUILD_VARIANT\
               app:uploadCrashlyticsSymbolFileBUILD_VARIANT
    
  3. ทั้ง Crashlytics SDK สำหรับ NDK และปลั๊กอิน Crashlytics Gradle ขึ้นอยู่กับการมีอยู่ของ ID บิลด์ GNU ภายในออบเจกต์ที่ใช้ร่วมกันแบบเนทีฟ

    คุณสามารถตรวจสอบการมีอยู่ของ ID นี้ได้โดยเรียกใช้ readelf -n ในแต่ละไบนารี หากไม่มี ID บิลด์ ให้เพิ่ม -Wl,--build-id ให้กับแฟล็กของระบบบิลด์ของคุณเพื่อแก้ไขปัญหา

ขั้นตอนที่ 5 : บังคับให้ทดสอบข้อขัดข้องเพื่อสิ้นสุดการตั้งค่า

หากต้องการตั้งค่า Crashlytics ให้เสร็จสิ้นและดูข้อมูลเริ่มต้นในแดชบอร์ด Crashlytics ของคอนโซล Firebase คุณต้องบังคับการทดสอบการหยุดทำงาน

  1. เพิ่มโค้ดในแอปของคุณเพื่อบังคับให้ทดสอบข้อขัดข้อง

    คุณสามารถใช้รหัสต่อไปนี้ใน 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));
    
  2. สร้างและเรียกใช้แอปของคุณ

  3. บังคับให้ทดสอบข้อขัดข้องเพื่อส่งรายงานข้อขัดข้องแรกของแอปของคุณ:

    1. เปิดแอปของคุณจากอุปกรณ์ทดสอบหรือโปรแกรมจำลอง

    2. ในแอปของคุณ ให้กดปุ่ม "ทดสอบการขัดข้อง" ที่คุณเพิ่มโดยใช้โค้ดด้านบน

    3. หลังจากแอปขัดข้อง ให้รีสตาร์ทเพื่อให้แอปส่งรายงานข้อขัดข้องไปยัง Firebase ได้

  4. ไปที่ แดชบอร์ด Crashlytics ของคอนโซล Firebase เพื่อดูข้อขัดข้องในการทดสอบของคุณ

    หากคุณรีเฟรชคอนโซลแล้ว แต่ยังไม่พบการทดสอบข้อขัดข้องหลังจากผ่านไปห้านาที ให้เปิดใช้งานการบันทึกการแก้ไขจุดบกพร่อง เพื่อดูว่าแอปของคุณส่งรายงานข้อขัดข้องหรือไม่


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

ขั้นตอนถัดไป

  • (แนะนำ) รับความช่วยเหลือในการแก้ไขข้อขัดข้องที่เกิดจากข้อผิดพลาดของหน่วยความจำภายในโดย รวบรวมรายงาน GWP-ASan ข้อผิดพลาดเกี่ยวกับหน่วยความจำเหล่านี้อาจเชื่อมโยงกับความเสียหายของหน่วยความจำภายในแอปของคุณ ซึ่งเป็นสาเหตุหลักของช่องโหว่ด้านความปลอดภัยของแอป หากต้องการใช้ประโยชน์จากคุณลักษณะการแก้ไขข้อบกพร่องนี้ ตรวจสอบให้แน่ใจว่าแอปของคุณ เปิดใช้งาน GWP-ASan อย่างชัดเจน และใช้ Crashlytics SDK ล่าสุดสำหรับ NDK (v18.3.6+ หรือ Firebase BoM v31.3.0+)

  • ปรับแต่งการตั้งค่ารายงานข้อขัดข้องของคุณ โดยเพิ่มการรายงานแบบเลือกรับ บันทึก คีย์ และการติดตามข้อผิดพลาดที่ไม่ร้ายแรง

  • ผสานรวมกับ Google Play เพื่อให้คุณสามารถกรองรายงานข้อขัดข้องของแอป Android ตามแทร็กของ Google Play ได้โดยตรงในแดชบอร์ด Crashlytics สิ่งนี้ทำให้คุณสามารถมุ่งเน้นแดชบอร์ดของคุณไปที่งานสร้างเฉพาะได้ดีขึ้น

การแก้ไขปัญหา

หากคุณเห็นสแต็กเทรซที่แตกต่างกันในคอนโซล Firebase และใน logcat โปรดดู คู่มือการแก้ไขปัญหา



ตัวเลือกอื่นสำหรับการอัปโหลดสัญลักษณ์

เวิร์กโฟลว์หลักในหน้านี้ด้านบนใช้ได้กับงานสร้าง Gradle มาตรฐาน อย่างไรก็ตาม แอปบางตัวใช้การกำหนดค่าหรือเครื่องมืออื่น (เช่น กระบวนการสร้างอื่นที่ไม่ใช่ Gradle) ในสถานการณ์เหล่านี้ ตัวเลือกต่อไปนี้อาจมีประโยชน์สำหรับการอัปโหลดสัญลักษณ์ให้สำเร็จ

ตัวเลือก : อัปโหลดสัญลักษณ์สำหรับโมดูลไลบรารีและการพึ่งพาภายนอก

ตัวเลือกนี้มีประโยชน์ในสถานการณ์ต่อไปนี้:

  • หากคุณใช้กระบวนการสร้าง NDK แบบกำหนดเองภายใน Gradle
  • หากไลบรารีเนทีฟของคุณสร้างขึ้นในไลบรารี/โมดูลคุณลักษณะหรือให้บริการโดยบุคคลที่สาม
  • หาก งานอัปโหลดสัญลักษณ์อัตโนมัติ ล้มเหลวหรือคุณเห็นข้อขัดข้องที่ไม่มีสัญลักษณ์ในแดชบอร์ด

ตัวเลือก : อัปโหลดสัญลักษณ์สำหรับรุ่นที่ไม่ใช่ Gradle หรือไลบรารี่เนทีฟที่ไม่สามารถเข้าถึงได้

ตัวเลือกนี้มีประโยชน์ในสถานการณ์ต่อไปนี้:

  • หากคุณใช้กระบวนการสร้างอื่นที่ไม่ใช่ Gradle

  • หากไลบรารีเนทีฟที่ไม่ได้สตริปมีไว้ให้คุณในลักษณะที่ไม่สามารถเข้าถึงได้ระหว่างการสร้าง Gradle