Android NDK की क्रैश रिपोर्ट पाएं

अगर आपके Android ऐप्लिकेशन में नेटिव लाइब्रेरी हैं, तो Firebase Crashlytics से अपने नेटिव कोड के लिए, फ़ुल स्टैक ट्रेस और ज़्यादा जानकारी वाली क्रैश रिपोर्ट चालू की जा सकती है. इसके लिए, आपको अपने ऐप्लिकेशन के बिल्ड कॉन्फ़िगरेशन में कुछ छोटे-मोटे अपडेट करने होंगे.

इस गाइड में बताया गया है कि एनडीके के लिए Firebase Crashlytics SDK की मदद से, क्रैश की रिपोर्ट कैसे कॉन्फ़िगर की जाती है.

अगर आपको अपने Unity प्रोजेक्ट में Crashlytics का इस्तेमाल शुरू करने का तरीका जानना है, तो Unity प्रोजेक्ट के लिए शुरुआती निर्देश देखें.

शुरू करने से पहले

  1. अगर आपने पहले से ऐसा नहीं किया है, तो अपने Android प्रोजेक्ट में Firebase जोड़ें. अगर आपके पास Android ऐप्लिकेशन नहीं है, तो सैंपल ऐप्लिकेशन डाउनलोड किया जा सकता है.

  2. इसका सुझाव दिया जाता है: अगर आपको उपयोगकर्ता की कार्रवाइयों के बारे में जानने के लिए, अपने-आप ब्रेडक्रंब लॉग मिलेंगे, जिनमें क्रैश, नुकसान न पहुंचाने वाला या ANR इवेंट हुआ, तो आपको अपने Firebase प्रोजेक्ट में Google Analytics की सुविधा चालू करनी होगी.

    • अगर आपके मौजूदा Firebase प्रोजेक्ट में Google Analytics चालू नहीं है, तो Firebase कंसोल में > प्रोजेक्ट सेटिंग के इंटिग्रेशन टैब से, Google Analytics को चालू किया जा सकता है.

    • अगर आपको नया Firebase प्रोजेक्ट बनाना है, तो प्रोजेक्ट बनाने के वर्कफ़्लो के दौरान Google Analytics चालू करें.

  3. पक्का करें कि आपके ऐप्लिकेशन में कम से कम ये वर्शन ज़रूरी हों:

    • ग्रेडल 8.0
    • Android Gradle प्लगिन 8.1.0
    • Google की सेवाएं Gradle प्लगिन 4.4.1

पहला चरण: अपने ऐप्लिकेशन में एनडीके के लिए Crashlytics SDK टूल जोड़ें

अपने मॉड्यूल (ऐप्लिकेशन-लेवल) की Gradle फ़ाइल (आम तौर पर <project>/<app-module>/build.gradle.kts या <project>/<app-module>/build.gradle), Android के लिए Crashlytics एनडीके लाइब्रेरी के लिए डिपेंडेंसी जोड़ें. लाइब्रेरी वर्शन को कंट्रोल करने के लिए, Firebase Android BoM का इस्तेमाल करने का सुझाव दिया जाता है.

Crashlytics का बेहतर अनुभव पाने के लिए, हमारा सुझाव है कि अपने Firebase प्रोजेक्ट में Google Analytics चालू करें. साथ ही, अपने ऐप्लिकेशन में Google Analytics के लिए Firebase SDK टूल जोड़ें.

