بهبود سرعت build در اندروید استودیو

مطلبی که میخوانید ترجمۀ مقالهای است که مدیر محصول اندروید استودیو (لئو سی) در مدیوم منتشر کرده است. لئو سی در این مقاله با توجه به بازخورد دریافت شده از مشتریان راهکارهایی برای بهبود سرعت Build ارائه کرده است که بد نیست به عنوان یک برنامهنویس اندروید در جریان آنها باشید.
بهبود سرعت Build
هدف ما در اندروید استودیو این است که بیشترین بهرهوری را برای برنامهنویسان به ارمغان بیاوریم. طی بحثها و نظرسنجیها متعدد با توسعهدهندگان متوجه شدیم که سرعت کمِ بیلد در اندروید استودیو مانعی در جهت بهرهوری است.
در این مقاله آنالیزها، عوامل موثر در سرعت بیلد و کارهایی که انجام دادهایم را با شما اشتراک میگذاریم. همچنین خواهیم گفت که چه کارهایی میتوانید انجام دهید که سرعت بیلد پایین نیاید. از برنامهنویسانی که با فعال کردن گزینۀ Preference > Data sharing اجازۀ اشتراک آمار استفاده از اندروید استودیو را به ما دادند کمال تشکر را داریم.
اندازهگیری سرعت به چند روش مختلف
اولین کاری که انجام دادیم استفاده از پروژههای متنبازی مثل SignalAudio, Tachiyomi, SantaTracker و Skeleton برای اندازهگیری سرعت برنامه در شرایط مختلفِ کد، منابع، مانیفست و … بود.
برای مثال این بنچمارکی است است که با تغییرات متعدد در کد، سرعت بیلد را نشان میدهد. همانطور که میبینید با گذشت زمان و تغییر کدها بهبود قابل توجهی در سرعت بیلد حاصل شده است.
همچنین با نگاهی به دادههای واقعی، سرعت بیلد قبل و بعد از آپدیت پلاگین گریدل را بررسی کردیم. در نمودار پایین مشاهده میکنید که سرعت بیلد در نسخههای جدید بهبود زیادی داشته است. مثلاً از نسخۀ ۲٫۳ به بعد سرعت بیلد در محیط دیباگ چیزی حدود ۵۰ درصد بهبود داشته است.
در انتها بدون اینکه نسخۀ خاصی را مد نظر قرار دهیم متوسط زمان Build در حالت دیباگ را از ابتدا تاکنون بررسی کردیم و به این نمودار دست یافتیم. متأسفانه در این نمودار شاهد روند رو به افزایش متوسط سرعت بیلد هستیم.
اگر سرعت بیلد در آزمایشهایی که انجام دادیم در هر نسخه نسبت به قبل بهبود داشته چرا در طی زمان شاهد این بهبودها نیستیم؟
با نگاهی عمیق به این موضوع پی بردیم که اتفاقاتی که در اکوسیستم اندروید اتفاق افتاده عاملی بوده تا سرعت بیلد سریعتر از آن که بتوانیم بهبود دهیم کاهش یابد.
با وجود اینکه میدانیم با رشد پروژه، میزان استفاده از منابع برای کدها و قابلیتهای متعدد زبان افزایش مییابد و همین موضوع عاملی بر کاهش سرعت بیلد است دریافتیم که فاکتورهای متعدد دیگری هم دخیل هستند:
- پچهای Spectre و Meltdown در اواخر سال ۲۰۱۷ تاثیر قابل توجهی روی پردازشهای I/O داشته و سرعت Clean Build را ۵۰ الی ۱۴۰ درصد کاهش داده است؛
- پلاگینهای جانبی گریدل: ۹۶ درصد توسعهدهندگان اندروید استودیو از برخی از پلاگینهای جانبی گریدل استفاده میکنند (که برخی از آنها در آخرین best practiceهای ارائه شده استفاده نمیشوند)؛
- بیشتر annotation processor های مورد استفاده که non-incremental بودند موجب ریکامپایل مجدد کد میشد که ناشی از تغییراتی بود که در کد اعمال میکنند؛
- استفاده از قابلیتهای زبان جاوا ۸ باعث تولید زبالۀ بیشتری میشود و روی زمان بیلد تأثیر میگذارد. البته با کامپایلر جدید، فایلهای dex یعنی D8 میزان تولید این زباله به طرز قابل قبولی کاهش یافته است؛
- استفاده از کاتلین، بهخصوص annotation processing در این زبان (KAPT) روی پرفرمنسِ بیلد تاثیر زیادی دارد. برای بهحداقلرساندن این تاثیر با تیم JetBrain همچنان داریم کار میکنیم.
ما چه کردهایم؟
حل مشکل پراسس داخلی و بهبود پرفرمنس
از این موضوع مطلع هستیم که بسیاری از مشکلات بهینگی زیر سرِ ویژگیهای جدید است که توسط گوگل به اندروید استودیو اضافه شده است. به همین خاطر پراسس داخلی را برای بهبود سرعت Build و اجرای سریعتر ارتقاء دادیم.
همچنین برای incremental کردن annotation processor ها داریم اقداماتی انجام میدهیم. همین الان که این نوشته را میخوانید [م: به تاریخ مقالۀ اصلی] Glide, Dagger و Auto Service به صورت افزایشی (Incremental) هستند و روی بقیه هم در حال انجام کارهایی هستیم.
همچنین نسخۀ سبکی از R generator را به نسخۀ اخیر اضافه کردهایم و کماکان با شرکت گریدل و جت برین برای بهبود سرعت Build داریم کار میکنیم.
ابزارهای Attribuition
در نظرسنجی اخیری که داشتیم بیش از ۶۰ درصد توسعهدهندگان اذعان داشتند قادر به آنالیز فرایند بیلد نیستند. بنابراین همچنان در حال ارتقاء ابزارها در اندروید استودیو هستیم تا در بحث Build شفافیت لازم را در اختیار جامعۀ برنامهنویسان اندروید قرار دهیم.
ما در حال یافتن راهکارهایی هستیم تا در محیط اندروید استودیو اطلاعات بهتری در مورد تاثیر پلاگینها و تسکها روی فرایند بیلد فراهم کنیم.
آنچه شما میتوانید انجام دهید
در حالی که سرعت کانفیگ بسته به تعداد variantها، ماژولها و چیزهای دیگر متغیر است در نظر داریم به عنوان یک مرجع بررسی مدت زمان کانفیگهای مختلفِ پلاگین گریدل را از روی دادههای واقعی در اختیار شما قرار دهیم.
در صورتی که مدت زمان کانفیگ خود را بسیار کم میبینید احتمالاً استفاده از یک Custom Build Logic یا استفاده از پلاگینهای جانبی در گریدل منشاء مشکل است.
ابزارهایی که میتوانید استفاده کنید
گریدل مجموعهای از ابزارهای رایگان فراهم آورده که اتفاقاتی که در فرایند بیلد میافتد را به شما نشان میدهد.
پیشنهاد میکنیم از Gradle Scan استفاده کنید که بیشترین اطلاعات را در مورد بیلد در اختیار شما قرار میدهد. در صورتی که برخی از اطلاعات ارسالی به سرورهای گریدل دارای مشکل است از Gradle Profiler استفاده کنید که البته اطلاعات کمتری از Scan در اختیار شما قرار میدهد ولی همه چیز در آن لوکال است.
نکته: بیلد اسکنها ابزارهای مفیدی برای سنجش میزان تأخیر کانفیگ نیستند. برای این منظور از پروفایلرهایی که برای JVM عرضه شده استفاده کنید.
Build Configuration و تسکهای خود را بهینه کنید
همینطور که دربارۀ سرعت بیلد تحقیق میکنید، best practice های متعددی وجود دارد که در این حوزه میتواند کمککننده باشد. البته هر وقت بخواهید میتوانید از آخرین best practice ها مطلع شوید.
تنظیمات پیکربندی
- کانفیگ را فقط برای تنظیم تسکها استفاده کنید. از انجام کارهای I/O در این بخش خودداری کنید. Configuration جای خوبی برای اجرای کوئریهای گیت، خواندن فایل، جستجو برای دستگاههای متصل و انجام محاسبات نیست.
- تمام تسکهای موجود در کانفیگ را تنظیم کنید. کانفیگ هیچ اطلاعی ندارد که قرار است چه کاری انجام دهد.
تسکهای بهینه
- مطمئن شوید که هر تسکی ورودی/خروجی را تعریف کرده و incremental و cacheable است؛
- کارهای پیچیده و بزرگ را به چندین تسک کوچکتر بشکنید. بعضی تسکها میتوانند همزمان با اجرای سایر تسکها آپدیت شوند یا به صورت موازی اجرا شوند؛
- مطمئن شوید که تسکها خروجی همدیگر را دستکاری و حذف نمیکنند؛
- تسکها را به جای اینکه مستقیما با groovy در فایل build.gradle بنویسید با زبان جاوا یا کاتلین با استفاده از پلاگین بنویسید.
ما هم مثل شما دولوپرها میخواهیم اندروید استودیو بهبود یابد. همزمان با بهبود سرعت بیلد مقالات و نکاتی منتشر میکنیم تا از پیشرفتهای حاصل شده مطلع شوید. امیدواریم نکات و ترفندهای بیان شده سرعت بیلد را برای شما افزایش دهد.
0 دیدگاه
نشانی ایمیل شما منتشر نخواهد شد. بخشهای موردنیاز علامتگذاری شدهاند *