Catch up on everything we announced at this year's Firebase Summit. Learn more

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

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

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

หากคุณกำลังมองหาวิธีการที่จะเริ่มต้นกับ Crashlytics ในโครงการความสามัคคีของคุณตรวจสอบ ความสามัคคีคู่มือการเริ่มต้น

ก่อนจะเริ่ม

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

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

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

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

ขั้นตอนที่ 1: เปิดใช้งาน Crashlytics ในคอนโซล Firebase

  1. ไปที่ แผงควบคุม Crashlytics ในคอนโซล Firebase

  2. ให้แน่ใจว่าแอปของคุณถูกเลือกจากแบบเลื่อนลงถัด Crashlytics ที่ด้านบนของหน้า

  3. คลิกเปิดใช้งาน Crashlytics

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

ใช้ Firebase Android BoM ประกาศพึ่งพาสำหรับห้องสมุด Crashlytics NDK Android ในโมดูลของคุณ (app ระดับ) ไฟล์ Gradle (ปกติ app/build.gradle )

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

Java

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

    // 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.5'
    implementation 'com.google.firebase:firebase-analytics:20.0.0'
}

คอตลิน+KTX

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

    // 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.5'
    implementation 'com.google.firebase:firebase-analytics-ktx:20.0.0'
}

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

  1. ในโครงการระดับ build.gradle ไฟล์เพิ่มปลั๊กอิน Crashlytics Gradle เป็นพึ่งพา buildscript

    buildscript {
        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.8.1'
        }
    }
    
    allprojects {
        repositories {
            // Check that you have Google's Maven repository (if not, add it).
            google()
        }
    }
  2. ใน app ระดับ 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'
    

ขั้นตอนที่ 4: เพิ่ม firebaseCrashlytics ขยายการสร้างของคุณ

ในโมดูลของคุณ (app ระดับ) ไฟล์ 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
          }
      }
  }
}

คอตลิน+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
          }
      }
  }
}

ที่จำเป็นสำหรับการ targetSdkLevel 30 และเหนือ: คุณต้องปิดการใช้งานตัวชี้การติดแท็กใน app ของคุณโดยการเพิ่มต่อไปนี้เพื่อคุณ AndroidManifest.xml :

<application android:allowNativeHeapPointerTagging="false">
...
</application>

สำหรับข้อมูลเพิ่มเติมโปรดอ่าน การสนับสนุนนักพัฒนาซอฟต์แวร์สำหรับ Tagged ชี้

ขั้นตอนที่ 5: การตั้งค่าอัปโหลดโดยอัตโนมัติจากสัญลักษณ์พื้นเมือง

ในการสร้างสแต็กเทรซที่อ่านได้จากการขัดข้องของ NDK Crashlytics จำเป็นต้องรู้เกี่ยวกับสัญลักษณ์ในไบนารีเนทีฟของคุณ ปลั๊กอิน Crashlytics Gradle รวมถึง uploadCrashlyticsSymbolFile BUILD_VARIANT งานเพื่อทำให้กระบวนการนี้

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

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

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

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

ขั้นตอนที่ 6: กองทัพความผิดพลาดของการทดสอบที่จะเสร็จสิ้นการติดตั้ง

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

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

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

    คอตลิน+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))
    
  2. สร้างและเรียกใช้แอปของคุณ

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

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

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

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

  4. ไปที่ แผงควบคุม Crashlytics ของคอนโซล Firebase เพื่อดูความผิดพลาดของการทดสอบของคุณ

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


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



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

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

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

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

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

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

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

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

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



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

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

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