অ্যাপ ক্র্যাশ: এটি কী, বন্ধ হওয়ার কারণ এবং শনাক্ত করার পদ্ধতি

লেখক: IT Sectr প্রকাশিত: 2026-07-27 পড়ার সময়: 7 মিনিট

অ্যাপ ক্র্যাশ — একটি অস্বাভাবিক সমাপ্তি যেখানে প্রোগ্রাম সাড়া দেওয়া বন্ধ করে এবং বন্ধ হয়ে যায়। মোবাইল ডেভেলপমেন্টে, ক্র্যাশ নেতিবাচক পর্যালোচনা এবং রেটিং হ্রাসের প্রধান উৎস। Firebase (2024)-এর তথ্য অনুসারে, 53% ক্ষেত্রে ব্যবহারকারীরা এক বা দুইটি ক্র্যাশের পরে অ্যাপ মুছে ফেলেন। প্রতিটি ক্র্যাশ রিটেনশন 3–5% কমিয়ে দেয়। Crashlytics এবং Sentry-র মতো মনিটরিং সিস্টেম ব্যবহারকারীদের উপর ব্যাপক প্রভাব ফেলার আগে দ্রুত ক্র্যাশের কারণ খুঁজে বের করতে এবং ঠিক করতে সাহায্য করে।

মূল বিষয়

  • ক্র্যাশ — একটি অপ্রত্যাশিত রানটাইম ত্রুটির কারণে অ্যাপের অপ্রত্যাশিত সমাপ্তি
  • প্রধান কারণ — NullPointerException, OutOfMemoryError, IndexOutOfBounds, Android-এ ANR
  • Crashlytics — স্বয়ংক্রিয় স্ট্যাক ট্রেস সংগ্রহ এবং গ্রুপিংসহ ক্র্যাশ মনিটরিংয়ের মান
  • রানটাইম ব্যতিক্রম — ব্যতিক্রম যা কম্পাইলার পরীক্ষা করে না, এগুলো শুধুমাত্র রানটাইমে দেখা যায়
  • প্রতিরোধ কৌশল — কঠোর টাইপিং, অপশনাল বাইন্ডিং, ত্রুটি হ্যান্ডলিং এবং পরীক্ষণ

অ্যাপ ক্র্যাশ কী

ক্র্যাশ — প্রোগ্রামের একটি অপ্রত্যাশিত সমাপ্তি যা একটি ব্যতিক্রমী পরিস্থিতির কারণে ঘটে যা কোড হ্যান্ডেল করেনি। মোবাইল অপারেটিং সিস্টেমে, ক্র্যাশ তাৎক্ষণিকভাবে অ্যাপ বন্ধ করে এবং “অ্যাপ বন্ধ হয়েছে” স্ক্রিন দেখায় বা হোম স্ক্রিনে ফিরে আসে।

ক্র্যাশ দুটি বড় শ্রেণীতে বিভক্ত। হ্যান্ডেল করা ত্রুটি — try/catch ব্লক ব্যতিক্রম ধরে ফেলে, অ্যাপ কাজ করতে থাকে, সম্ভবত কিছু কার্যকারিতা হারিয়ে। অহ্যান্ডেলড ক্র্যাশ — ব্যতিক্রম OS স্তর পর্যন্ত উঠে যায় এবং সিস্টেম প্রক্রিয়াটি বন্ধ করে দেয়। দ্বিতীয় ধরনটি বিশেষভাবে বিপজ্জনক কারণ ব্যবহারকারী ডেটা সংরক্ষণ করতে পারেন না।

দুই মিলিয়ন ব্যবহারকারী এবং 0.1% ক্র্যাশ রেটযুক্ত একটি সিস্টেম প্রতিটি রিলিজে 2,000 ব্যবহারকারী হারায়। Google Play Console (2024) অনুসারে, 1.5% এর উপরে ক্র্যাশ রেটযুক্ত অ্যাপগুলি সুপারিশ থেকে বাদ দেওয়া হয় এবং 30% পর্যন্ত জৈব ট্র্যাফিক হারায়।

মোবাইল অ্যাপে ক্র্যাশের প্রধান কারণ

