เริ่มต้นใช้งาน Crashlytics สำหรับ Android NDK

เลือกแพลตฟอร์ม: iOS+ Android Android NDK Flutter Unity


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

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

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

ก่อนเริ่มต้น

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

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

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

    • หากจะสร้างโปรเจ็กต์ Firebase ใหม่ ให้เปิดใช้ Google Analytics ในระหว่างขั้นตอนการสร้างโปรเจ็กต์

  3. ตรวจสอบว่าแอปของคุณมีเวอร์ชันขั้นต่ำที่จำเป็นต่อไปนี้

    • Gradle 8.0
    • ปลั๊กอิน Android Gradle 8.1.0
    • ปลั๊กอิน Gradle สำหรับบริการของ Google 4.4.1

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

ในไฟล์ Gradle ของโมดูล (ระดับแอป) (โดยมากจะเป็น <project>/<app-module>/build.gradle.kts หรือ <project>/<app-module>/build.gradle) ให้เพิ่มทรัพยากร Dependency สำหรับCrashlyticsคลัง NDK สำหรับ Android เราขอแนะนำให้ใช้ Firebase Android BoM เพื่อควบคุมการกำหนดเวอร์ชันของไลบรารี

เพื่อประสบการณ์การใช้งาน Crashlytics ที่ดีที่สุด เราขอแนะนําให้ เปิดใช้ Google Analytics ในโปรเจ็กต์ Firebase และเพิ่ม Firebase SDK สำหรับ Google Analytics ลงในแอป

dependencies {
    // Import the BoM for the Firebase platform
    implementation(platform("com.google.firebase:firebase-bom:34.11.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 แต่ละรายการ ในบรรทัดทรัพยากร Dependency

โปรดทราบว่าหากคุณใช้ไลบรารี 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:20.0.4")
    implementation("com.google.firebase:firebase-analytics:23.2.0")
}

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

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

    Kotlin

    plugins {
        // Make sure that you have the AGP plugin 8.1+ dependency
        id("com.android.application") version "8.1.4" apply false
        // ...
    
        // Make sure that you have the Google services Gradle plugin 4.4.1+ dependency
        id("com.google.gms.google-services") version "4.4.4" apply false
    
        // Add the dependency for the Crashlytics Gradle plugin
        id("com.google.firebase.crashlytics") version "3.0.6" apply false
    }

    Groovy

    plugins {
        // Make sure that you have the AGP plugin 8.1+ dependency
        id 'com.android.application' version '8.1.4' apply false
        // ...
    
        // Make sure that you have the Google services Gradle plugin 4.4.1+ dependency
        id 'com.google.gms.google-services' version '4.4.4' apply false
    
        // Add the dependency for the Crashlytics Gradle plugin
        id 'com.google.firebase.crashlytics' version '3.0.6' 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: ตั้งค่าการอัปโหลดสัญลักษณ์ดั้งเดิมโดยอัตโนมัติ

หากต้องการสร้าง Stack Trace ที่อ่านได้จากข้อขัดข้องของ NDK Crashlytics ต้องทราบ เกี่ยวกับสัญลักษณ์ในไบนารีแบบเนทีฟ Crashlytics ปลั๊กอิน Gradle มีงาน uploadCrashlyticsSymbolFileBUILD_VARIANT เพื่อทำให้กระบวนการนี้เป็นแบบอัตโนมัติ

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

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

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

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

ขั้นตอนที่ 5: บังคับให้แอปทดสอบขัดข้องเพื่อตั้งค่าให้เสร็จสมบูรณ์

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

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

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

    Kotlin

    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เพื่อดูข้อขัดข้องในการทดสอบ

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


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

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

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

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

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

การแก้ปัญหา

หากเห็น Stack Trace ที่แตกต่างกันในFirebaseคอนโซลและใน Logcat โปรดดูคู่มือการแก้ปัญหา



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

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

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

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

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

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

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

  • หากคุณใช้กระบวนการบิลด์อื่นที่ไม่ใช่ Gradle

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