اندروید و گردل: معرفی ساختار

اندروید استدیو برای بیلد پروژه‌ها از ابزاری به نام gradle استفاده می‌کند. زبان این ابزار groovy نام داره (البته با کاتلین هم میشه برای این ابزار کد نوشت) و یکی از قدرتمند ترین ابزارهای بیلد پروژه‌هاست. فرایند بیلد پروژه در gradle به این صورت ذیل می باشد.

همان گونه که در تصویر فوق مشخص است داده‌های برنامه به همراه کتابخانه‌هایی که در آن استفاده شده کامپایل شده و فایل dex تولید می‌شود، سپس با کلید مورد نظر sign می‌شود و فایل قابل نصب بدست می‌آید.

بیلد یک پروژه جنبه‌های مختلفی دارد:

یک: Build Types

مراحل فرایند ساخت پروژه را مشخص می‌کند. برای مثال در حالت دیباگ کلیدی که مورد استفاده قرار می‌گیرد، شرایط درهم ریزی کد و کوچک شدن و… را مشخص می کند. بیلد تایپ‌های پیشفرض debug و release هستند ولی شما می‌تواند به آنها اضافه کنید.

دو: Product Flavors

با اضافه کردن به flavor های پروژه شما می‌توانید نسخه‌های تفکیک شده‌ای از محصول خود داشته باشید. برای مثال از یک سورس کد نسخه دمو و اصلی برنامه را خروجی بگیرید. توجه داشته باشید از نام‌هایی رجیستر شده برای flavor مانند test، debug، main و… استفاده نکنید.

سه: Build Variants

این قابلیت بیلد به شما این اختیار را می‌دهد که ریسورس‌های دو flavor را از هم جدا کنید. برای مثال این امکان را برای شما فراهم می کند که از دو آیکن متفاوت برای نسخه اصلی برنامه و نسخه دمو برنامه استفاده کنید. برای این کار شما باید هم نام flavor خود یک پوشه در کنار پوشه main ایجاد کنید و در پوشه ساخته شده پوشه هایی هم نام ریسورس‌های پوشه main بسازید، تنها نکته‌ای که باید به آن توجه داشته باشید این است که از هم‌نامی برای جایگزین شدن فایل‌ها در زمان بیلد استفاده کنید.

چهار: Manifest Entries

این مفهوم به شما کمک می‌کند تا از چندین فایل منیفست بهرمند شوید. با استفاده از این قابلیت می‌توانید یک فایل منیفست را برای هر کدام از flavor ها به صورت مجزا پیکربندی کنید.

پنج: Dependencies

این قابلیت که معادل فارسی اون میشه وابستگی به شما کمک می‌کنه تا از کتابخانه‌های منتشر شده در اینترنت به سادگی استفاده کنید. فقط کافی لینک اونها رو توی فایل پیکربندی پروژتون قرار بدید.

شش: Signing

با استفاده از این ویژگی gradle شما می‌توانید امضا فایل خروجی پروژه خود را مشخص کنید، تا در زمان بیلد پروژه از فایل امضا مشخص شده برای پروژه استفاده شود. امضا کردن فایل خروجی برنامه باعث می‌شود تا شما کلیدی منحصر به فرد برای پروژه داشته باشید. فایل امضا همان keyStore است. اگه فایل امضا برنامه‌ای به هر دلیلی تغییر کنه کاربرها دیگر قادر به بروزرسانی برنامه نیستند و باید برای نصب نسخه جدید برنامه قبلی خود را حذف کنند.

هفت: ProGuard

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

هشت: Multiple APK Support

این ویژگی به شما این امکان را می‌دهد که همزمان چند فایل خروجی با داده‌های مختلف بدست بیاورید. برای مثال همزمان فایل خروجی نسخه اصلی و نمایشی را می‌تونید خروجی بگیرید.

ساختار فایل های پیکربندی:

شما میتوانید فایل‌های پیکربندی شخصی خودتان را داشته باشید، پیکربندی را تقسیم کنید به چند فایل یا همه دستورات را در یک فایل بنویسید. برای تغییر در ساختار استاندارد پیکربندی پروژه لازم است که به میزان تغییرات فایل‌ها، پیکربندی پیشفرض رو دستکاری کنید و مطابق نیاز آنها را ویرایش کنید. ساختار پیکربندی پیشفرض یک پروژه اندروید را می‌توانید در تصویر زیر مشاهده کنید.

شما می‌توانید این پیکربندی را تغییر دهید اما باید قبل از این کار حتما حوزه و هدف هر فایل را به خوبی بشناسید و از حداقل های زبان groovy آگاهی داشته باشید.

معرفی فایل های پیکربندی پروژه:

یک: settings.gradle

این فایل در ریشه اصلی پروژه قرار دارد و ماژول‌های برنامه در آن تعریف می شود. یک نمونه ساده از آن را می توانید مشاهده کنید.

include ':app'

در صورتی که شما هر ماژولی به برنامه خود اضافه کنید باید نام آن را در ادامه این فایل بنویسید.

دو: build.gradle سطح پروژه

این یک فایل سطح بالا است، همانگونه که در تصویر می‌بینید این فایل در ریشه پروژه قرار دارد. این فایل پیکربندی بر روی تمام ماژول‌ها اعمال می شود و همه ماژول‌ها به آن دسترسی دارند. در بلاک buildscript شما می توانید تمام مخازن و وابستگی‌های کل ماژول‌های خودتان را تعریف کنید. در بلاک allprojects شما می توانید تمام مخازنی که کل ماژول‌های پروژه به آنها نیاز دارند را تعریف کنید، برای مثال third-party ها، کتابخانه‌ها و…. یکی دیگر از قابلیت های جذاب این فایل پیکربندی بلاک ext‌ هست، که به شما اجازه می‌دهد پیکربندی خود را توسعه دهید. برای این کار شما در این بلاک متغییر هایی که نیاز دارید را تعریف می‌کنید و در دیگر قسمت‌های فایل‌های پیکربندی از این متغییرها استفاده می کنید.

ext {
    propertyName = 28
    ...
}
android{
    compileSdkVersion rootProject.ext.propertyName
    ...
}

سه: build.gradle سطح ماژول

این فایل پیکربندی در سطح ماژول است و در آدرس project/{module}/build.gradle قرار دارد. تنظیمات این فایل بر روی ماژول جاری اعمال می‌شود. این تنظیمات به شما اجازه می‌دهد تا ماژول سفارشی تولید کنید. برای مثال تنظیمات مربوط به flavor ها در این فایل نوشته می شود. در خط اول این فایل با دستور زیر به gradle معرفی می‌کنیم که این پیکربندی برای پلاگینی اندرویدی است. بلاک android که فقط خاص پروژه های اندروید است قابل شناسایی می‌شود. در این بلاک، پیکربندی ساخت ماژول را مشخص می کنیم.

apply plugin: 'com.android.application'

شما همچنین می‌توانید مخازن و وابستگی‌های مورد نیاز این ماژول را در این فایل پیکربندی بنویسید.

معرفی فایل‌های پیکربندی gradle:

یک: gradle.properties

این فایل برای پیکربندی gradle استفاده می‌شود. برای مثال داده‌های پراکسی، سایز رم مورد نیاز برای بیلد پروژه و… را در این فایل می توانید تنظیم کنید.

دو: local.properties

این فایل برای پیکربندی محیط بیلد پروژه است. برای مثال آدرس SDK و NDK در این فایل نوشته شده است.

همگام سازی پروژه:

در زمانی که شما تغییری در هر کدام از فایل های پیکربندی ایجاد کنید باید gradle را همگام سازی کنید. در بیشتر مواقع در بالای فایل های پیکربندی در نواری زرد رنگ عبارت Sync Now نمایش داده می شود که فقط لازم است بر روی آن کلیک کنید.

در صورتی که خواستید gradle را همگام سازی کنید و لینک فوق برای شما نمایش داده نشده بود میتوانی از نوار ابزار بر روی آیکن همگام سازی کلیک کنید تا پیکربندی شما همگام سازی شود.

منابع بیلد:

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

ساختار پیشفرض پروژه

src/main/

تغییر در منابع برای یک build type خاص

src/buildType/

تغییر در منابع برای یک flavor‌ خاص

src/productFlavor/

ترکیب یک build type و flavor

src/productFlavorBuildType/

ترکیب دو flavor

src/productFlavor1ProductFlavor2/

مثال:

src/main/
src/full/
src/debug/
src/fullDebug/

برای تغییر در build type و product flavor فعال اندروید استدیو میتونید از پنجره build variant‌ استفاده کنید.