خطاهای رایج در طراحی اپلیکیشن اندروید و راهکار هایی برای رفع آنها
11 دقیقه
توسعه یک اپلیکیشن اندروید حرفهای فقط به طراحی رابط کاربری و پیادهسازی قابلیتها محدود نمیشود. حتی در پروژههایی که از معماری مناسب، Kotlin و کتابخانههای مدرن Android استفاده میکنند، ممکن است خطاهای زمان اجرا، خطاهای Build، مشکلات مربوط به منابع، دسترسیها، شبکه یا مدیریت حافظه ایجاد شود.
نکته مهم این است که بسیاری از خطاهای اندروید در نگاه اول پیچیده به نظر میرسند، اما اگر Logcat، Stack Trace و پیام دقیق خطا بهدرستی بررسی شوند، معمولاً میتوان علت اصلی را سریعتر پیدا کرد. امروزه نیز با توجه به استفاده گسترده از Kotlin، AndroidX، Jetpack و ابزارهایی مانند Jetpack Compose، بخشی از خطاهای قدیمی جای خود را به مشکلات جدیدتری دادهاند. در این مقاله مهمترین خطاهای رایج در طراحی اپلیکیشن اندروید را بررسی میکنیم و برای هرکدام، علاوه بر علت، راهکار عملی رفع مشکل را توضیح میدهیم.
1. خطای ActivityNotFoundException
ActivityNotFoundException یکی از خطاهای شناختهشده اندروید است که زمانی رخ میدهد که برنامه بخواهد یک Activity را از طریق Intent اجرا کند، اما سیستم نتواند Activity مناسب را برای اجرای آن Intent پیدا کند. مستندات رسمی Android نیز این خطا را به شکست startActivity() یا یکی از نسخههای آن در پیدا کردن Activity مرتبط میداند.
مهمترین دلایل بروز خطا
- Activity در AndroidManifest.xml تعریف نشده است.
- نام کلاس Activity اشتباه وارد شده است.
- Intent به Activity یا Component اشتباهی اشاره میکند.
- در پروژههای چندماژوله، Activity در ماژول یا Variant مورد انتظار در دسترس نیست.
- Intent-filter بهدرستی تعریف نشده است.
- در نسخههای جدید اندروید، تنظیمات Manifest با ساختار مورد نیاز پروژه هماهنگ نیست.
راهکار رفع ActivityNotFoundException
ابتدا Stack Trace را بررسی کنید و ببینید کدام Activity توسط Intent فراخوانی شده است. سپس AndroidManifest.xml را بررسی کنید و از صحیح بودن نام کامل کلاس مطمئن شوید. همچنین اگر Activity دارای intent-filter است، تنظیمات آن را بررسی کنید. در پروژههای جدید، بهخصوص هنگام استفاده از Deep Link و App Link، اشتباه در تعریف Intent Filter میتواند باعث بروز رفتارهای غیرمنتظره شود.
نکته کاربردی: بهجای حدس زدن، Intent را دقیق بررسی کنید و در صورت نیاز از resolveActivity() برای بررسی وجود Handler مناسب قبل از اجرای Intent استفاده کنید.
2. خطای ClassCastException
خطای ClassCastException زمانی رخ میدهد که برنامه بخواهد یک شیء را به نوعی تبدیل کند که واقعاً قابل تبدیل به آن نوع نیست. این خطا در پروژههای Java و Kotlin ممکن است در موقعیتهای مختلفی رخ دهد؛ برای مثال هنگام تبدیل اشتباه Viewها، دادههای دریافتی از API، آبجکتهای مدل یا استفاده نادرست از Genericها.
یک اشتباه رایج
فرض کنید یک View در واقع از نوع TextView نیست، اما برنامه آن را به شکل زیر Cast کند:
TextView title = (TextView) view;
اگر view از نوع دیگری باشد، برنامه با ClassCastException متوقف میشود.
راهکار رفع ClassCastException
- Stack Trace را بررسی کنید.
- نوع واقعی Object را پیدا کنید.
- Cast را با نوع صحیح انجام دهید.
- در صورت امکان از ساختارهای type-safe استفاده کنید.
- در Kotlin تا جای ممکن از قابلیتهای type checking و smart cast استفاده کنید.
نکته مهم: استفاده افراطی از Cast معمولاً نشانهای از طراحی نامناسب داده یا View hierarchy است. بهتر است بهجای پنهان کردن مشکل، علت اصلی Type mismatch را پیدا کنید.