NullPointerException (NPE) — Java/Kotlin-এ ক্র্যাশের রাজা। একটি null অবজেক্টে মেথড কল করার প্রচেষ্টা। Kotlin-এ, null safety-র কারণে NPE কম সাধারণ, তবে !! অপারেটর ব্যবহার করলে বা Java কোডের সাথে ইন্টারঅ্যাক্ট করলে এটি এখনও সম্ভব। Google (2024) অনুমান করে যে NPE সমস্ত Android অ্যাপ ক্র্যাশের 25%।

IndexOutOfBoundsException — একটি অস্তিত্বহীন ইনডেক্সে তালিকার উপাদান অ্যাক্সেস করা। সাধারণ কারণ: ডেটা সার্ভার থেকে অপ্রত্যাশিত ফরম্যাটে আসে এবং UI এমন একটি অবস্থান প্রদর্শনের চেষ্টা করে যা বিদ্যমান নেই। সমাধান — ইনডেক্স দ্বারা অ্যাক্সেসের আগে সর্বদা কালেকশনের আকার পরীক্ষা করুন।

ANR (Application Not Responding) — একটি Android-নির্দিষ্ট সমস্যা। UI থ্রেড 5 সেকেন্ডের বেশি সময় ধরে ব্লক থাকে। প্রধান কারণ: মূল থ্রেডে নেটওয়ার্ক অনুরোধ, ভারী গণনা, ডেটাবেস সিঙ্ক্রোনাইজেশন। Android-এ StrictMode ডেভেলপমেন্টের সময় UI থ্রেড ব্লকিং সনাক্ত করতে সাহায্য করে।

OutOfMemoryError (OOM) — অ্যাপ মেমোরি সীমা অতিক্রম করেছে। 2–4 GB RAM-যুক্ত মোবাইল ডিভাইসে, বড় ইমেজ বা পেজিনেশন ছাড়া অসীম তালিকা নিয়ে কাজ করার সময় OOM একটি সাধারণ সমস্যা। সমাধান — ইমেজ লোড করার জন্য Glide/Coil, ক্যাশিংয়ের জন্য LruCache, RecyclerView-এ ViewHolder।

রানটাইম ব্যতিক্রম এবং মারাত্মক ত্রুটি

রানটাইম ব্যতিক্রম — ত্রুটি যা কম্পাইলার বিল্ড সময়ে পরীক্ষা করে না। এগুলো কেবল তখনই দেখা যায় যখন কোড একটি নির্দিষ্ট ডিভাইসে নির্দিষ্ট ডেটা নিয়ে চলে। Java-তে, এগুলি RuntimeException এবং এর উপশ্রেণী: NullPointerException, IllegalArgumentException, ArithmeticException।

মারাত্মক ত্রুটি (FATAL) — রানটাইম নয়, বরং সিস্টেম ব্যর্থতা। Signal 11 (SIGSEGV) — নেটিভ কোডে মেমোরি সেগমেন্টেশন লঙ্ঘন। Signal 6 (SIGABRT) — অ্যাপ নিজেই abort()-এর মাধ্যমে অস্বাভাবিক সমাপ্তি। এ ধরনের ক্র্যাশ নির্ণয় করা কঠিন কারণ স্ট্যাক ট্রেস প্রায়শই স্পষ্ট প্রসঙ্গ দেখায় না।

iOS-এ, প্রধান কারণগুলি হল NSInvalidArgumentException (প্যারামিটারে অপ্রত্যাশিত nil) এবং EXC_BAD_ACCESS (মুক্ত করা মেমোরিতে অ্যাক্সেস)। Swift Objective-C-র তুলনায় ক্র্যাশের সংখ্যা কমিয়েছে, কিন্তু ObjC রানটাইম এবং C লাইব্রেরিতে ত্রুটিগুলি এখনও ক্র্যাশ ঘটায়।

ক্র্যাশ মনিটরিং এবং লগ সংগ্রহ

