بهترین روش‌ها در توسعۀ اپلیکیشن‌های اندرویدی

نویسنده : سید ایوب کوکبی ۱۵ اسفند ۱۳۹۷

در دنیای برنامه‌نویسی به روش‌های خوب و اصولی که اغلب حرفه‌ای‌ها از آن استفاده می‌کنند Best Practice گفته می‌شود. در این مطلب قصد داریم تعدادی از این روش‌ها را برای طراحی و توسعۀ اپ‌های اندرویدی معرفی کنیم.

اجرای صحیح برنامه روی طیف گسترده‌ای از دستگاه‌های اندرویدی اهمیت فراوانی دارد. هر دستگاهی متعلق به یک خانواده بوده و وقتی برنامۀ شما روی یکی از آن‌ها با مشکل مواجه شود احتمالاً روی بقیۀ دیوایس‌ها در همان خانواده نیز مشکل خواهد داشت.

آیا می‌دانستید وقتی یک برنامه از سیستم‌عامل اندروید درخواست حافظه می‌کند و اندروید حافظه‌ای در دسترس نداشته باشد چه می‌کند؟ بله؛ اندروید سایر برنامه‌ها را از حافظه خارج می‌کند تا آن اپلیکیشن بتواند کارش را انجام دهد. اکنون وقتی کاربر به برنامه‌های قبلی‌اش سوئیچ می‌کند، آن‌ها ریست یا از دوباره اجرا می‌شوند.

وقتی یک اپلیکیشنی، حافظه، پردازش و GPU زیادی مصرف می‌کند تبعاً باعث افزایش مصرف باتری نیز خواهد شد. این موضوع می‌تواند تجربۀ کاربری بدی به دنبال داشته باشد. بنابراین پرفرمنس برنامه موضوع بسیار مهمی است. در ادامه تعدادی از Best Practiceها را خدمتتان عرضه می‌کنیم.

از یک معماری مناسب استفاده کنید

استفاده از معماری یا چارچوب به کدهای شما سازمان می‌دهد. به عنوان مثال در معماری MVC که سرنام Model-View-Controller است. منطق برنامه کاملاً جدا از واسط گرافیکی است. این یعنی برنامه در سه لایۀ مدل، ویو و کنترلر توسعه داده می‌شود و هر جایی مشکلی به وجود آید به همان لایه مراجعه می‌کنیم؛ دیگر نیازی به بررسی سایر بخش‌ها نیست. همانند MVC معماری‌های دیگری مثل MVVM, MVP و … نیز وجود دارد که بنا به شرایط و حتی سلیقۀ شخصی می‌توانید یکی را برای پروژۀ خود انتخاب کنید. یک برنامه با یک معماری ساده بهتر از برنامه‌ای است که اصلاً معماری نداشته باشد.

همیشه به کیفیت کد توجه کنید

کیفیت اهمیت زیادی دارد و این معنی‌اش فقط این نیست که از معماری استفاده کنید. وقتی از کیفیت حرف می‌زنیم، منظورمان هر تکه کدی است که هر جایی از برنامه می‌نویسید.

حل مشکل نشت حافظه در اندروید

هر آنچه برای مقابله با نشت حافظه لازم دارید در این مقاله آورده‌ایم. حتما بخوانید.

همیشه از آزمون واحد استفاده کنید

استفاده از آزمون‌های واحد (Unit Test) یکی از شاخصه‌های حرفه‌ای بودن توسعه‌دهنده است. توصیۀ ما این است که یونیت تست‌ها را در JVM اجرا کنید چون به نسبت ایمیولیتور یا دستگاه‌های اندرویدی سریعتر اجرا می‌شود. اگر دسترسی خاصی به اندروید لازم داشتید می‌توانید از کتابخانۀ robolectric استفاده کنید. در حالت عادی اجرای تست روی ایمیلیتور یا دیوایس اندرویدی بسیار کند و آزار دهنده است. اما با کمک این کتابخانه می‌توانید آزمون‌های واحد را در عرض چند ثانیه روی همان JVM اجرا کنید. برای موکینگ اشیاء نیز از کتابخانۀ Mockito استفاده کنید. جهت ساده‌سازی فرایند تست از Dependency Injector نیز می‌توانید استفاده کنید.

بخوانید  آموزش زبان کاتلین – درس 26 (Sealed Class)

