در این مطلب به بررسی gradle که build system به کار رفته در اندروید استودیو می باشد می پردازیم. گریدل چیست هدف آن چیست و چه مشکلاتی را حل می کند به علاوه مشکلات و خطا های رایج و برخی نکات مهم مربوط به آن را بررسی می کنیم.
گریدل یک build automation system (سیستم ساخت خودکار) است. اپلیکیشن های امروزی برای مثال یک اپلیکیشن اندروید از نظر ساختاری به سادگی اپلیکیشن های پانزده سال پیش نیستند. در گذشته کد های برنامه توسط برنامه نویس نوشته می شد و پس از کامپایل شدن اجرا می شد. اما امروزه یک برنامه نویس قبل از اجرای برنامه نیاز به انجام عملیات متنوع و متعددی برای ساخت فایل های اجرایی برنامه نظیر یک فایل apk یا exe دارد. برای مثال بررسی خطا های نوشتاری برنامه قبل از کامپایل، قرار گرفتن فایل های media برنامه نظیر فایل های عکس، ویدئو، صوت و … هر کدام به مسیر از پیش تعیین شده انتقال داده شوند. مجموعه ای از کد ها به صورت خودکار و پویا با توجه به کد های نوشته شده توسط برنامه نویس ساخته شوند و در کنار کد های برنامه نویس قرار بگیرند. تست های نوشته شده توسط برنامه نویس اجرا شود و نتیجه آن اعلام شود. در آخر همه فایل های مورد نیاز به همراه کد های کامپایل شده برنامه درون یک فایل zip قرار گرفته و پسوند فایل به apk تغییر کند. بعد از همه این عملیات و ساخته شدن فایل خروجی حالا می توان آن را نصب کرد. نکته مهم و قابل توجه این است که برنامه نویس پس از هر بار تغییر در برنامه برای اجرای مجدد باید این عملیات را تکرار کند. به این عملیات عملیات ساخت گفته می شود. زیاد بودن، زمان بر بودن، پیچیدگی و تنوع مراحل ساخت باعث شده است که برنامه نویسان دست به ساخت سیستم های ساخت اتوماتیک نظیر gradle بزنند.
ما روزانه ده ها بار برنامه خود را اجرا می کنیم تا نتایج تغییراتی را که اعمال کرده ایم مشاهده کنیم. مسلما اگر بخواهیم همه این عملیات را خودمان به صورت دستی انجام دهیم وقت بسیار زیادی از ما تلف خواهد شد. پس به صرفه است که از یک build system استفاده کنیم. سیستمی که کافی است تا برای آن لیستی از وظایف را تعیین کنیم تا به صورت خودکار آن وظایف را انجام دهد. نظیر gradle
شاید یک مثال ساده برای درک اهمیت gradle در اندروید استودیو کافی باشد. یکی از وظایفی که بر عهده gradle می باشد code generation است. code generation یعنی کد های شما توسط یکی از task های gradle خوانده می شود و سپس کد هایی جدیدی تولید می شوند که در کنار کد های شما اجرا می شوند. برای مثال کلاس R در اندروید توسط gradle ساخته می شود. هر بار که یک id به عناصر یکی از layout هایمان اضافه می کنیم این id باید در کلاس R اضافه شود تا از کلاس اکتیویتی مان قادر به پیدا کردن عناصر درون layout مان باشیم. مطمئنا اضافه کردن id ها به کلاس R به صورتی دستی توسط برنامه نویس بسیار وقت گیر است و احتمال بروز اشتباهات زیادی توسط برنامه نویس وجود دارد.
از مثال های دیگر می توان به پوشه بندی مجدد resource ها، اجرای lint check، اجرای خودکار تست ها، dependency management، مدیریت flavour ها و buildType ها، ساخت فایل های apk و بسیاری موراد دیگر اشاره کرد
گرچه بیشتر کاربران Gradle توسعه دهنده اندروید هستند ولی از گریدل می توان به عنوان build system در انواع پروژه های php، java ،kotlin ، سی شارپ ، سی پلاس پلاس ، Groovy و حتی java-script استفاده کرد. گرچه برای جاوا اسکریپت سیستم های ساخت مختص آن نظیر web-pack توصیه می شود.
اگر یک برنامه نویس هستید پس حتما با ابزار های خط فرمان (command line interface) زیادی کار کرده اید. نظیر git ، npm ، composer و یا یکی از هزاران موارد موجود از ابزار ها یا پکیج های قابل دسترس از خط فرمان. اما چیزی که مهم است بدانید این است که gradle نیز یک cli هست و شما به راحتی می توانید از command line با آن کار کرده گرچه برای اکثر موارد مورد نیاز شما در اندروید استودیو رابط های کاربری تعریف شده است، اما از طریق command line شما می توانید هر command را که می خواهید اجرا کنید.
اگر یک اندروید دولوپر هستید نیازی به نگرانی برای نصب دانلود یا نصب دستی gradle ندارید. هر زمان که نسخه مورد استفاده از gradle در کامپیوتر شما موجود نباشد android studio در صورت نیاز نسخه مورد نظر شما را دانلود و نصب می کند.
یکی از بزرگترین کار هایی که gradle انجام می دهد مدیریت وابستگی(لایبرری) هاست. تقریبا همه اپلیکیشن هایی که می سازیم علاوه بر لایبرری های استاندارد اندروید که در SDK موجود اند و لایبرری های استاندارد جاوا که در JDK موجود اند، از لایبرری های دیگری نیز استفاده می کنیم که آنها را تنها با اضافه کردن یک خط در فایل build.gradle پروژه مان در قسمت dependencies به پروژه مان اضافه می کنیم. به این لایبرری ها اصطلاحا third-party-library نیز گفته می شود. ما می توانیم این کار را به صورت دستی نیز انجام دهیم یعنی به سرور های مورد نظر نظیر maven مراجعه کرده، فایل jar را سرچ کرده، پیدا کنیم درون پروژه مان قرار دهیم و سپس دوباره پروژه را build کنیم. مسلما انجام این کار زمانبر است. علاوه بر این در صورت استفاده از gradle اگر نسخه جدیدی از لایبرری مورد نظر ارائه شود gradle از طریق اعلان های lint به ما اطلاع می دهد.
یکی از مشکلاتی که با بزرگ شدن اپلیکیشن می تواند بروز کند، dependency conflict (تداخل وابستگی) است. به طوری که دو یا چند مورد از وابستگی (لایبرری) های پروژه ما خودشان وابسته به یک لایبرری اما از نسخه های متفاوت باشند. که به زبان ساده تر باعث می شود که دو نسخه متفاوت از یک لایبرری در اپلیکیشن ما وجود داشته باشد.در صورتی که تغییرات موجود در این دو نسخه متفاوت با هم اختلاف داشته باشند در پروژه ما مشکلی به اسم dependency conflict به وجود می آید. وجود این تداخل در اپلیکیشن ما باعث بروز خطا هایی غیر قابل پیش بینی از نوع compile-time و یا run-time می شود. تشخیص و حل این تداخل ها بدون ابزاری قدرتمند مثل gradle بسیار طاقت فرسا و زمانبر است. اما وقتی از gradle استفاده می کنیم این مشکل توسط اعلان های lint به ما گزارش می شود. چگونگی حل این مشکلات خارج از موضوع این پست می باشد که در پستی دیگر به توضیح آن خواهیم پرداخت
گریدل با زبان java توسعه داده شده است. و پلاگین های نوسته شده برای این build system نیز به همین زبان می باشند. اما از آنجا که گریدل فقط برای توسعه دهندگان جاوا توسعه داده نشده است. به همین دلیل تیم گریدل تصمیم گرفت تا syntax مورد استفاده در فایل build.gradle را جوری طراحی کند تا به برنامه نویسان زبان های دیگر نیز به راحتی از gradle استفاده کنند. از این رو گریدل از یک dsl بر پایه زبان Groovy استفاده می کند. برخلاف جاوا زبان هایی مثل groovy یا kotlin قابلیت توسعه dsl را دارند. یک dsl به زبان ساده یک زبان تعریف شده در یک زبان دیگر است که فقط در محدوده ای خاص عمل می کند. در مورد DSL تا این حد بدانید که هدف آن افزایش خوانایی و فهم بهتر کد های نوشته شده توسط یک لایبرری است.
گریدل (gradle) به صورت پیش فرض از یک DSL مخفف (domain specific language) بر پایه Groovy استفاده می کند. البته این DSL صرفا برای افزایش خوانایی کد های شما می باشد. و شما میتوانید همه کد های فایل های build.gradle را به زبان Groovy بنویسید
لازم به ذکر است که به تازگی گریدل kotlin-dsl را معرفی کرده است که جایگزین groovy-dsl خواهد شد.
به توضیح ساده هر task شامل دستوراتی می باشد که عملیات خاصی که مربوط به ساخت برنامه می باشد را انجام می دهد. مثل clean که یک task می باشد که در فایل build.gradle پروژه root شما تعریف شده است.در واقع هر زمان که شما در اندروید استودیو از منوی build روی گزینه clean کلیک می کنید این task را اجرا می کنید. وظیفه این task در واقع پاک کردن خروجی های ساخته شده که شامل فایل های apk ساخته شده می شود، می باشد. بقیه task ها نیز توسط پلاگین ها به بیلد شما اضافه می شوند. مثل پلاگین android که شامل task هایی برای ساخت و توسعه اپلیکیشن های اندرویدی است. علاوه بر پلاگین ها شما می توانید task های خودتان را بسازید، که هر کدام وظایفی را که شما برای آنها تعریف می کنید اجرا می کنند.
اگر پنل Gradle در Android Studio را باز کنید لیستی از همه task های موجود در پروژه تان خواهید دید که با کلیک کردن بر روی هر کدام می توانید آنها را اجرا کنید. task ها می توانند بر یکدیگر وابسته باشند در این صورت برای اجرای یک task ابتدا تمام task های دیگری که بر آنها وابسته می باشد به صورت خودکار اجرا می شوند تا task مورد نظر ما اجرا شود. از اندروید استودیو نسخه سه به بعد پنلی به نام build اضافه شده است که در هنگام اجرای هر task یک نمایش درختی از اجرای این task و تمام task های وابسته آن نمایش می دهد.
پلاگین ها چیزی نیستند جز چمدانی از task ها. مثلا پلاگین android شامل task هایی برای توسعه ، ساخت ، دیباگ و تست اپلیکیشن های اندرویدی می باشد.
از جمله مشکلات کار با gradle می توان به سرعت بسیار پایین آن اشاره کرد. build هایی که از یک ثانیه شروع می شوند و بعضا ممکن است تا بیست دقیقه هم به طول بیانجامند. این مشکل مخصوصا در دیباگ کردن اپلیکیشن بسیار آزار دهنده خواهد بود چون شما نیاز دارید که برنامه را بار ها اجرا کنید تا نتیجه تغییرات خود را ببینید.
آموزش های بسیاری در اینترنت وجود دارند اما جامع ترین آنها داکیومنت ها و مثال های ارائه شده در وبسایت gradle.org می باشند، که با مطالعه آن قادر خواهید بود درک عمیقی از کارکرد gradle ، ساخت task ها و plugin ها پیدا کنید.
اگر این مقاله برای شما مفید بود یا می خواهید بیشتر در مورد گریدل بدانیدلطفا با نظر دادن به اطلاع دهید