3. خطاهای مربوط به Build و تبدیل DEX
خطاهایی مانند:
- DexArchiveMergerException
- DexIndexOverflowException
- Too many references
- Method ID not in [0, 0xffff]
- Conversion to Dalvik format failed
اغلب به محدودیت تعداد Referenceهای یک فایل DEX یا مشکلات وابستگیهای پروژه مربوط هستند. یکی از معروفترین موارد، محدودیت 64K است. یک فایل DEX نمیتواند بیش از 65,536 متد را Reference کند؛ در پروژههایی که تعداد کتابخانهها و Dependencyها زیاد است، این محدودیت ممکن است ایجاد شود. مستندات فعلی Android نیز این محدودیت را توضیح داده و استفاده از Multidex را برای شرایط لازم پیشنهاد میکند.
راهکار رفع خطاهای DEX
قبل از فعال کردن Multidex، بهتر است ابتدا Dependencyهای غیرضروری را حذف کنید. راهکارهای پیشنهادی:
- حذف کتابخانههای بلااستفاده
- بررسی Dependencyهای تکراری
- استفاده از نسخههای مناسب و بهروز کتابخانهها
- فعال کردن R8 و Minification در Buildهای Release
- فعال کردن Multidex در پروژههایی که واقعاً از محدودیت 64K عبور کردهاند
نکته مهم: عبارت «بیشتر از 65,535 ارجاع» را نباید با تعداد کلاسها یا فایلهای پروژه اشتباه گرفت؛ این محدودیت مربوط به Referenceهای موجود در یک DEX است.
4. خطای INSTALL_FAILED_INSUFFICIENT_STORAGE
این خطا زمانی نمایش داده میشود که فضای کافی برای نصب یا بهروزرسانی اپلیکیشن روی دستگاه یا Emulator وجود نداشته باشد.
دلایل احتمالی
- کمبود فضای ذخیرهسازی دستگاه
- باقی ماندن نسخههای قبلی اپلیکیشن
- بزرگ بودن APK یا App Bundle و فایلهای مورد نیاز نصب
- پر شدن فضای Emulator
- وجود فایلهای Cache و دادههای موقت
- راهکار رفع مشکل
در گوشی واقعی:
- فایلها و اپلیکیشنهای غیرضروری را حذف کنید.
- فضای آزاد دستگاه را بررسی کنید.
- نسخه قبلی اپلیکیشن را در صورت نیاز Uninstall کنید.
در Emulator:
- فضای ذخیرهسازی AVD را بررسی کنید.
- در صورت نیاز Emulator را Wipe Data کنید.
- در صورت قدیمی یا خراب بودن AVD، یک Virtual Device جدید ایجاد کنید.
نکته کاربردی: در پروژههای بزرگ، علاوه بر فضای دستگاه، حجم Dependencyها و Assetهای اپلیکیشن را نیز بررسی کنید.
5. خطای NullPointerException
NullPointerException زمانی رخ میدهد که برنامه بخواهد از مقدار null در جایی استفاده کند که وجود یک Object مورد انتظار است؛ برای مثال فراخوانی متد یا دسترسی به فیلد یک Object که مقدار آن null است.
این خطا در Java بسیار رایج است، اما Kotlin با داشتن سیستم Null Safety تلاش میکند بخش قابل توجهی از این مشکلات را پیش از اجرای برنامه شناسایی کند. در Kotlin، متغیرها بهصورت پیشفرض Nullable نیستند و برای امکان پذیرش null باید نوع آنها بهصورت Nullable تعریف شود.
راهکارهای جلوگیری از NullPointerException در Kotlin
بهجای استفاده بیدلیل از:
value!!.length
تا جای ممکن از Safe Call استفاده کنید:
value?.length
یا در صورت نیاز از Elvis Operator استفاده کنید:
val length = value?.length ?: 0
استفاده از !! باید با احتیاط انجام شود، زیرا اگر مقدار واقعاً null باشد، همچنان امکان ایجاد NullPointerException وجود دارد.
6. خطای Cannot resolve symbol R
خطاهایی مانند:
Cannot resolve symbol R
یا:
R.layout.main cannot be found
اغلب نشان میدهند که Android Studio نتوانسته کلاس R یا یکی از Resourceهای پروژه را بهدرستی Generate کند.
دلایل رایج
- وجود خطا در یکی از فایلهای XML
- نامگذاری نادرست Resourceها
- استفاده از کاراکترهای غیرمجاز در نام Resource
- مشکل در Build
- Import اشتباه کلاس R
- ناسازگاری Dependencyها
- مشکل در Gradle Sync
روش پیشنهادی رفع خطا
ابتدا بخش Build Output را بررسی کنید و دنبال اولین خطای واقعی بگردید. خطای R گاهی فقط پیامد یک خطای دیگر در Resourceهاست.
سپس:
- XMLها را بررسی کنید.
- Resourceهای جدید را از نظر نامگذاری بررسی کنید.
- Import اشتباه R را حذف کنید.
- Gradle Sync را اجرا کنید.
- در صورت نیاز پروژه را Clean و Rebuild کنید.
نکته: در پروژههای مدرن Android بهتر است بهجای تمرکز صرف روی R، اولین خطای واقعی Build را پیدا کنید؛ چون ممکن است مشکل اصلی چند خط بالاتر گزارش شده باشد.
7. خطای OutOfMemoryError
OutOfMemoryError زمانی رخ میدهد که برنامه نتواند حافظه مورد نیاز خود را تأمین کند. یکی از رایجترین دلایل آن در اپلیکیشنهای موبایلی، مدیریت نامناسب تصاویر و Bitmapهای بزرگ است؛ اما Memory Leak، نگه داشتن Referenceهای غیرضروری و بارگذاری همزمان دادههای حجیم نیز میتوانند در بروز این مشکل نقش داشته باشند.
راهکارهای عملی
- اندازه تصاویر را متناسب با ابعاد واقعی نمایش کاهش دهید.
- از فرمتها و منابع تصویری بهینه استفاده کنید.
- تصاویر بزرگ را مستقیماً در حافظه بارگذاری نکنید.
- از کتابخانههای استاندارد Image Loading استفاده کنید.
- Memory Leak را با ابزارهای پروفایلینگ Android Studio بررسی کنید.
- Objectهایی که دیگر مورد نیاز نیستند را بیدلیل نگه ندارید.
نکته مهم: افزایش حافظه Emulator راهحل واقعی برای Memory Leak در اپلیکیشن نیست. ابتدا باید علت مصرف غیرطبیعی حافظه مشخص شود.
8. خطای Only the original thread that created a view hierarchy can touch its views
این خطا معمولاً زمانی رخ میدهد که برنامه بخواهد یک View را از Threadای غیر از Main/UI Thread تغییر دهد. رابط کاربری اندروید باید با سازوکارهای مناسب روی Thread مربوط به UI بهروزرسانی شود.
بیشتر بخوانید: نکات کلیدی طراحی UI اپلیکیشن اندروید
مثال مشکل
فرض کنید یک عملیات شبکه در یک Thread پسزمینه انجام شده و برنامه مستقیماً TextView را از همان Thread تغییر دهد. این کار میتواند باعث بروز خطا شود.
راهکار
عملیات سنگین مانند:
- درخواست شبکه
- پردازش فایل
- پردازش دادههای حجیم
- عملیات پایگاه داده
را از Main Thread خارج کنید و نتیجه را به شکل صحیح به لایه UI منتقل کنید. در پروژههای Kotlin امروزی، استفاده از Coroutines و الگوهایی مانند viewModelScope و lifecycleScope میتواند مدیریت این عملیات را سادهتر و ایمنتر کند.