dependencies {
    // Import the BoM for the Firebase platform
    implementation(platform("com.google.firebase:firebase-bom:33.0.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 लाइब्रेरी के साथ काम करने वाले वर्शन का इस्तेमाल करेगा.

(अन्य) BoM का इस्तेमाल किए बिना Firebase लाइब्रेरी डिपेंडेंसी जोड़ें

अगर आपको 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:19.0.0")
    implementation("com.google.firebase:firebase-analytics:22.0.0")
}
क्या आपको Kotlin के लिए खास लाइब्रेरी मॉड्यूल की तलाश है? अक्टूबर 2023 (Firebase BoM 32.5.0) से, Kotlin और Java डेवलपर, दोनों के मुख्य लाइब्रेरी मॉड्यूल पर निर्भर हो सकते हैं. ज़्यादा जानकारी के लिए, इस पहल के बारे में अक्सर पूछे जाने वाले सवाल देखें.

दूसरा चरण: अपने ऐप्लिकेशन में Crashlytics Gradle प्लगिन जोड़ें

  1. अपने रूट-लेवल (प्रोजेक्ट-लेवल) Gradle फ़ाइल (<project>/build.gradle.kts या <project>/build.gradle) में, plugins ब्लॉक में Crashlytics Gradle प्लगिन जोड़ें:

    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.1" apply false
    
        // Add the dependency for the Crashlytics Gradle plugin
        id("com.google.firebase.crashlytics") version "3.0.0" 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.1' apply false
    
        // Add the dependency for the Crashlytics Gradle plugin
        id 'com.google.firebase.crashlytics' version '3.0.0' 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'
    }

तीसरा चरण: अपने बिल्ड में 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
          }
      }
  }
}

चौथा चरण: नेटिव सिंबल को अपने-आप अपलोड करने की सुविधा सेट अप करना

एनडीके क्रैश से पढ़ने लायक स्टैक ट्रेस बनाने के लिए, Crashlytics को आपकी नेटिव बाइनरी में मौजूद सिंबल के बारे में जानकारी होनी चाहिए. Crashlytics Gradle प्लगिन में, uploadCrashlyticsSymbolFileBUILD_VARIANT टास्क शामिल है, ताकि यह प्रोसेस अपने-आप हो सके.

  1. पक्का करें कि आपके मॉड्यूल (ऐप्लिकेशन लेवल) में nativeSymbolUploadEnabled को true पर सेट किया गया हो, ताकि ग्रेडल फ़ाइल के अपने-आप अपलोड होने की सुविधा के लिए आपको टास्क ऐक्सेस किया जा सके.

  2. स्टैक ट्रेस में तरीकों के नाम दिखाने के लिए, आपको एनडीके लाइब्रेरी के हर बिल्ड के बाद, uploadCrashlyticsSymbolFileBUILD_VARIANTटास्क शुरू करना होगा. उदाहरण के लिए:

    >./gradlew app:assembleBUILD_VARIANT\
               app:uploadCrashlyticsSymbolFileBUILD_VARIANT
    
  3. एनडीके के लिए Crashlytics SDK टूल और Crashlytics Gradle प्लगिन, शेयर किए गए नेटिव ऑब्जेक्ट में GNU बिल्ड आईडी की मौजूदगी पर निर्भर करता है.

    हर बाइनरी पर readelf -n चलाकर, इस आईडी की मौजूदगी की पुष्टि की जा सकती है. अगर बिल्ड आईडी मौजूद नहीं है, तो समस्या को ठीक करने के लिए, अपने बिल्ड सिस्टम के फ़्लैग में -Wl,--build-id जोड़ें.

पांचवां चरण: सेटअप पूरा करने के लिए, टेस्ट क्रैश को ज़बरदस्ती करें

Crashlytics का सेट अप पूरा करने और 'Firebase कंसोल' के Crashlytics डैशबोर्ड में शुरुआती डेटा देखने के लिए, आपको टेस्ट क्रैश करना होगा.

  1. अपने ऐप्लिकेशन में ऐसा कोड जोड़ें जिसका इस्तेमाल, ज़बरदस्ती टेस्ट क्रैश करने के लिए किया जा सके.

    ऐप्लिकेशन में एक बटन जोड़ने के लिए, ऐप्लिकेशन के MainActivity में इस कोड का इस्तेमाल किया जा सकता है. इस बटन को दबाने पर, क्रैश हो जाता है. बटन पर "टेस्ट क्रैश" का लेबल होगा.

    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. टेस्ट क्रैश देखने के लिए, Firebase कंसोल के Crashlytics डैशबोर्ड पर जाएं.

    अगर आपने कंसोल रीफ़्रेश किया है और पांच मिनट के बाद भी टेस्ट क्रैश, नहीं दिखता है, तो डीबग लॉग करने की सुविधा चालू करके देखें कि आपका ऐप्लिकेशन क्रैश रिपोर्ट भेज रहा है या नहीं.


