Catch up on highlights from Firebase at Google I/O 2023. Learn more

Android NDK क्रैश रिपोर्ट प्राप्त करें

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

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

यदि आप अपनी यूनिटी परियोजनाओं में Crashlytics के साथ शुरुआत करने का तरीका ढूंढ रहे हैं, तो यूनिटी गेटिंग स्टार्टेड गाइड देखें।

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

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

  2. अनुशंसित : क्रैश-मुक्त उपयोगकर्ता, ब्रेडक्रंब लॉग और वेलोसिटी अलर्ट जैसी सुविधाएं प्राप्त करने के लिए, आपको अपने फायरबेस प्रोजेक्ट में Google Analytics को सक्षम करना होगा।

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

    • यदि आप एक नया फायरबेस प्रोजेक्ट बना रहे हैं, तो प्रोजेक्ट निर्माण कार्यप्रवाह के दौरान Google Analytics को सक्षम करें।

चरण 1 : NDK के लिए Crashlytics SDK को अपने ऐप में जोड़ें

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

Crashlytics के साथ बेहतरीन अनुभव के लिए, हम आपके Firebase प्रोजेक्ट में Google Analytics को सक्षम करने और Google Analytics के लिए Firebase SDK को अपने ऐप में जोड़ने की सलाह देते हैं।

Kotlin+KTX

dependencies {
    // Import the BoM for the Firebase platform
    implementation platform('com.google.firebase:firebase-bom:32.1.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 पुस्तकालयों के संगत संस्करणों का उपयोग करेगा।

(वैकल्पिक) BoM का उपयोग किए बिना Firebase लाइब्रेरी निर्भरताएँ जोड़ें

यदि आप Firebase BoM का उपयोग नहीं करना चुनते हैं, तो आपको प्रत्येक Firebase लाइब्रेरी संस्करण को उसकी निर्भरता रेखा में निर्दिष्ट करना होगा।

ध्यान दें कि यदि आप अपने ऐप में एकाधिक फायरबेस लाइब्रेरी का उपयोग करते हैं, तो हम लाइब्रेरी संस्करणों को प्रबंधित करने के लिए बीओएम का उपयोग करने की दृढ़ता से अनुशंसा करते हैं, जो सुनिश्चित करता है कि सभी संस्करण संगत हैं।

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.7'
    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.1.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 लाइब्रेरी संस्करण को उसकी निर्भरता रेखा में निर्दिष्ट करना होगा।

ध्यान दें कि यदि आप अपने ऐप में एकाधिक फायरबेस लाइब्रेरी का उपयोग करते हैं, तो हम लाइब्रेरी संस्करणों को प्रबंधित करने के लिए बीओएम का उपयोग करने की दृढ़ता से अनुशंसा करते हैं, जो सुनिश्चित करता है कि सभी संस्करण संगत हैं।

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

चरण 2 : Crashlytics Gradle प्लगइन को अपने ऐप में जोड़ें

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

    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.5'
        }
    }
  2. अपने मॉड्यूल (ऐप-लेवल) ग्रैडल फ़ाइल में (आमतौर पर <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 एक्सटेंशन जोड़ें

अपने मॉड्यूल (ऐप-लेवल) ग्रैडल फ़ाइल (आमतौर पर 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 कार्य शामिल है।

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

  2. आपके स्टैक ट्रेस में विधि के नाम दिखाई देने के लिए, आपको अपनी NDK लाइब्रेरी के प्रत्येक निर्माण के बाद uploadCrashlyticsSymbolFile BUILD_VARIANT कार्य को स्पष्ट रूप से शुरू करना होगा। उदाहरण के लिए:

    >./gradlew app:assembleBUILD_VARIANT\
               app:uploadCrashlyticsSymbolFileBUILD_VARIANT
    
  3. NDK के लिए Crashlytics SDK और Crashlytics Gradle प्लगइन दोनों मूल साझा वस्तुओं के भीतर GNU बिल्ड आईडी की उपस्थिति पर निर्भर करते हैं।

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

चरण 5 : सेटअप समाप्त करने के लिए परीक्षण क्रैश को बाध्य करें

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. आपके ऐप के क्रैश होने के बाद, इसे फिर से शुरू करें ताकि आपका ऐप फायरबेस को क्रैश रिपोर्ट भेज सके।

  4. अपना परीक्षण क्रैश देखने के लिए Firebase कंसोल के Crashlytics डैशबोर्ड पर जाएं.

    यदि आपने कंसोल को रीफ़्रेश किया है और आपको पाँच मिनट के बाद भी परीक्षण क्रैश दिखाई नहीं दे रहा है, तो यह देखने के लिए डीबग लॉगिंग सक्षम करें कि आपका ऐप क्रैश रिपोर्ट भेज रहा है या नहीं।


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

अगले कदम

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

  • ऑप्ट-इन रिपोर्टिंग, लॉग, कुंजियाँ और गैर-घातक त्रुटियों की ट्रैकिंग जोड़कर अपने क्रैश रिपोर्ट सेटअप को अनुकूलित करें

  • Google Play के साथ एकीकृत करें ताकि आप सीधे Crashlytics डैशबोर्ड में Google Play ट्रैक द्वारा अपने Android ऐप की क्रैश रिपोर्ट को फ़िल्टर कर सकें। यह आपको विशिष्ट बिल्ड पर अपने डैशबोर्ड को बेहतर ढंग से केंद्रित करने की अनुमति देता है।

समस्या निवारण

यदि आप फायरबेस कंसोल और लॉगकैट में अलग-अलग स्टैक ट्रेस देख रहे हैं, तो समस्या निवारण मार्गदर्शिका देखें।



प्रतीकों को अपलोड करने के लिए वैकल्पिक विकल्प

उपरोक्त इस पृष्ठ पर मुख्य कार्यप्रवाह मानक ग्रैडल बिल्ड के लिए लागू है। हालाँकि, कुछ ऐप एक अलग कॉन्फ़िगरेशन या टूलिंग का उपयोग करते हैं (उदाहरण के लिए ग्रैडल के अलावा एक बिल्ड प्रक्रिया)। इन स्थितियों में, निम्नलिखित विकल्प प्रतीकों को सफलतापूर्वक अपलोड करने में सहायक हो सकते हैं।

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

यह विकल्प निम्नलिखित स्थितियों में सहायक हो सकता है:

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

विकल्प : नॉन-ग्रेडल बिल्ड या दुर्गम अनस्ट्रिप्ड नेटिव लाइब्रेरी के लिए सिंबल अपलोड करें

यह विकल्प निम्नलिखित स्थितियों में सहायक हो सकता है:

  • यदि आप ग्रैडल के अलावा किसी अन्य निर्माण प्रक्रिया का उपयोग करते हैं

  • यदि आपके अनस्ट्रिप्ड देशी पुस्तकालय आपको किसी तरह से प्रदान किए जाते हैं, तो वे ग्रैडल बिल्ड के दौरान पहुंच योग्य नहीं होते हैं