Firebase Crashlytics — মোবাইল অ্যাপের জন্য মান। স্বয়ংক্রিয়ভাবে স্ট্যাক ট্রেস সংগ্রহ করে, লগ, ব্যবহারকারী ID এবং ডিভাইস মেটাডেটা যোগ করে। স্বাক্ষর (ত্রুটি শ্রেণী + লাইন) অনুসারে ক্র্যাশ গ্রুপ করে। রিয়েল-টাইম সতর্কতা — যখন ক্র্যাশ রেট নির্ধারিত সীমা অতিক্রম করে (যেমন, >0.1% প্রতি ঘণ্টা) তখন বিজ্ঞপ্তি।

Sentry — আরও নমনীয় ক্ষমতাসম্পন্ন একটি বিকল্প। কাস্টম কনটেক্সট তৈরি, ব্রেডক্রাম্ব (পূর্ববর্তী ঘটনা) যোগ, গুরুত্বহীন ত্রুটি বাদ দেওয়ার জন্য ইন-অ্যাপ ফিল্টারিং কনফিগার করার অনুমতি দেয়। Kotlin এবং Swift-এর জন্য সোর্স ম্যাপ অস্পষ্ট নামের পরিবর্তে সোর্স কোড দেখতে দেয়।

লগের জন্য সর্বোত্তম অভ্যাস: বিপজ্জনক অপারেশন করার আগে মূল মেটাডেটা পাঠান — এভাবে লগে দেখা যাবে ব্যবহারকারী ক্র্যাশের আগে কী করছিলেন। কাস্টম কী যোগ করুন (API সংস্করণ নম্বর, শেষ স্ক্রিন, ইনপুট ডেটার আকার)। এটি অকেজো স্ট্যাক ট্রেসকে কার্যকর তথ্যে রূপান্তরিত করে।

উদাহরণ: Android-এ Crashlytics সেট আপ করা

kotlin
class PaymentViewModel : ViewModel() {
    fun processPayment(amount: Double) {
        crashlytics.setCustomKey("last_screen", "payment")
        crashlytics.setCustomKey("amount", amount)
        try {
            api.charge(amount)
        } catch (e: Exception) {
            crashlytics.recordException(e)
        }
    }
}

ক্র্যাশ প্রতিরোধ কৌশল

অপশনাল বাইন্ডিং এবং null safety — Kotlin-এ nullable টাইপের জন্য `?` ব্যবহার করুন, null-এর নিরাপদ হ্যান্ডলিংয়ের জন্য `let` এবং `?:` ব্যবহার করুন। Swift-এ — optionals এবং guard let। আধুনিক Kotlin (2024) Contract অ্যানোটেশন যোগ করেছে: `@ContractsDsl` ঘোষণা করতে দেয় যে একটি ফাংশন null ফেরত দেয় না এবং কম্পাইলার এটি পরীক্ষা করে।

নেটওয়ার্কিং-এ ত্রুটি হ্যান্ডলিং — প্রতিটি নেটওয়ার্ক অনুরোধকে টাইমআউট, পার্সিং ত্রুটি এবং সার্ভার ব্যর্থতা হ্যান্ডেল করতে হবে। Result টাইপসহ Retrofit — একটি সিলড ক্লাস যা নিশ্চিত করে যে ত্রুটি হ্যান্ডেল করা হবে। No Exception শৈলী: try/catch-এর পরিবর্তে, স্পষ্ট সাফল্য এবং ত্রুটি হ্যান্ডলিংয়ের জন্য সিলড Result ব্যবহার করুন।

ফিচার ফ্ল্যাগ — নতুন সংস্করণ প্রকাশ না করেই সমস্যাযুক্ত কার্যকারিতা দূরবর্তীভাবে বন্ধ করুন। যদি একটি সার্ভার-সাইড অপারেশন পুরানো ডিভাইসে ক্র্যাশ ঘটায়, ফ্ল্যাগটি সেই গ্রুপের জন্য এটি বন্ধ করে দেয়। Firebase Remote Config স্টোরে প্রকাশ না করেই অ্যাপের আচরণ পরিবর্তন করতে দেয়।