از تست فانکشنال واسط گرافیکی غافل نباشید

تست‌های فانکشنال، قابلیت‌های برنامه را از زاویۀ کاربر بررسی می‌کنند. این تست‌ها برنامه را اجرا کرده و همانند کاربر، قابلیت‌های مختلف را تست می‌کنند. در صورتی که برنامه با سایر اپلیکیشن‌ها در ارتباط نیست از Android Instrumentation استفاده کنید و در صورت تعامل با سایر برنامه‌ها از UIAutomator بهره ببرید.

برای پرفرمنس بالاتر، کدهای بیشتری بنویسید

از هزینه‌های کوچک و غیرضروری برحذر باش، زیرا یک سوراخ کوچک موجب غرق شدن یک کشتی بزرگ می‌شود. — بنجامین فرانکلین

در نسخۀ release حتماً از پروگارد استفاده کنید

یکی از مهم‌ترین کاربردهای پروگارد (Proguard)، حذف فایل‌های غیرضروری و پاکسازی کدهای اضافه است که باعث کاهش حجم APK می‌شود. بنابراین نسخه‌ای از برنامه که می‌خواهید در مارکت منتشر کنید را حتماً پروگارد کنید!

از ابزارهای Debugging استفاده کنید

توصیه می‌کنیم برای دیباگ کردن کدها از Android Debug Database استفاده نمایید. این کتابخانه بهترین دوست شما خواهد بود. Android Debug Database کتابخانه‌ای قدرتمند برای اشکال‌زدایی دیتابیس و shared preference در اپلیکیشن‌های اندروید است. با کمک این ابزار به راحتی می‌توانید داده‌های دیتابیس و shared preference را در مرورگر خود مشاهده نمایید.

از strings.xml استفاده کنید

هیچگاه متن‌های مورد استفاده در برنامه را hard code نکنید یعنی رشته‌ها را لابه‌لای کد قرار ندهید. برای مدیریت متمرکز رشته‌ها و سهولت چندزبانه‌کردن برنامه همۀ رشته‌ها را در فایل strings.xml قرار دهید و هر جایی لازم داشتید به این فایل ارجاع دهید. با انجام این کار لزومی به تولید رشته‌های تکراری نیز نخواهد بود و نهایتاً حجم برنامه اندکی کاهش می‌یابد.

آیکون برنامه را در فولدر mipmap قرار دهید

وقتی برای صفحاتی با تراکم پیکسلی متفاوت، فایل‌های APK متعددی درست می‌کنید. فولدر Drawable برای سایر تراکم‌ها در نظر گرفته نمی‌شود. این مسئله منجر به blurry یا پیکسلی شدن آیکون روی دستگاه‌هایی با تراکم پیکسلی بالا می‌شود. فولدر mipmap این مشکل را ندارد. بنابراین آیکون برنامه را همیشه در این فولدر ذخیره کنید.

بخوانید  آشنایی با دستورات ADB – بخش دوم

تا حد امکان از shapeها و selectorها به جای تصاویر استفاده کنید

این کار کاهش حجم فایل APK را به دنبال دارد.

Layout را خیلی تودرتو و عمیق نکنید

ارث‌بری یا تودرتوهای عمیق در لایه ویو باعث کند شدن اجرای برنامه خواهد شد. و از طرفی مدیریت آن را نیز سخت می‌کند. با استفادۀ درست از ViewGroup ها و Constraint Layout تا حد زیادی این مشکل برطرف می‌شود.

از کتابخانه‌های مناسب برای HTTP استفاده کنید

برای کار با شبکه کتابخانه‌های مختلفی مثل Retrofit, Volley یا Fast Android Networking وجود دارد که زحمت پیاده‌سازی ارتباطات شبکه را از دوش شما بر می‌دارند.

در هنگام ارسال داده‌ها به Intent یا Bundle به جای کلاس Serializable از Parceable استفاده کنید

سریال‌سازی آبجکتی که اینترفیس Parceable را پیاده‌سازی کرده به مراتب ساده‌تر و سریعتر از Serialization پیش‌فرض جاوا است. کلاسی که اینترفیس Serializable را پیاده‌سازی کرده به عنوان Serializable شناخته می‌شود و جاوا با استفاده از رفلکشن آن را سریال می‌کند که سرعتش کم است. اما وقتی از اینترفیس Parceable استفاده می‌کنید، کل آبجکت به صورت خودکار سریال نمی‌شود؛ به جایش می‌توانید داده‌ها را به صورت انتخابی از آن آبجکت به Parcel ارسال کنید.

کار با فایل‌ها را در تردی خارج از UI انجام دهید

عملیات فایل‌ها را حتماً در worker thread انجام دهید. و معمولاً این کار توسط AsyncTask/Loader صورت می‌گیرد. از آنجایی که کار با فایل‌ها زمان‌بر بوده و ممکن است ترد UI را درگیر کند این عملیات را باید در ترد مستقلی در زمینه اجرا کرد. در غیر اینصورت اگر به مدت ۵ ثانیه UI به درخواست کاربر نتواند پاسخ دهد، برنامه با خطای Application Not Responding بسته می‌شود.

درک خوبی از Bitmap داشته باشید

یک تصاویر اگرچه گویای هزار حرف است و کاربران را جذب می‌کند ولی به خاطر داشته باشید که استفادۀ نادرست از تصاویر ممکن است به مصرف حافظۀ زیادی منجر شود. بنابراین تا جایی که می‌توانید دربارۀ بهینه‌سازی تصاویر و کاهش حجم این فایل‌ها تحقیق کنید.

بخوانید  برنامه‌نویسی پیشرفته اندروید با زبان کاتلین - بخش سوم (RxJava)

Context را بفهمید

این Context از آن چیزهایی است که همۀ توسعه‌دهندگان با آن سروکار دارند ولی تعداد کمی واقعاً به ماهیتش آگاهند. برای اطلاعات بیشتر به مقالۀ فهم درست مفهم Contex مراجعه کنید.

برای جلوگیری از تکرار attributeها، داخل xml layout از  استایل‌ها استفاد کنید

جایی که لازم است به جای اکتیویتی از فرگمنت استفاده کنید

گاهی می‌توان یک اکتیویتی را به چند واحد مجزا تقسیم کرد. این واحدها را می‌توان به کمک فرگمنت‌ها پیاذه‌سازی نمود. استفاده از فرگمنت اگرچه پیچیدگی‌های خاص خودش را دارد ولی یادگیری درست استفاده از آن محاسن فراوانی خواهد داشت. یکی از بزرگترین مزایای فرگمنت‌ها، ماژولار کردن برنامه‌های اندرویدی است که مدیریت واحدهای مختلف اپلیکیشن را آسان می‌کند.

RxJava را یاد بگیرید

RxJava پیاده‌سازی Reactive Extension برای ماشین مجازی جاوا است و یادگیری آن به یکی از ترندهای محبوب برنامه‌نویسی اندروید تبدیل شده است. استفاده صحیح از RxJava نیازمند مهارت بالایی است.

درک خوبی از چرخۀ حیات اکتیویتی داشته باشید

هر جایی می‌توانید از کتابخانه‌های محبوب به جای راه‌حل‌های اختصاصی خودتان استفاده کنید.

استفاده از راه‌حل‌های اختصاصی اگرچه بد نیست ولی خوب هم نیست؛ بخصوص وقتی برای آن مسئله راهکارهای محبوب و از همه‌پسندی وجود داشته باشد. به عنوان مثال برای کار با شبکه اشتباه محض است به جای Retrofit از راهکارهای اختصاصی خودتان استفاده کنید. دلیلش این است که رتروفیت توسط جامعه‌ای از برنامه‌نویسان توسعه و پشتیبانی می‌شود و به محض بروز کوچکترین باگی، مشکل گزارش شده و توسط کامیونیتی قدرتمند توسعه‌دهندگانش حل می‌شود. اما اینجا شما تک و تنها هستید و شناسایی و برطرف کردن مشکلات نیز کاری بسیار طاقت‌فرسا و زمان‌بری است.

و دوباره تاکید می‌کنیم، برنامه را فقط روی یک دستگاه تست نکنید. برنامۀ شما قرار است روی طیف وسیعی از دستگاه‌ها با نسخه‌های مختلف اندروید اجرا شود. بعد از اطمینان  از صحت اجرای اپلیکیشن روی اغلب دستگاه‌ها می‌توانید برنامه را منتشر کنید.

سید ایوب کوکبی

نویسنده و مترجم...

0 دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *