آموزش استفاده از gradle برای build کردن پروژهها

gradle ابزاری است که برای build کردن استفاده میشود. در سادهترین حالت اگر بخواهید یک پروژه جاوا را build کنید میتوانید فایلهای با پسوند java را به کامپایلر جاوا (javac) بدهید تا آنها را به بایت کدهایی که در فایلهای با پسوند class ذخیره میشوند تبدیل کند. در نهایت هم میتوانید منابعی که در پروژه استفاده شده مثل عکس و متن را به همراه بایت کدها در یک فایل jar پکیج کنید. یک چنین روشی تازه اگر براش اسکریپت هم نوشته بشه که نخواد دستی انجام بشه شاید برای پروژههای کوچک دانشجویی مناسب به نظر بیاد ولی قطعا در پروژههای بزرگ که کارهای زیادی هنگام build کردن پروژه انجام میشود منطقی نیست. در پروژههای واقعی و بزرگ هنگام build کردن لازم است که برای مثال یه سری وابستگیها دانلود بشن، تستهایی پاس بشن، اونجاهایی که امکانش هست حجم فایل نهایی کم بشه و خیلی کارهای دیگه که برای انجامش وجود یک ابزار ضروری است. android studio از gradle به عنوان ابزار استفاده میکند و کل کارهای مربوط به build کردن پروژه را به آن منتقل میکند.
وقتی پروژهای را با اندروید استودیو ایجاد میکنیم دو تا فایل build.gradle در قسمت Gradle Scripts دیده میشوند که یکی در سطح پروژه است و دیگری در سطح ماژول. هر پروژه در اندروید استودیو میتواند یک یا چند ماژول داشته باشد. ماژولها انواع مختلفی دارند برای مثال اپ موبایل و تبلت، اپ برای ساعتهای هوشمند، اپ برای تلوزیونها، کتابخانه و غیره همگی نمونههایی از ماژولها هستند. یک نمونه ساده از فایل build.gradle سطح پروژه به صورت زیر است.
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.3.3' } } allprojects { repositories { jcenter() } } task clean(type: Delete) { delete rootProject.buildDir }
این فایل چون در سطح پروژه است gradle برای build کردن هر یک از ماژولها ازش استفاده میکند. همان طور که مشاهده میشود زبانی که برای نوشتن اسکریپت استفاده شده یه چیزی شبیه JSON است که بهش میگن DSL (Domain Specific Language). به هر قسمت که با علامت {} جدا میشود یک بلاک میگویند. داخل هر بلاک میتونه property،method و یا یه سری بلاکهای دیگه نوشته بشود.
Android Plugin
هر plugin در gradle در واقع مثل کتابخانه هایی است که در برنامهنویسی ازشون استفاده میکنیم. plugin اندروید که توسط گوگل توسعه داده شده امکاناتی را برای build کردن پروژههای اندروید در اختیار ما قرار میدهد. plugin ها میتوانند DSL را نیز توسعه دهند یعنی مثلا یه سری method و یا بلاکهای جدید تعریف کنند که شما با توجه به نیازتون ازشون استفاده کنید. بعد از اضافه شدن plugin اندروید هست که کد زیر معنی پیدا میکنه در غیر این صورت بلاک android و هر چی داخلش نوشته شده بی معنی خواهد بود پروسه build با خطا مواجه میشود.
apply plugin: 'com.android.application' android { compileSdkVersion 25 buildToolsVersion "25.0.3" defaultConfig { applicationId "com.google.myapplication" minSdkVersion 14 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } }
توضیحات مربوط به برخی از دستورها
repositories و dependencies : در پروژههای واقعی معمولا بیشتر از ۱۰ کتابخانه استفاده میشود. برای اضافه کردن کتابخانهها به پروژه یک راه این است که فایلهای jar را دانلود کنیم و هر وقت کتابخانهای آپدیت میشود آخرین ورژنش را پیدا کنیم و با ورژن قبلی جایگزین کنیم. ولی gradle برای اضافه کردن کتابخانهها و در حالت کلی وابستگیها به پروژه راه حل بهتری دارد :-). اکثر کتابخانههایی که توسعه داده میشوند و ما میتوانیم در پروژههایمان ازشون استفاده کنیم تو اینترنت و از طریق repository ها قابل دریافت هستند. دو repository معروف که معمولا برنامهنویسها کتابخانههایشان را آنجا آپلود میکنند jcenter و maven central هستند. هر آیتمی که توی repository گذاشته میشود با یک شناسهای میتواند بازیابی بشود. برای اضافه کردن یک وابستگی خاص به پروژه اسم repository مربوط به آن را در بلاک repositories مینویسیم و شناسهای را که با آن بازیابی میشود در بلاک dependencies مینویسیم gradle خودش کار دانلود را انجام میدهد.
buildscript : توی بلاک buildscript چیزهایی نوشته میشود که خود gradle بهشون احتیاج داره. مثلا برای اضافه کردن plugin ها repository و dependency مربوط به آن توی این بلاک نوشته میشود و در نهایت هم از apply plugin برای اضافه کردن plugin استفاده میشود. به عنوان نمونه برای اضافه کردن plugin اندروید کد زیر به فایل build.gradle سطح پروژه اضافه شده و در ماژولهای اندرویدی هم apply plugin: com.android.application نوشته شده است.
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.3.3' } }
در ادامه به تعدادی از بلاکهایی که مختص پروژههای اندروید هستند میپردازیم. برای رفرنس کامل میتوانید به اینجا مراجعه کنید.
buildTypes : آشناترین build type ها debug و release هستند که هر پروژه اندروید به طور پیش فرض آنها را دارد. برای مثال میتوانید در حالت دیباگ استفاده از progaurd رو غیر فعال کنید تا سرعت build افزایش پیدا کند یا اینکه در حالت دیباگ یک پسوند به applicationId اضافه کنید تا دو نسخه دیباگ و ریلیز رو هم زمان بتونید روی یک گوشی داشته باشید.
productFlavors : فرض کنید میخواهید دو نسخه از اپلیکیشن داشته باشید یکی رایگان که تبلیغات نشان میدهد و دیگری پولی که تبلیغات نشان نمیدهد. یا یک نسخه برای ورژن هایی پایین اندروید و دیگری برای ورژنهای بالای اندروید. این کارها با استفاده از بلاک productFlavors امکان پذیر است. برای توضیحات بیشتر بخش آشنایی با build variants را با دقت مطالعه کنید و اگر سوالی داشتید حتما کامنت بزارید.
buildToolsVersion : ورژن کامپایلری که برای کامپایل کردن کدها استفاده میشود.
gradle-wrapper
با استفاده از gradle-wrapper برای اینکه gradle بخواهد کار build رو انجام بدهد حتما لازم نیست روی سیستم نصب باشد. این ویژگی مخصوصا وقتی یک تیم دارند روی یک پروژه کار میکنند خیلی مفید است. wrapper از یک اسکریپت،یک فایل jar و یک فایل به اسم gradle-wrapper.properties تشکیل شده است و با استفاده از فرمان gradlew شروع به کار میکند. اول چک میکند که آیا نسخه gradle مشخص شده در فایل properties روی سیستم وجود دارد یا نه اگر وجود نداشته باشد ابتدا آن را دانلود کرده و سپس با کمک آن کار build را انجام میدهد. اندروید استودیو برای build از wrapper استفاده میکند. وقتی یک تیم دارند روی پروژه کار میکنند استفاده از wrapper گارانتی میکند که همه اعضای تیم از یه نسخه gradle برای build استفاده خواهند کرد چرا که همه فایلهای مربوط به wrapper هم ورژن کنترل میشوند ( این قسمت ممکنه برای افرادی که از ورژن کنترلها تا حالا استفاده نکردهاند مبهم باشه سوالی پیش اومد حتما کامنت بزارید)
آشنایی با build variants
استفاده از build variants هنگام کار کردن روی پروژههای اندروید مهم و پرکاربرد است. build variants از ترکیب build types و product flavours به دست میآید. اگر شما دو تا build type داشته باشید و دو تا product flavar در مجموع چهار تا build variant خواهید داشت که به طور اتوماتیک ایجاد شده و در قسمت Build Variants اندروید استودیو مشاهده میشوند. اگر هیچ product flavar ای تعریف نکرده باشید و فقط دو تا build type به عنوان دیباگ و ریلیز داشته باشید آنگاه دو تا build variant با همان عنوان های دیباگ و ریلیز خواهید داشت. وقتی دارید یک پروژه را build میکنید در حقیقت دارید یکی از build variant های آن را build میکنید(چون حتما یکی در قسمت Build Variants اندروید استودیو انتخاب شده است). قبل از اینکه ادامه مطلب رو بخونید پیشنهاد میکنم حتما یه پروژه جدید با اندروید استودیو بسازید، قسمت Build Variants رو که به طور پیش فرض پایین سمت چپ واقع شده ملاحظه کنید. کد زیر رو در بلاک android اضافه کرده و gradle رو sync کنید. دوباره قسمت Build Variants رو چک کنید و ببینید چه گزینههایی اضافه شدند. هر چی دلتون میخواد با این build type و product flavar بازی کنید و تغییرات رو ببینید تا دستتون بیاد جریان چیه.
productFlavors { free { } prod { } }
فرض کنید میخوام دو تا نسخه از اپلیکیشن منتشر کنم یکی رایگان است که پایین صفحاتش تبلیغات نشون داده میشه و یکی پولی که تبلیغات نداره. برای ورژن پولی لازم دارم که قسمت مربوط به تبلیغات رو از پایین layout ها حذف کنم برای اینکار میتونم layout های جدید برای ورژن پولی درست کنم و آنها را در پوشه src/paid/res/layout قرار بدهم. بله درست متوجه شدید توی پوشه src که در حالت پیش فرض پوشههای main، test و androidTest وجود دارند میتواند به ازای هر build type، product flavar و build variant هم پوشه وجود داشته باشد و سورس های جداگانه توش قرار بگیرند. توی مثالی که زدم شما اگر هر build variant ای که توی اسمش paid داشته باشه رو build کنید از layout های موجود در پوشه paid استفاده میشود. اینکار برای کدها هم قابل انجام است فقط کافی است فایلهای جاوا رو با همون ساختار پیکیجی که دارند توی پوشه مربوطه قرار بدید.
دوستان عزیز هر سوالی که براتون پیش اومد خوشحال میشم کامنت بزارید و بپرسید انشالله که بتونم پاسخگو باشم. شاد و سرحال باشید 🙂
Notice: Undefined variable: post_id in /home/codeinto/domains/codeintouch.com/public_html/wp-content/themes/studiare/inc/templates/blog/related-carousel.php on line 5
مطالب زیر را حتما مطالعه کنید
آموزش استفاده از git برای ورژن کنترل
پیاده سازی انیمیشن پشت و رو کردن کارت
جایگزین کردن AsyncTask با rxjava به منظور پیاده سازی multithreading
حافظه داخلی و حافظه خارجی در اندروید به زبان ساده
پیاده سازی معماری MVVM در اندروید با استفاده از ViewModel و LiveData
آموزش RxJava یا برنامه نویسی reactive در اندروید
10 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
درود، خدا قوت مطلب مفیدی بود واقعا اما برای بنده از وقتی که نسخه جدید اندروید استدیو منتشر شد برای بنده پیش اومد که این ارور میده موقع سینک پروژه Protocol family unavailable
و هر چی تو اینترنت سرچ میکنم میگن بخاطر خوب دانلود نشدن فایل گریدل هست و من خودم رفتم سایت گریدل و از اونجا نسخه آخر دانلود کردم و در محل اصلی کپی کردم و فایل قبلی پاک کردم و جالبه بازم همون ارور قبل داد و تا الآن هر کاری کردم نشده و این که از vpn استفاده میکنم و نسخه اندروید استدیو بنده ۳٫۱٫۲ و نسخه JDK 10 هست ممنون میشم کمک کنید.
سلام آقا نوید
خطایی که مگیرید رو اسکرین شاتشو برام ایمیل کنید آدرس ایمیل fahime.s.ghasemi@gmail.com
سلام خسته نباشید من یه مشکلی توی build اندروید استودیوم هست.میشه جواب بدین):
سلام
مشکلتون رو همینجا اگه بنویسید بهتره شاید برای بقیه دوستان هم سوال باشه و بتونن استفاده کنن. میتونید از خطایی که تو تب messages در اندروید استودیو میگیرید هم برام اسکرین شات ایمیل کنید. آدرس ایمیل fahime.s.ghasemi@gmail.com
سلام دوستان عزیز
این چند روز به یه مشکل برخورد کردم که نمی تونم برطرفش کنم اگه امکانش هست کمکم کنید
مشکل اینه :
یه برنامه اندروید رو کامل نوشتیم فایل APK برنامه رو به مشتری تحویل دادیم برای تست ولی روی گوشیش نصب نمیشه و ارور app not installed رو می ده
تمام کارای لازمه رو که تو اینترنت سرچ کرده بودم رو دوباره انجام دادم ولی بازم ارور میده
برنامه رو چنتا گوشی تست کردم جواب میده ولی روی گوشی مشتری که سامسونگ s10 plus ارور میده
ممنون میشم سریع تر کمکم کنید.
سلام دوست عزیز
من واقعا شرمنده شدم که پاسخ شما رو دیر دارم میفرستم براتون. اگه پاسخ سوالی رو میخواین سریع بدونین به اکانت تلگرام پیام بدید که زودتر جواب سوالتونو بگیرین. مشکل نصب نشدن apk در بعضی از گوشی ها خیلی رایج هست. این چند تا دلیل داره ممکنه که قبلا یه نسخه ای از اپ شما روی گوشی مشتری نصب شده که با یه کلید دیگری sign شده که باید بهشون بگین که اگه ورژن قدیمی دارن uninstall کنن و بعد اپ جدید رو نصب کنن. ممکنه حافظه گوشی مشتری پر شده و خودش متوجه نیست. ممکنه فایل apk موقع دانلود خوب دانلود نشده باشه و به اصطلاح corrupt شده باشه و باید دوباره با یه راه دیگه براشون فایل رو بفرستین. ممکنه شما نسخه دیباگ براشون فرستاده باشین و apk رو sign نکرده باشین و گوشی مشتری طوری تنظیم شده باشه که apk های sign نشده روش نصب نشن که خب باید sign کنین و براشون بفرستین.
Unable to resolve dependency for ‘:app@debug/compileClasspath’: Could not resolve com.android.support:appcompat-v7:26.1.0.
Open FileShow Details
Unable to resolve dependency for ‘:app@debugAndroidTest/compileClasspath’: Could not resolve com.android.support:appcompat-v7:26.1.0.
Open FileShow Details
Unable to resolve dependency for ‘:app@debugUnitTest/compileClasspath’: Could not resolve com.android.support:appcompat-v7:26.1.0.
Open FileShow Details
Unable to resolve dependency for ‘:app@release/compileClasspath’: Could not resolve com.android.support:appcompat-v7:26.1.0.
Open FileShow Details
Unable to resolve dependency for ‘:app@releaseUnitTest/compileClasspath’: Could not resolve com.android.support:appcompat-v7:26.1.0.
Open FileShow Details
وقتی در اندروید استودیو تری اگین میزنم این بیام ها رو میده …… چیکار کنم؟
سلام این خطا در gradle اندروید دلایل مختلفی داره اینطوری راحت نمیشه پاسخ داد. برای راهنمایی درباره همچین خطاهایی به اکانت تلگرام بنده میتونین پیام بدین
دمتون گرم
کمتر کسی چیزی در اینباره نوشته
ممنون که دانشتون رو به اشتراک گذاشتید
سلام لطف دارید انشالله که مفید باشه