ধীরে ধীরে রোলআউট — 5% ব্যবহারকারীর জন্য নতুন সংস্করণ প্রকাশ করুন এবং ক্র্যাশ রেট নিরীক্ষণ করুন। যদি রেট লক্ষ্যের নিচে থাকে (সাধারণত <0.1%), তাহলে 25%, তারপর 50%, তারপর 100% পর্যন্ত বিস্তৃত করুন। Google Play Console এবং App Store Connect সীমা অতিক্রম করলে স্বয়ংক্রিয় বন্ধের জন্য স্টেজড রোলআউট সমর্থন করে।

ত্রুটি শনাক্তকরণে কর্ম পরিকল্পনা

ধাপ 1: শ্রেণীবিভাগ — তীব্রতা নির্ধারণ করুন: ক্রিটিক্যাল (>1% ব্যবহারকারীতে ক্র্যাশ), উচ্চ (0.1–1%), মধ্যম (<0.1%)। ক্রিটিক্যাল ক্র্যাশের জন্য — তাৎক্ষণিক প্রতিক্রিয়া। অন্যগুলির জন্য — বর্তমান স্প্রিন্টে মানক বাগফিক্স প্রক্রিয়া। Google Play Console প্রভাবিত ব্যবহারকারীর সংখ্যা অনুসারে স্বয়ংক্রিয়ভাবে ক্র্যাশ শ্রেণীবদ্ধ করে।

ধাপ 2: স্ট্যাক ট্রেস বিশ্লেষণ — Crashlytics-এ লগ খুলুন, ক্র্যাশের সঠিক অবস্থান দেখুন। কাস্টম কী পরীক্ষা করুন: কোন স্ক্রিন, কী ডেটা, OS সংস্করণ। সর্বশেষ ডিপ্লয়মেন্টের সাথে সম্পর্কযুক্ত করুন — প্রায়শই ক্র্যাশ কোডে সাম্প্রতিক পরিবর্তনের কারণে ঘটে যা একটি অপ্রত্যাশিত ব্যবহার পরিস্থিতিকে প্রভাবিত করেছে।

ধাপ 3: পুনরুৎপাদন — অনুরূপ প্যারামিটারযুক্ত ডিভাইস বা এমুলেটরে ক্র্যাশ পুনরুৎপাদনের চেষ্টা করুন। যদি সফল না হন, তাহলে প্যাটার্নের জন্য ক্র্যাশ লগ পরীক্ষা করুন: নির্দিষ্ট মডেল (Samsung A10), Android সংস্করণ (API < 26), লোকেল। সমাধান — একটি প্রতিরক্ষামূলক শর্ত যোগ করুন যা পরিস্থিতি কভার করে।

ধাপ 4: ফিক্স এবং মনিটরিং — অগ্রাধিকারসহ হটফিক্স প্রকাশ করুন। রিলিজের পরে, নিশ্চিত করুন যে এই ধরনের ক্র্যাশ রেট শূন্যে নেমে গেছে। একটি রিগ্রেশন টেস্ট লিখুন যা ক্র্যাশ পরিস্থিতি কভার করে। পরীক্ষা ছাড়া, একই বাগ পরবর্তী রিফ্যাক্টরিংয়ে ফিরে আসতে পারে।

সচরাচর জিজ্ঞাসিত প্রশ্ন

কতটুকু ক্র্যাশ রেট স্বাভাবিক বলে বিবেচিত হয়?

স্বাভাবিক ক্র্যাশ রেট — প্রোডাকশন রিলিজের জন্য 0.1% এর নিচে। Google Play ক্র্যাশ রেট 1.5% এর নিচে রাখার সুপারিশ করে, তবে শীর্ষ অ্যাপ (YouTube, Instagram) 0.01–0.05% রাখে। নতুন কার্যকারিতাসহ রিলিজের জন্য, হটফিক্সের পরে হ্রাসসহ 0.5% পর্যন্ত অস্থায়ী বৃদ্ধি গ্রহণযোগ্য।

ক্র্যাশ কীভাবে ANR থেকে আলাদা?

ক্র্যাশ — অ্যাপ অস্বাভাবিকভাবে বন্ধ হয়ে যায়। ANR (Application Not Responding) — অ্যাপ 5 সেকেন্ডের বেশি জমে থাকে তবে জোর করে বন্ধ হয় না। ব্যবহারকারী “অ্যাপ সাড়া দিচ্ছে না” ডায়ালগ দেখতে পান এবং অপেক্ষা বা বন্ধ করতে পারেন। ANR সমস্যাগুলি ক্র্যাশের চেয়ে কম গুরুতর নয় এবং স্টোর রেটিংকেও প্রভাবিত করে।

কেন একটি ক্র্যাশ সব ডিভাইসে ঘটতে পারে না?

বিভিন্ন ডিভাইসে বিভিন্ন OS সংস্করণ, মেমোরির আকার, লাইব্রেরি সংস্করণ এবং এমনকি প্রসেসরও থাকে। উদাহরণ: রানটাইম অনুমতির অভাবের কারণে Android 6 (API 23)-এ ক্র্যাশ Android 12-এ নাও হতে পারে। ফিল্টার অনুসারে ক্র্যাশ লগ বিশ্লেষণ করুন: OS সংস্করণ, ডিভাইস মডেল, RAM-এর পরিমাণ। এটি সমস্যার বিশেষত্ব নির্দেশ করবে।

স্ট্যাক ট্রেস তথ্যপূর্ণ না হলে কীভাবে ক্র্যাশের কারণ খুঁজে পাব?

Crashlytics-এ কাস্টম ব্রেডক্রাম্ব যোগ করুন: অপারেশন করার আগে মূল ঘটনা রেকর্ড করুন। যদি ক্র্যাশ অনবোর্ডিংয়ের ধাপ 3-এ ঘটে, তবে এটি একটি নির্দিষ্ট স্ক্রিনে সমস্যা নির্দেশ করে। ডিবাগ সিম্বল (dSYM, ProGuard mapping) — অস্পষ্ট নামের পরিবর্তে প্রকৃত ফাংশনের নাম দেখতে সেগুলি সর্বদা Crashlytics-এ আপলোড করুন।

অ-মারাত্মক ত্রুটির জন্য কি অ্যাপ ক্র্যাশ করা উচিত?

প্রোডাকশনে — কখনই নয়। অহ্যান্ডেলড ক্র্যাশ ব্যবহারকারীর অভিজ্ঞতা খারাপ করে। ত্রুটি লগিংসহ try/catch ব্যবহার করুন। ডিবাগ মোডে, ডেভেলপারকে দ্রুত প্রতিক্রিয়া জানাতে ক্র্যাশ করা গ্রহণযোগ্য। Assertions — সেই ইনভেরিয়েন্ট পরীক্ষার জন্য যা কখনও লঙ্ঘন করা উচিত নয়, তবে শুধুমাত্র ডিবাগ বিল্ডে।

সারসংক্ষেপ

  • ক্র্যাশ — অ্যাপের অস্বাভাবিক সমাপ্তি যা ব্যবহারকারী হ্রাস এবং স্টোর রেটিং কমিয়ে দেয়
  • NullPointerException — মোবাইল অ্যাপে ক্র্যাশের সবচেয়ে সাধারণ কারণ (সব ক্র্যাশের 25%)
  • ANR এবং OOM — গুরুতর Android-নির্দিষ্ট সমস্যা যা পৃথক মনিটরিং এবং প্রতিরোধের প্রয়োজন
  • Crashlytics এবং Sentry — গ্রুপিং এবং রিয়েল-টাইম সতর্কতাসহ স্ট্যাক ট্রেস সংগ্রহের প্রধান সরঞ্জাম
  • ত্রুটি হ্যান্ডলিং — অপশনাল বাইন্ডিং, সিলড Result টাইপ এবং প্রতিরক্ষামূলক পরীক্ষা বেশিরভাগ ক্র্যাশ প্রতিরোধ করে
  • ফিচার ফ্ল্যাগ এবং ধীরে ধীরে রোলআউট — দর্শকদের উপর বাগের প্রভাব কমায়, সমস্যাযুক্ত কোড ফিরিয়ে নেওয়ার অনুমতি দেয়
  • ক্র্যাশ ঠিক করার পরে — সমস্যার পুনরাবৃত্তি রোধ করতে রিগ্রেশন টেস্ট বাধ্যতামূলক

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন