Android NDK-এর জন্য Crashlytics ব্যবহার শুরু করা

প্ল্যাটফর্ম বেছে নিন: iOS+ Android Android NDK Flutter Unity


আপনার Android অ্যাপে নেটিভ লাইব্রেরি ব্যবহার করলে, আপনার অ্যাপের বিল্ড কনফিগারেশনে কয়েকটি ছোটখাটো আপডেট করে Firebase Crashlytics থেকে আপনার নেটিভ কোডের জন্য সম্পূর্ণ স্ট্যাক ট্রেস এবং ক্র্যাশ রিপোর্টের বিবরণ চালু করতে পারবেন।

এই নির্দেশিকায়, NDK-এর জন্য Firebase Crashlytics SDK-এর মাধ্যমে ক্র্যাশ রিপোর্টিং কীভাবে কনফিগার করতে হয় তা বর্ণনা করা হয়েছে।

আপনার Unity প্রোজেক্টে কীভাবে Crashlytics ব্যবহার শুরু করবেন তা জানতে চাইলে, Unity ব্যবহার শুরু করার নির্দেশিকা দেখুন।

শুরু করার আগে

  1. আপনি আগে থেকে না করে থাকলে, আপনার Android প্রোজেক্টে Firebase যোগ করুন। আপনার কাছে Android অ্যাপ না থাকলে, আপনি একটি স্যাম্পেল অ্যাপ ডাউনলোড করতে পারেন।

  2. সাজেস্ট করা: ক্র্যাশ, নন-ফেটাল বা ANR ইভেন্টের আগে ব্যবহারকারীর অ্যাকশন বুঝতে অটোমেটিক ব্রেডক্রাম্ব লগ পেতে, আপনার Firebase প্রোজেক্টে Google Analytics চালু করতে হবে।

    • আপনি নতুন Firebase প্রোজেক্ট তৈরি করলে, প্রোজেক্ট তৈরির ওয়ার্কফ্লো চলাকালীন Google Analytics চালু করুন।

    • আপনি যদি আগে থেকে থাকা এমন কোনও Firebase প্রোজেক্ট ব্যবহার করেন যেখানে Google Analytics চালু করা নেই, তাহলে আপনি Firebase কনসোলের সেটিংস > ইন্টিগ্রেশন পৃষ্ঠা থেকে এটি চালু করতে পারবেন।

  3. আপনার অ্যাপে নিম্নলিখিত ন্যূনতম প্রয়োজনীয় ভার্সন আছে কিনা তা নিশ্চিত করুন:

    • Gradle 8.0
    • Android Gradle প্লাগ-ইন 8.1.0
    • Google পরিষেবা Gradle প্লাগ-ইন 4.4.1

ধাপ ১: আপনার অ্যাপে NDK-এর জন্য Crashlytics SDK যোগ করুন

আপনার মডিউল (অ্যাপ-লেভেল) Gradle ফাইল (সাধারণত <project>/<app-module>/build.gradle.kts বা <project>/<app-module>/build.gradle), Android-এর জন্য Crashlytics NDK লাইব্রেরির ডিপেন্ডেন্সি যোগ করুন। লাইব্রেরি ভার্সনিং নিয়ন্ত্রণ করতে আমরা 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:35.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 লাইব্রেরি ভার্সন এর ডিপেন্ডেন্সি লাইনে উল্লেখ করতে হবে।

মনে রাখবেন, আপনার অ্যাপে একাধিক 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:21.0.1")
    implementation("com.google.firebase:firebase-analytics:24.0.0")
}

ধাপ ২: আপনার অ্যাপে 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.5.0" apply false
    
        // Add the dependency for the Crashlytics Gradle plugin
        id("com.google.firebase.crashlytics") version "3.0.8" 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.5.0' apply false
    
        // Add the dependency for the Crashlytics Gradle plugin
        id 'com.google.firebase.crashlytics' version '3.0.8' 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
          }
      }
  }
}