बस इतना ही! Crashlytics से, अब ऐप्लिकेशन के क्रैश होने की जांच की जा रही है. साथ ही, Crashlytics डैशबोर्ड में क्रैश रिपोर्ट और आंकड़े देखे जा सकते हैं और उनकी जांच की जा सकती है.

अगले चरण

  • (सुझाया गया) नेटिव मेमोरी की गड़बड़ियों की वजह से होने वाले क्रैश को डीबग करने में मदद पाएं. इसके लिए, GWP-ASan की रिपोर्ट इकट्ठा करें. मेमोरी से जुड़ी ये गड़बड़ियां आपके ऐप्लिकेशन में मेमोरी खराब होने की वजह से हो सकती हैं. यह ऐप्लिकेशन की सुरक्षा में जोखिम की सबसे बड़ी वजह है. डीबग करने की इस सुविधा का फ़ायदा पाने के लिए, पक्का करें कि आपके ऐप्लिकेशन में GWP-ASan की सुविधा को साफ़ तौर पर चालू किया गया है. साथ ही, एनडीके के लिए, Crashlytics SDK का नया वर्शन (v18.3.6 या इसके बाद के वर्शन या Firebase BoM v31.3.0+) इस्तेमाल किया गया हो.

  • ऑप्ट-इन रिपोर्टिंग, लॉग, कुंजी, और साधारण गड़बड़ियों की ट्रैकिंग जोड़कर, ऐप्लिकेशन की क्रैश रिपोर्ट का सेटअप अपनी पसंद के मुताबिक बनाएं.

  • Google Play के साथ इंटिग्रेट करें, ताकि Crashlytics डैशबोर्ड में, अपने Android ऐप्लिकेशन की क्रैश रिपोर्ट को Google Play ट्रैक के हिसाब से फ़िल्टर किया जा सके. इससे अपने डैशबोर्ड को किसी खास बिल्ड पर बेहतर तरीके से फ़ोकस करने में मदद मिलती है.

समस्या हल करना

अगर आपको Firebase कंसोल और Logcat में अलग-अलग स्टैक ट्रेस दिख रहे हैं, तो समस्या हल करने की गाइड देखें.



सिंबल अपलोड करने के दूसरे विकल्प

ऊपर दिए गए इस पेज पर मुख्य वर्कफ़्लो, स्टैंडर्ड Gradle बिल्ड के लिए लागू होता है. हालांकि, कुछ ऐप्लिकेशन किसी दूसरे कॉन्फ़िगरेशन या टूल का इस्तेमाल करते हैं. उदाहरण के लिए, Gradle के अलावा कोई अन्य बिल्ड प्रोसेस. ऐसे मामलों में, सिंबल को सही तरीके से अपलोड करने में इन विकल्पों से मदद मिल सकती है.

विकल्प: लाइब्रेरी मॉड्यूल और बाहरी डिपेंडेंसी के लिए सिंबल अपलोड करें

यह विकल्प इन स्थितियों में मददगार हो सकता है:

  • अगर आपने Gradle में, पसंद के मुताबिक एनडीके बनाने की प्रोसेस का इस्तेमाल किया है
  • अगर आपकी नेटिव लाइब्रेरी, लाइब्रेरी/फ़ीचर मॉड्यूल में बनाई गई हैं या तीसरे पक्ष की ओर से उपलब्ध कराई गई हैं
  • अगर अपने-आप सिंबल अपलोड करने वाला टास्क काम नहीं कर रहा है या आपको डैशबोर्ड में बिना सिम के बंद होने की समस्या दिख रही है

विकल्प: गैर-gradle बिल्ड या ऐसी नेटिव लाइब्रेरी के लिए सिंबल अपलोड करें जिन्हें ऐक्सेस नहीं किया जा सकता

यह विकल्प इन स्थितियों में मददगार हो सकता है:

  • अगर Gradle के अलावा, कोई अन्य बिल्ड प्रोसेस इस्तेमाल किया जा रहा है

  • अगर आपकी बिना ज़्यादा ट्रैफ़िक वाली नेटिव लाइब्रेरी, आपको इस तरह से उपलब्ध कराई गई हैं कि Gradle बिल्ड के दौरान उन्हें ऐक्सेस नहीं किया जा सकता