9. خطای Too Many References و محدودیت 64K
در نسخههای قدیمیتر ابزارهای Android ممکن است با خطاهایی مانند:
Too many field references
یا:
Method ID not in [0, 0xffff]
مواجه شوید. عدد 65,536 به محدودیت Referenceهای یک فایل DEX مربوط است و زمانی اهمیت پیدا میکند که پروژه از کتابخانهها و کد زیادی استفاده کند. مستندات رسمی Android این موضوع را با عنوان 64K method reference limit توضیح میدهد.
راهکار
قبل از فعال کردن Multidex:
- Dependencyهای اضافی را حذف کنید.
- کتابخانههای مشابه را ادغام یا جایگزین کنید.
- از R8 برای حذف کدهای استفادهنشده در Release استفاده کنید.
- تعداد Dependencyهای غیرضروری را کاهش دهید.
اگر پروژه واقعاً از محدودیت عبور کرده است، Multidex راهکار استاندارد برای مدیریت چند فایل DEX است.
10. خطای NetworkOnMainThreadException
NetworkOnMainThreadException زمانی ایجاد میشود که برنامه بخواهد عملیات شبکه را روی Main Thread انجام دهد. Android این Exception را برای اپلیکیشنهایی که عملیات شبکه را روی Main Thread انجام میدهند تعریف کرده است.
- نمونه عملیات مشکلساز
- ارسال درخواست HTTP
- دریافت اطلاعات از API
- دانلود فایل
- ارتباط مستقیم با سرور
راهکار
عملیات شبکه را از Main Thread خارج کنید. در پروژههای امروزی Kotlin، میتوانید از Coroutineها استفاده کنید و عملیات I/O را در Dispatcher مناسب انجام دهید. برای مثال:
viewModelScope.launch {
val result = withContext(Dispatchers.IO) {
repository.getData()
}
// Update UI state
}
این رویکرد علاوه بر جلوگیری از خطای NetworkOnMainThreadException، به Responsive ماندن رابط کاربری نیز کمک میکند.
چند خطای مهمتر در پروژههای جدید اندروید
خطاهای بالا بیشتر از پروژههای قدیمیتر و پایهای شناخته شدهاند. اما در توسعه امروزی اندروید، مشکلات دیگری نیز بسیار مهم هستند که بهتر است هنگام نگارش یک مقاله بهروز درباره خطاهای Android نادیده گرفته نشوند.
11. خطای android:exported در Android 12 و بالاتر
اگر یک Component مانند Activity، Service یا Receiver دارای intent-filter باشد، در پروژههایی که targetSdkVersion مناسب نسخههای جدید اندروید دارند باید مقدار android:exported بهصورت صریح مشخص شود.
برای Activity اصلی معمولاً ساختار مشابه زیر استفاده میشود:
android:exported="true">
اگر این ویژگی در Manifest بهدرستی تنظیم نشده باشد، ممکن است فرآیند Build یا نصب اپلیکیشن با خطا مواجه شود.
12. خطای Cleartext HTTP Traffic Not Permitted
در نسخههای جدید اندروید، استفاده از ارتباط HTTP معمولی میتواند با محدودیتهای امنیتی مواجه شود. اگر API شما بهجای HTTPS از HTTP استفاده کند، ممکن است خطایی مشابه زیر مشاهده کنید:
Cleartext HTTP traffic not permitted
راهکار پیشنهادی
راهکار اصلی، انتقال API و سرویسها به HTTPS است. فعال کردن Cleartext Traffic برای کل اپلیکیشن فقط برای دور زدن خطا توصیه نمیشود؛ اگر واقعاً مجبور به استفاده از HTTP هستید، باید این دسترسی را محدود و کنترلشده پیکربندی کنید.
13. خطای Permission Denial
گاهی اپلیکیشن هنگام دسترسی به دوربین، موقعیت مکانی، اعلانها، میکروفون یا فایلها با خطای Permission مواجه میشود. علت این مشکل میتواند یکی از موارد زیر باشد:
- Permission در Manifest تعریف نشده است.
- Permission در Runtime درخواست نشده است.
- کاربر Permission را رد کرده است.
- محدودیتهای نسخه جدید Android با روش قدیمی درخواست دسترسی سازگار نیست.
راهکار
Permissionها را متناسب با نسخه Android و نوع دسترسی مورد نیاز بررسی کنید و فقط دسترسیهایی را درخواست کنید که واقعاً برای عملکرد اپلیکیشن ضروری هستند.
14. خطاهای Gradle و ناسازگاری Dependencyها
یکی از رایجترین مشکلات پروژههای مدرن اندروید، ناسازگاری نسخههای مختلف ابزارها و کتابخانههاست. برای مثال ممکن است نسخههای زیر با یکدیگر هماهنگ نباشند:
- Android Gradle Plugin
- Gradle
- Kotlin
- AndroidX
- Compile SDK
- کتابخانههای Jetpack
- پلاگینهای شخص ثالث
روش اصولی رفع خطا
بهجای تغییر تصادفی نسخهها:
- متن کامل خطای Gradle را بررسی کنید.
- Dependency مشکلدار را مشخص کنید.
- Compatibility نسخهها را بررسی کنید.
- Dependencyهای Transitive را نیز در نظر بگیرید.
- بعد از تغییر نسخه، پروژه را مجدداً Sync و Build کنید.
نکته: در پروژههای حرفهای، نگه داشتن Dependencyها در نسخههای مشخص و مدیریت منظم آنها از ایجاد بسیاری از خطاهای Build جلوگیری میکند.
چگونه خطاهای اندروید را سریعتر پیدا کنیم؟
یکی از مهمترین مهارتها در توسعه اپلیکیشن اندروید، صرفاً دانستن نام Exceptionها نیست؛ بلکه توانایی پیدا کردن Root Cause است. برای Debug حرفهای، این فرآیند را دنبال کنید:
1. پیام خطا را کامل بخوانید
به اولین خطی که Exception را معرفی میکند توجه کنید.
2. Stack Trace را بررسی کنید
فقط آخرین خط کد را نگاه نکنید. Stack Trace معمولاً مسیر رسیدن برنامه به خطا را نشان میدهد.
3. اولین خط مربوط به کد خودتان را پیدا کنید
در بسیاری از موارد، مهمترین بخش Stack Trace همان اولین خطی است که به فایل و کلاس پروژه شما اشاره میکند.
4. شرایط ایجاد خطا را بازسازی کنید
بررسی کنید خطا:
- همیشه رخ میدهد؟
- فقط روی یک دستگاه خاص رخ میدهد؟
- فقط در Release رخ میدهد؟
- فقط هنگام قطع اینترنت رخ میدهد؟
- فقط در نسخه خاص Android رخ میدهد؟
5. از Android Studio Profiler و ابزارهای Debug استفاده کنید
برای مشکلات حافظه، CPU و عملکرد، ابزارهای Profiling میتوانند اطلاعات بسیار دقیقتری نسبت به Logcat در اختیار توسعهدهنده قرار دهند.
چرا استفاده از Kotlin میتواند تعداد خطاها را کاهش دهد؟
Kotlin امروزه یکی از زبانهای اصلی توسعه اندروید است و Android Developers نیز آن را بهعنوان زبان مدرن توسعه Android معرفی میکند. Kotlin با قابلیتهایی مانند Null Safety، Type Safety و Syntax مختصرتر میتواند بخشی از خطاهای رایج را پیش از اجرای برنامه آشکار کند.
برای مثال، در Java ممکن است مقدار null تا زمان اجرای برنامه مشکل ایجاد نکند؛ اما Kotlin در بسیاری از شرایط اجازه نمیدهد یک متغیر Non-null را با null مقداردهی کنید. البته Kotlin به معنی حذف کامل خطا نیست. همچنان مدیریت صحیح Lifecycle، Threadها، حافظه، شبکه، Dependencyها و معماری اپلیکیشن اهمیت زیادی دارد.
بیشتر بخوانید: بهترین زبان برنامه نویسی برای طراحی اپلیکیشن اندروید
چکلیست جلوگیری از خطا در طراحی اپلیکیشن اندروید
قبل از انتشار نسخه نهایی اپلیکیشن، بهتر است موارد زیر بررسی شوند:
- بررسی کامل Logcat و Crashها
- تست روی چند نسخه Android
- تست روی دستگاههای مختلف
- تست وضعیت بدون اینترنت
- تست سرعت پایین اینترنت
- بررسی مصرف حافظه
- بررسی Permissionها
- بررسی Deep Linkها و Intentها
- بررسی Activityها و سایر Componentهای Manifest
- بررسی Dependencyها و نسخههای Gradle
- فعال بودن R8 در Release در صورت مناسب بودن پروژه
- بررسی حجم APK یا App Bundle
- تست حالت Dark Mode در صورت پشتیبانی
- تست تغییر Orientation و Lifecycle
- تست در شرایط کمبود حافظه
- تست Notificationها
- تست APIهای شبکه با HTTPS
- بررسی Crashهای نسخه Release، نه فقط Debug
جمعبندی
خطا در فرآیند طراحی اپلیکیشن اندروید موضوعی اجتنابناپذیر است؛ اما تفاوت یک پروژه حرفهای با یک پروژه ضعیف در نحوه مدیریت، پیشگیری و رفع همین خطاها مشخص میشود.
خطاهایی مانند ActivityNotFoundException، ClassCastException، NullPointerException، مشکلات DEX، OutOfMemoryError و NetworkOnMainThreadException همچنان اهمیت دارند، اما در پروژههای جدید باید مشکلاتی مانند ناسازگاری Gradle و Dependencyها، تنظیمات Manifest، Permissionها، امنیت شبکه، Lifecycle و معماری مدرن Kotlin را نیز جدی گرفت.
از طرف دیگر، استفاده از Kotlin و قابلیتهای جدید Android به توسعهدهندگان کمک میکند بسیاری از مشکلات را زودتر شناسایی و کد ایمنتری تولید کنند. برای مثال، Null Safety در Kotlin میتواند بخش قابل توجهی از خطاهای ناشی از استفاده نادرست از null را پیش از زمان اجرا آشکار کند. بنابراین اگر قصد طراحی اپلیکیشن اندروید را دارید، صرفاً ظاهر زیبا و امکانات متعدد کافی نیست؛ معماری مناسب، امنیت، عملکرد، مدیریت خطا، سازگاری با نسخههای جدید Android و تست مستمر نیز باید از ابتدای پروژه در نظر گرفته شوند.