ধাপ ৪: নেটিভ সিম্বল অটোমেটিক আপলোড করার সুবিধা সেট-আপ করা

NDK ক্র্যাশ থেকে পাঠযোগ্য স্ট্যাক ট্রেস তৈরি করতে, Crashlytics-কে আপনার নেটিভ বাইনারিতে চিহ্ন সম্পর্কে জানতে হবে। এই প্রসেস অটোমেট করতে Crashlytics Gradle প্লাগ-ইনে uploadCrashlyticsSymbolFileBUILD_VARIANT টাস্ক অন্তর্ভুক্ত থাকে।

  1. অটোমেটিক সিম্বল আপলোড করার জন্য যাতে আপনি টাস্ক অ্যাক্সেস করতে পারেন, তাই নিশ্চিত করুন যে আপনার মডিউল (অ্যাপ-লেভেল) Gradle ফাইলে nativeSymbolUploadEnabled-কে true-এ সেট করা আছে।

  2. আপনার স্ট্যাক ট্রেসে মেথডের নাম দেখানোর জন্য, আপনার NDK লাইব্রেরির প্রতিটি বিল্ডের পরে আপনাকে অবশ্যই uploadCrashlyticsSymbolFileBUILD_VARIANT টাস্ক এক্সপ্লিসিটলি ইনভোক করতে হবে। যেমন:

    >./gradlew app:assembleBUILD_VARIANT\
               app:uploadCrashlyticsSymbolFileBUILD_VARIANT
  3. NDK-এর জন্য Crashlytics SDK এবং Crashlytics Gradle প্লাগ-ইন, দুটিই নেটিভ শেয়ার করা অবজেক্টের মধ্যে GNU বিল্ড আইডির উপস্থিতির উপর নির্ভর করে।

    আপনি প্রতিটি বাইনারিতে readelf -n রান করে এই আইডির উপস্থিতি যাচাই করতে পারেন। বিল্ড আইডি না থাকলে, সমস্যার সমাধান করতে আপনার বিল্ড সিস্টেমের ফ্ল্যাগে -Wl,--build-id যোগ করুন।

ধাপ ৫: সেট-আপ সম্পূর্ণ করতে টেস্ট ক্র্যাশ জোর করে বন্ধ করুন

Crashlytics সেট-আপ করা সম্পূর্ণ করতে এবং Firebase কনসোলের Crashlytics ড্যাশবোর্ডে প্রাথমিক ডেটা দেখতে, আপনাকে একটি টেস্ট ক্র্যাশ ফোর্স করতে হবে।

  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. Firebase কনসোলে, DevOps ও এনগেজমেন্ট > Crashlytics ড্যাশবোর্ডে গিয়ে আপনার টেস্ট ক্র্যাশ রিপোর্ট চেক করুন।

    আপনি কনসোল রিফ্রেশ করার পরেও পাঁচ মিনিট পরে টেস্ট ক্র্যাশ দেখতে না পেলে, আপনার অ্যাপ ক্র্যাশ রিপোর্ট পাঠাচ্ছে কিনা তা দেখতে ডিবাগ লগিং চালু করুন।


আর এইটুকুই! Crashlytics এখন আপনার অ্যাপ ক্র্যাশ করছে কিনা তা মনিটর করছে এবং আপনি Crashlytics ড্যাশবোর্ডে ক্র্যাশ রিপোর্ট ও পরিসংখ্যান দেখতে ও তদন্ত করতে পারবেন।

পরবর্তী ধাপ

  • (সাজেস্ট করা) GWP-ASan রিপোর্ট সংগ্রহ করে নেটিভ মেমরি সংক্রান্ত সমস্যার কারণে হওয়া ক্র্যাশ ডিবাগ করার ব্যাপারে সহায়তা পান। মেমরি-সম্পর্কিত এইসব সমস্যা আপনার অ্যাপের মধ্যে মেমরি করাপ্ট হওয়ার সাথে সম্পর্কিত হতে পারে, যা অ্যাপের নিরাপত্তা সংক্রান্ত দুর্বলতার প্রধান কারণ। এই ডিবাগিং ফিচারের সুবিধা নিতে, আপনার অ্যাপে GWP-ASan স্পষ্টভাবে চালু করা আছে এবং NDK-এর জন্য লেটেস্ট Crashlytics SDK (v18.3.6+ বা Firebase BoM v31.3.0+) ব্যবহার করে কিনা তা নিশ্চিত করুন।

  • অপ্ট-ইন রিপোর্টিং, লগ, কী এবং মারাত্মক নয় এমন সমস্যার ট্র্যাকিং যোগ করে আপনার ক্র্যাশ রিপোর্টের সেট-আপ কাস্টমাইজ করুন।

  • Google Play-এর সাথে ইন্টিগ্রেট করুন যাতে আপনি Google Play ট্র্যাকের মাধ্যমে আপনার Android অ্যাপের ক্র্যাশ রিপোর্ট ফিল্টার করতে পারেন, সরাসরি Crashlytics ড্যাশবোর্ডে। এটি আপনাকে নির্দিষ্ট বিল্ডে আপনার ড্যাশবোর্ডকে আরও ভালোভাবে ফোকাস করতে দেয়।

সমস্যার সমাধান

আপনি যদি Firebase কনসোল এবং logcat-এ বিভিন্ন স্ট্যাক ট্রেস দেখতে পান, তাহলে সমস্যার সমাধান সংক্রান্ত নির্দেশিকা দেখুন।



প্রতীক আপলোড করার বিকল্প

এই পৃষ্ঠার উপরে দেখানো মূল ওয়ার্কফ্লো স্ট্যান্ডার্ড Gradle বিল্ডের ক্ষেত্রে প্রযোজ্য। তবে, কিছু অ্যাপ অন্য কনফিগারেশন বা টুলিং ব্যবহার করে (যেমন, Gradle ছাড়া অন্য কোনও বিল্ড প্রসেস)। এইসব পরিস্থিতিতে, নিম্নলিখিত বিকল্পগুলি প্রতীক আপলোড করার ক্ষেত্রে সহায়ক হতে পারে।

বিকল্প: লাইব্রেরি মডিউল ও এক্সটার্নাল ডিপেন্ডেন্সির জন্য সিম্বল আপলোড করুন

এই বিকল্পটি নিম্নলিখিত পরিস্থিতিতে সহায়ক হতে পারে:

  • আপনি যদি Gradle-এর মধ্যে কাস্টমাইজ করা NDK বিল্ড প্রসেস ব্যবহার করেন
  • আপনার নেটিভ লাইব্রেরি যদি কোনও লাইব্রেরি/ফিচার মডিউলে তৈরি করা হয় অথবা কোনও থার্ড-পার্টি প্রদান করে
  • অটোমেটিক সিম্বল আপলোড করার টাস্ক ব্যর্থ হলে অথবা Crashlytics ড্যাশবোর্ডে সিম্বল ছাড়া ক্র্যাশ দেখতে পেলে

বিকল্প: Gradle-এর মাধ্যমে তৈরি করা হয়নি এমন অ্যাপ বা অ্যাক্সেস করা যায় না এমন আনস্ট্রিপড নেটিভ লাইব্রেরির জন্য সিম্বল আপলোড করা

এই বিকল্পটি নিম্নলিখিত পরিস্থিতিতে সহায়ক হতে পারে:

  • আপনি যদি Gradle ছাড়া অন্য কোনও বিল্ড প্রসেস ব্যবহার করেন

  • আপনার আনস্ট্রিপড নেটিভ লাইব্রেরি যদি এমনভাবে আপনাকে প্রদান করা হয় যে Gradle বিল্ডের সময় সেগুলি অ্যাক্সেস করা যায় না