سیستم ساخت Android منابع و کد منبع برنامه را کامپایل میکند و آنها را در فایلهای APK یا Android App Bundle بستهبندی میکند تا بتوانید آنها را آزمایش، مستقر، امضا، و توزیع کنید.
در نمای کلی ساخت Gradle و ساختار ساخت Android، مفاهیم ساخت و ساختار برنامه Android را بررسی کردیم. اکنون زمان پیکربندی ساخت است.
واژهنامه ساخت Android
Gradle و افزایه Android Gradle به شما کمک میکنند جنبههای زیر را در ساخت خود پیکربندی کنید:
- انواع ساخت
-
انواع ساخت ویژگیهای خاصی را تعریف میکنند که Gradle هنگام ساختن و بستهبندی برنامهتان از آنها استفاده میکند. انواع ساخت معمولاً برای مراحل مختلف چرخه حیات توسعه شما پیکربندی میشوند.
برای مثال، نوع ساخت اشکالزدایی گزینههای اشکالزدایی را فعال میکند و برنامه را با کلید اشکالزدایی امضا میکند، درحالیکه نوع ساخت نسخه پخش ممکن است برنامه شما را کوچک، مبهم، و با کلید نسخه پخش برای توزیع امضا کند.
برای ساختن برنامهتان باید حداقل یک نوع ساخت تعریف کنید. Android Studio بهطور پیشفرض انواع ساخت اشکالزدایی و انتشار را ایجاد میکند. برای شروع سفارشیسازی تنظیمات بستهبندی برای برنامهتان، با نحوه پیکربندی انواع ساخت آشنا شوید.
- نسخههای ویژه محصول
- نسخههای ویژه محصول نشاندهنده نسخههای مختلف برنامهتان است که میتوانید برای کاربران منتشر کنید، مثل نسخههای رایگان و پولی. میتوانید نسخههای ویژه محصول را سفارشیسازی کنید تا از کدها و منابع مختلف استفاده کنند و درعینحال بخشهایی را که در همه نسخههای برنامهتان مشترک است همرسانی و مجدداً استفاده کنید. نسخههای ویژه محصول اختیاری هستند و باید آنها را بهصورت دستی ایجاد کنید. برای شروع ایجاد کردن نسخههای مختلف برنامهتان، با نحوه پیکربندی نسخههای ویژه محصول آشنا شوید.
- تنوعهای ساخت
- تنوع ساخت محصولی متقاطع از نوع ساخت و نسخه ویژه محصول است و پیکربندیای است که Gradle برای ساختن برنامه شما استفاده میکند. بااستفاده از تنوع ساخت، میتوانید نسخه اشکالزدایی نسخههای ویژه محصولتان را درطول توسعه و نسخههای پخش امضاشده نسخههای ویژه محصولتان را برای توزیع بسازید. اگرچه تنوعهای ساخت را مستقیماً پیکربندی نمیکنید، اما انواع ساخت و نسخههای ویژه محصول را که آنها را تشکیل میدهند پیکربندی میکنید. ایجاد انواع ساخت یا نسخههای ویژه محصول بیشتر، تنوعهای ساخت بیشتری نیز ایجاد میکند. برای آشنایی با نحوه ایجاد و مدیریت تنوعهای ساخت، نمای کلی پیکربندی تنوعهای ساخت را بخوانید.
- ورودیهای مانیفست
- میتوانید مقادیر برخیاز ویژگیهای فایل مانیفست را در پیکربندی تنوع ساخت مشخص کنید. این مقادیر ساخت، مقادیر موجود در فایل مانیفست را لغو میکنند. این ویژگی زمانی مفید است که بخواهید چندین نوع مختلف از برنامهتان را با نام برنامه، حداقل نسخه کیت توسعه نرمافزار، یا نسخه کیت توسعه نرمافزار هدف متفاوت تولید کنید. وقتی چند مانیفست وجود داشته باشد، ابزار ادغام مانیفست تنظیمات مانیفست را ادغام میکند.
- وابستگیها
- سیستم ساخت وابستگیهای پروژه را از سیستم فایل محلی شما و از مخازن راه دور مدیریت میکند. این یعنی لازم نیست بهصورت دستی بستههای دودویی وابستگیهایتان را جستجو، بارگیری، و در دایرکتوری پروژهتان کپی کنید. برای کسب اطلاعات بیشتر، افزودن وابستگیهای ساخت را ببینید.
- درحال امضا کردن
- سیستم ساخت به شما امکان میدهد تنظیمات امضا را در پیکربندی ساخت مشخص کنید، و میتواند بهطور خودکار برنامهتان را درطول فرایند ساخت امضا کند. سیستم ساخت نسخه اشکالزدایی را با کلید و گواهی پیشفرض بااستفاده از اعتبارنامههای شناختهشده امضا میکند تا از درخواست گذرواژه در زمان ساخت جلوگیری شود. سیستم ساخت نسخه پخش را امضا نمیکند، مگر اینکه بهطور صریح پیکربندی امضا را برای این ساخت تعریف کنید. اگر کلید انتشار ندارید، میتوانید کلیدی را طبق آنچه در امضای برنامه توضیح داده شده است تولید کنید. برای توزیع برنامهها ازطریق اکثر فروشگاههای برنامه، ساختهای نسخه پخش امضاشده لازم است.
- کاهش منابع و کد
- سیستم ساخت به شما امکان میدهد فایل قوانین ProGuard متفاوتی را برای هر تنوع ساخت مشخص کنید. هنگام ساختن برنامه، سیستم ساخت مجموعه قوانین مناسب را برای کوچک کردن کد و منابع بااستفاده از ابزارهای کوچکسازی داخلی خود، مانند R8، اعمال میکند. کوچک کردن کد و منابع میتواند به کاهش اندازه APK یا AAB کمک کند.
- پشتیبانی از چند APK
- سیستم ساخت به شما امکان میدهد بهطور خودکار APKهای مختلفی بسازید که هرکدام فقط حاوی کد و منابع موردنیاز برای تراکم صفحهنمایش خاص یا «میانای دودویی کاربردی» (ABI) باشد. برای اطلاعات بیشتر، ساخت چند APK را ببینید. بااینحال، انتشار یک بسته App Bundle Android رویکرد توصیهشده است، زیرا علاوهبر تراکم صفحهنمایش و رابط دودویی نرمافزار، امکان تقسیم براساس زبان را نیز ارائه میدهد، و درعینحال نیاز به بارگذاری چندین آرتیفکت در Google Play را ازبین میبرد. همه برنامههای جدیدی که پساز اوت ۲۰۲۱ ارسال میشوند باید از AAB استفاده کنند.
نسخههای جاوا در ساختهای Android
چه کد منبع شما به زبان Java، Kotlin، یا هر دو نوشته شده باشد، چندین مکان وجود دارد که باید نسخه JDK یا زبان Java را برای ساخت خود انتخاب کنید. برای جزئیات، به نسخههای Java در ساختهای Android مراجعه کنید.
فایلهای پیکربندی ساخت
برای ایجاد پیکربندیهای ساخت سفارشی، باید در یک یا چند فایل پیکربندی ساخت تغییراتی ایجاد کنید. این فایلهای نوشتار ساده از یک زبان خاص دامنه (DSL) برای توصیف و دستکاری منطق ساخت بااستفاده از اسکریپت Kotlin استفاده میکنند که نوعی از زبان Kotlin است. همچنین میتوانید از Groovy که یک زبان پویا برای «ماشین مجازی جاوا» (JVM) است برای پیکربندی ساختهایتان استفاده کنید.
برای شروع پیکربندی ساخت خود نیازی به دانستن اسکریپت Kotlin یا Groovy ندارید زیرا افزایه Android Gradle بیشتر عناصر DSL موردنیازتان را معرفی میکند. برای آشنایی بیشتر با DSL افزایه Android Gradle، سند مرجع DSL را بخوانید. اسکریپت Kotlin به Gradle Kotlin DSL زیربنایی نیز متکی است
هنگام شروع پروژه جدید، Android Studio بهطور خودکار برخی از این فایلها را برای شما ایجاد میکند و آنها را براساس پیشفرضهای معقول پر میکند. برای نمای کلی فایلهای ایجادشده، به ساختار ساخت Android مراجعه کنید.
فایل Gradle Wrapper
پوشاننده Gradle (gradlew) برنامه کوچکی است که در کد منبع شما گنجانده شده است و خود Gradle را بارگیری و راهاندازی میکند.
این کار باعث میشود اجرای ساخت سازگارتر باشد. توسعهدهندگان منبع برنامه را بارگیری میکنند و gradlew را اجرا میکنند. این کار توزیع Gradle موردنیاز را بارگیری میکند و Gradle را برای ساختن برنامهتان راهاندازی میکند.
فایل gradle/wrapper/gradle-wrapper.properties
دارای ویژگی distributionUrl است که توضیح میدهد از کدام نسخه
Gradle برای اجرای ساخت شما استفاده میشود.
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
فایل تنظیمات Gradle
فایل settings.gradle.kts (برای Kotlin DSL) یا
فایل settings.gradle (برای Groovy DSL) در دایرکتوری ریشه پروژه
قرار دارد. این فایل تنظیمات، تنظیمات مخزن سطح پروژه را تعریف میکند و به Gradle اطلاع میدهد که هنگام ساختن برنامه شما، کدام پیمانهها را باید لحاظ کند. پروژههای چندپیمانهای باید هر پیمانهای را که باید در ساخت نهایی قرار گیرد مشخص کنند.
برای اکثر پروژهها، فایل بهطور پیشفرض بهصورت زیر است:
کاتلین
pluginManagement { /** * The pluginManagement.repositories block configures the * repositories Gradle uses to search or download the Gradle plugins and * their transitive dependencies. Gradle pre-configures support for remote * repositories such as JCenter, Maven Central, and Ivy. You can also use * local repositories or define your own remote repositories. Here we * define the Gradle Plugin Portal, Google's Maven repository, * and the Maven Central Repository as the repositories Gradle should use to look for its * dependencies. */ repositories { gradlePluginPortal() google() mavenCentral() } } dependencyResolutionManagement { /** * The dependencyResolutionManagement.repositories * block is where you configure the repositories and dependencies used by * all modules in your project, such as libraries that you are using to * create your application. However, you should configure module-specific * dependencies in each module-level build.gradle file. For new projects, * Android Studio includes Google's Maven repository and the Maven Central * Repository by default, but it does not configure any dependencies (unless * you select a template that requires some). */ repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() } } rootProject.name = "My Application" include(":app")
شیک
pluginManagement { /** * The pluginManagement.repositories block configures the * repositories Gradle uses to search or download the Gradle plugins and * their transitive dependencies. Gradle pre-configures support for remote * repositories such as JCenter, Maven Central, and Ivy. You can also use * local repositories or define your own remote repositories. Here we * define the Gradle Plugin Portal, Google's Maven repository, * and the Maven Central Repository as the repositories Gradle should use to look for its * dependencies. */ repositories { gradlePluginPortal() google() mavenCentral() } } dependencyResolutionManagement { /** * The dependencyResolutionManagement.repositories * block is where you configure the repositories and dependencies used by * all modules in your project, such as libraries that you are using to * create your application. However, you should configure module-specific * dependencies in each module-level build.gradle file. For new projects, * Android Studio includes Google's Maven repository and the Maven Central * Repository by default, but it does not configure any dependencies (unless * you select a template that requires some). */ repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() } } rootProject.name = "My Application" include ':app'
فایل ساخت سطح بالا
فایل build.gradle.kts سطح بالا (برای Kotlin DSL) یا
فایل build.gradle (برای Groovy DSL) در دایرکتوری ریشه پروژه
قرار دارد. این فایل معمولاً نسخههای رایج افزایههای مورداستفاده
توسط پیمانهها را در پروژهتان تعریف میکند.
نمونه کد زیر تنظیمات پیشفرض و عناصر DSL را در اسکریپت ساخت سطح بالا پساز ایجاد پروژه جدید شرح میدهد:
کاتلین
plugins { /** * Use `apply false` in the top-level build.gradle file to add a Gradle * plugin as a build dependency but not apply it to the current (root) * project. Don't use `apply false` in sub-projects. For more information, * see Applying external plugins with same version to subprojects. */ id("com.android.application") version "9.4.0" apply false id("com.android.library") version "9.4.0" apply false id("org.jetbrains.kotlin.android") version "2.4.10" apply false }
شیک
plugins { /** * Use `apply false` in the top-level build.gradle file to add a Gradle * plugin as a build dependency but not apply it to the current (root) * project. Don't use `apply false` in sub-projects. For more information, * see Applying external plugins with same version to subprojects. */ id 'com.android.application' version '9.4.0' apply false id 'com.android.library' version '9.4.0' apply false id 'org.jetbrains.kotlin.android' version '2.4.10' apply false }
فایل ساخت سطح واحد
فایل build.gradle.kts در سطح ماژول (برای Kotlin DSL) یا
build.gradle (برای Groovy DSL) در هر
دایرکتوری project/module/ قرار دارد. این فایل به شما امکان میدهد
تنظیمات ساخت را برای پیمانه خاصی که در آن قرار دارد پیکربندی کنید. پیکربندی این تنظیمات ساخت به شما امکان میدهد گزینههای بستهبندی سفارشی، مانند انواع ساخت اضافی و نسخههای ویژه محصول، را ارائه دهید و تنظیمات را در مانیفست برنامه main/ یا اسکریپت ساخت سطح بالا لغو کنید.
تنظیمات کیت توسعه نرمافزار Android
فایل ساخت سطح ماژول برای برنامه شما شامل تنظیماتی است که نشان میدهد نسخههای کیت توسعه نرمافزار Android هنگام کامپایل کردن، انتخاب رفتارهای پلاتفرم، و مشخص کردن حداقل نسخهای که برنامه شما روی آن اجرا میشود استفاده شده است.
-
compileSdk -
compileSdkتعیین میکند کدام میاناهای برنامهسازی کاربردی Android و Java هنگام کامپایل کردن کد منبع شما دردسترس هستند. برای استفاده از جدیدترین ویژگیهای Android، از جدیدترین کیت توسعه نرمافزار Android هنگام کامپایل کردن استفاده کنید.ممکن است برخیاز میاناهای برنامهسازی کاربردی پلاتفرم Android در سطوح قدیمیتر میانای برنامهسازی کاربردی دردسترس نباشند. میتوانید استفاده از ویژگیهای جدیدتر را بهطور مشروط محافظت کنید یا از کتابخانههای سازگاری AndroidX برای استفاده از ویژگیهای جدیدتر با سطوح پایینتر میانای برنامهسازی کاربردی Android استفاده کنید.
هر کیت توسعه نرمافزار Android زیرمجموعهای از میاناهای برنامهسازی کاربردی Java را برای استفاده در برنامهتان ارائه میدهد. جدول موجود در کدام میاناهای برنامهسازی کاربردی Java را میتوانم در کد منبع Java یا Kotlin استفاده کنم نشان میدهد که کدام سطح میانای برنامهسازی کاربردی Java براساس نسخه کیت توسعه نرمافزار Android دردسترس است. میاناهای برنامهسازی کاربردی جدیدتر Java در نسخههای قبلی Android ازطریق شکرزدایی پشتیبانی میشوند که باید در ساخت شما فعال شود.
اگر لازم است دربرابر سطح میانای برنامهسازی کاربردی فرعی خاصی کامپایل کنید، از نحو بلوک گسترشیافته
compileSdkاستفاده کنید وminorApiLevelرا مشخص کنید:کاتلین
android { compileSdk { version = release(36) { minorApiLevel = 1 } } }
شیک
android { compileSdk { version = release(36) { minorApiLevel = 1 } } }
اگر
compileSdkشما با نسخه فعلی Android Studio، AGP، یا الزامات وابستگی کتابخانه پروژهتان تداخل داشته باشد، Android Studio هشدار نمایش میدهد. -
minSdk -
minSdkپایینترین نسخه Android را که میخواهید برنامهتان از آن پشتیبانی کند مشخص میکند. تنظیمminSdkدستگاههایی را که میتوانند برنامه شما را نصب کنند محدود میکند.پشتیبانی از نسخههای پایینتر Android ممکن است به بررسیهای شرطی بیشتری در کد شما یا استفاده بیشتر از کتابخانههای سازگاری AndroidX نیاز داشته باشد. باید هزینه نگهداری پشتیبانی از نسخههای پایینتر را درمقابل درصد کاربرانی که هنوز از آن نسخههای پایینتر استفاده میکنند بسنجید. برای اطلاع از درصد استفاده از نسخه فعلی، نمودار نسخه را در جادوگر پروژه جدید در «استودیو Android» ببینید.
هنگام ویرایش کد در Android Studio یا اجرای بررسیها درطول ساخت، lint درباره میاناهای برنامهسازی کاربردی که استفاده میکنید و در
minSdkدردسترس نیستند هشدار میدهد. باید این موارد را با شرطی کردن ویژگیهای جدیدتر یا بااستفاده ازAppcompatبرای سازگاری با نسخه قدیمی برطرف کنید. -
targetSdk -
targetSdkدو هدف را دنبال میکند:- این ویژگی رفتار زمان اجرای برنامهتان را تنظیم میکند.
- این گواهی نشان میدهد که با کدام نسخه Android آزمایش کردهاید.
اگر برنامهتان را در دستگاهی اجرا کنید که از نسخه Android بالاتری نسبت به
targetSdkشما استفاده میکند، Android برنامهتان را در حالت سازگاری اجرا میکند که رفتاری مشابه نسخه پایینتر نشاندادهشده درtargetSdkشما دارد. برای مثال، وقتی API 23 مدل اجازههای زمان اجرا را معرفی کرد، همه برنامهها برای پذیرش فوری آن آماده نبودند. با تنظیمtargetSdkروی ۲۲، آن برنامهها میتوانند در دستگاههای دارای میانای برنامهسازی کاربردی ۲۳ بدون استفاده از اجازههای زمان اجرا اجرا شوند و میتوانند از ویژگیهای موجود در جدیدترین نسخهcompileSdkاستفاده کنند. خطمشی توزیع Google Play خطمشیهای بیشتری را بر سطح میانای برنامهسازی کاربردی هدف اعمال میکند.مقدار
targetSdkبه مقدارcompileSdkمتصل نیست. برای مثال، میتوانید مقدارtargetSdkرا داشته باشید که بیشتر، برابر، یا کمتر ازcompileSdkاست.
توجه: مقادیر compileSdk و targetSdk
لازم نیست یکسان باشند. اصول اولیه زیر را بهخاطر داشته باشید:
compileSdkبه شما امکان میدهد به میاناهای برنامهسازی کاربردی جدید دسترسی داشته باشید-
targetSdkرفتار زمان اجرای برنامهتان را تنظیم میکند
نمونه دستورگان ساختن ماژول برنامه
این نمونه اسکریپت ساخت ماژول برنامه Android برخیاز عناصر و تنظیمات پایه DSL را نشان میدهد:
کاتلین
/** * The first section in the build configuration applies the Android Gradle plugin * to this build and makes the android block available to specify * Android-specific build options. */ plugins { id("com.android.application") } /** * Locate (and possibly download) a JDK used to build your kotlin * source code. This also acts as a default for sourceCompatibility, * targetCompatibility and jvmTarget. Note that this does not affect which JDK * is used to run the Gradle build itself, and does not need to take into * account the JDK version required by Gradle plugins (such as the * Android Gradle Plugin) */ kotlin { jvmToolchain(11) } /** * The android block is where you configure all your Android-specific * build options. */ android { /** * The app's namespace. Used primarily to access app resources. */ namespace = "com.example.myapp" /** * compileSdk specifies the Android API level Gradle should use to * compile your app. This means your app can use the API features included in * this API level and lower. */ compileSdk = 36 /** * The defaultConfig block encapsulates default settings and entries for all * build variants and can override some attributes in main/AndroidManifest.xml * dynamically from the build system. You can configure product flavors to override * these values for different versions of your app. */ defaultConfig { // Uniquely identifies the package for publishing. applicationId = "com.example.myapp" // Defines the minimum API level required to run the app. minSdk = 23 // Specifies the API level used to test the app. targetSdk = 36 // Defines the version number of your app. versionCode = 1 // Defines a user-friendly version name for your app. versionName = "1.0" } /** * The buildTypes block is where you can configure multiple build types. * By default, the build system defines two build types: debug and release. The * debug build type is not explicitly shown in the default build configuration, * but it includes debugging tools and is signed with the debug key. The release * build type applies ProGuard settings and is not signed by default. */ buildTypes { /** * By default, Android Studio configures the release build type to enable code * shrinking, using minifyEnabled, and specifies the default ProGuard rules file. */ getByName("release") { isMinifyEnabled = true // Enables code shrinking for the release build type. proguardFiles( getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" ) } } /** * The productFlavors block is where you can configure multiple product flavors. * This lets you create different versions of your app that can * override the defaultConfig block with their own settings. Product flavors * are optional, and the build system does not create them by default. * * This example creates a free and paid product flavor. Each product flavor * then specifies its own application ID, so that they can exist on the Google * Play Store or an Android device simultaneously. * * If you declare product flavors, you must also declare flavor dimensions * and assign each flavor to a flavor dimension. */ flavorDimensions += "tier" productFlavors { create("free") { dimension = "tier" applicationId = "com.example.myapp.free" } create("paid") { dimension = "tier" applicationId = "com.example.myapp.paid" } } /** * To override source and target compatibility (if different from the * toolchain JDK version), add the following. All of these * default to the same value as kotlin.jvmToolchain. If you're using the * same version for these values and kotlin.jvmToolchain, you can * remove these blocks. */ //compileOptions { // sourceCompatibility = JavaVersion.VERSION_11 // targetCompatibility = JavaVersion.VERSION_11 //} //kotlinOptions { // jvmTarget = "11" //} } /** * The dependencies block in the module-level build configuration file * specifies dependencies required to build only the module itself. * To learn more, go to Add build dependencies. */ dependencies { implementation(project(":lib")) implementation("androidx.appcompat:appcompat:1.8.0") implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) }
شیک
/** * The first line in the build configuration applies the Android Gradle plugin * to this build and makes the android block available to specify * Android-specific build options. */ plugins { id 'com.android.application' } /** * Locate (and possibly download) a JDK used to build your kotlin * source code. This also acts as a default for sourceCompatibility, * targetCompatibility and jvmTarget. Note that this does not affect which JDK * is used to run the Gradle build itself, and does not need to take into * account the JDK version required by Gradle plugins (such as the * Android Gradle Plugin) */ kotlin { jvmToolchain 11 } /** * The android block is where you configure all your Android-specific * build options. */ android { /** * The app's namespace. Used primarily to access app resources. */ namespace 'com.example.myapp' /** * compileSdk specifies the Android API level Gradle should use to * compile your app. This means your app can use the API features included in * this API level and lower. */ compileSdk 36 /** * The defaultConfig block encapsulates default settings and entries for all * build variants and can override some attributes in main/AndroidManifest.xml * dynamically from the build system. You can configure product flavors to override * these values for different versions of your app. */ defaultConfig { // Uniquely identifies the package for publishing. applicationId 'com.example.myapp' // Defines the minimum API level required to run the app. minSdk 23 // Specifies the API level used to test the app. targetSdk 36 // Defines the version number of your app. versionCode 1 // Defines a user-friendly version name for your app. versionName "1.0" } /** * The buildTypes block is where you can configure multiple build types. * By default, the build system defines two build types: debug and release. The * debug build type is not explicitly shown in the default build configuration, * but it includes debugging tools and is signed with the debug key. The release * build type applies ProGuard settings and is not signed by default. */ buildTypes { /** * By default, Android Studio configures the release build type to enable code * shrinking, using minifyEnabled, and specifies the default ProGuard rules file. */ release { minifyEnabled true // Enables code shrinking for the release build type. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } /** * The productFlavors block is where you can configure multiple product flavors. * This lets you create different versions of your app that can * override the defaultConfig block with their own settings. Product flavors * are optional, and the build system does not create them by default. * * This example creates a free and paid product flavor. Each product flavor * then specifies its own application ID, so that they can exist on the Google * Play Store or an Android device simultaneously. * * If you declare product flavors, you must also declare flavor dimensions * and assign each flavor to a flavor dimension. */ flavorDimensions "tier" productFlavors { free { dimension "tier" applicationId 'com.example.myapp.free' } paid { dimension "tier" applicationId 'com.example.myapp.paid' } } /** * To override source and target compatibility (if different from the * tool chain JDK version), add the following. All of these * default to the same value as kotlin.jvmToolchain. If you're using the * same version for these values and kotlin.jvmToolchain, you can * remove these blocks. */ //compileOptions { // sourceCompatibility JavaVersion.VERSION_11 // targetCompatibility JavaVersion.VERSION_11 //} //kotlinOptions { // jvmTarget = '11' //} } /** * The dependencies block in the module-level build configuration file * specifies dependencies required to build only the module itself. * To learn more, go to Add build dependencies. */ dependencies { implementation project(":lib") implementation 'androidx.appcompat:appcompat:1.8.0' implementation fileTree(dir: 'libs', include: ['*.jar']) }
فایلهای ویژگیهای Gradle
Gradle همچنین شامل دو فایل ویژگی است که در فهرست راهنمای پروژه ریشه شما قرار دارند و میتوانید از آنها برای مشخص کردن تنظیمات خودِ کیت ابزار ساخت Gradle استفاده کنید:
-
gradle.properties - در اینجا میتوانید تنظیمات Gradle را برای کل پروژه پیکربندی کنید، مثلاً حداکثر اندازه پشته دیمون Gradle. برای اطلاعات بیشتر، به محیط ساخت مراجعه کنید.
-
local.properties -
ویژگیهای محیط محلی را برای سیستم ساخت پیکربندی میکند، ازجمله
موارد زیر:
ndk.dir- مسیر NDK. این ویژگی منسوخ شده است. هر نسخه بارگیریشده از NDK در فهرست راهنمایndkدر فهرست راهنمای کیت توسعه نرمافزار Android نصب میشود.sdk.dir- مسیر کیت توسعه نرمافزار Android.-
cmake.dir- مسیر CMake. ndk.symlinkdir- در Android Studio نسخه ۳.۵ و بالاتر، پیوند نمادینی به NDK ایجاد میکند که میتواند کوتاهتر از مسیر NDK نصبشده باشد.
تخصیص مجدد NDK به مسیر کوتاهتر (فقط Windows)
در Windows، ابزارهای موجود در پوشه NDK نصبشده، مانند ld.exe، درنهایت
مسیرهای طولانی دارند. این ابزارها از مسیرهای طولانی بهخوبی پشتیبانی نمیکنند.
برای ایجاد مسیر کوتاهتر، در local.properties، ویژگی
ndk.symlinkdir را تنظیم کنید تا از افزایه Android Gradle درخواست کند پیوند نمادین به
NDK ایجاد کند. مسیر آن پیوند نمادین میتواند کوتاهتر از پوشه NDK موجود باشد.
برای مثال، ndk.symlinkdir = C:\ منجر به پیوند نمادین زیر میشود:
C:\ndk\19.0.5232133
همگامسازی پروژه با فایلهای Gradle
وقتی در فایلهای پیکربندی ساخت در پروژهتان تغییراتی ایجاد میکنید، «استودیو Android» از شما میخواهد فایلهای پروژهتان را همگامسازی کنید تا بتواند تغییرات پیکربندی ساخت را وارد کند و چند بررسی انجام دهد تا مطمئن شود پیکربندی شما خطاهای ساخت ایجاد نمیکند.
برای همگامسازی فایلهای پروژه، روی همگامسازی در نوار اعلان که هنگام ایجاد تغییر ظاهر میشود کلیک کنید (همانطور که در شکل ۲ نشان داده شده است)، یا روی همگامسازی پروژه
در نوار منو کلیک کنید. اگر Android Studio خطایی در پیکربندی شما پیدا کند — برای مثال، کد منبع شما از ویژگیهای میانای برنامهسازی کاربردی استفاده میکند که فقط در سطح میانای برنامهسازی کاربردی بالاتر از compileSdkVersion شما دردسترس است — پنجره پیامها مشکل را شرح میدهد.
مجموعههای منبع
Android Studio کد منبع و منابع هر واحد را بهطور منطقی در مجموعههای منبع گروهبندی میکند. وقتی ماژول جدیدی ایجاد میکنید، Android Studio
مجموعه منبع main/ را در ماژول ایجاد میکند. مجموعه منبع
main/ یک ماژول شامل کد و منابعی است که توسط همه
تنوعهای ساخت آن استفاده میشود.
دایرکتوریهای مجموعه منبع اضافی اختیاری هستند و Android Studio هنگام پیکربندی تنوعهای ساخت جدید، آنها را بهطور خودکار برای شما ایجاد نمیکند. بااینحال، ایجاد کردن مجموعههای منبع، مشابه main/، به سازماندهی فایلها و منابعی کمک میکند که Gradle فقط باید هنگام ساختن نسخههای خاصی از برنامهتان استفاده کند:
-
src/main/ - این مجموعه منبع شامل کد و منابع مشترک برای همه تنوعهای ساخت است.
-
src/buildType/ - این مجموعه منبع را ایجاد کنید تا کد و منابع را فقط برای نوع ساخت خاصی دربرگیرد.
-
src/productFlavor/ -
این مجموعه منبع را ایجاد کنید تا کد و منابع را فقط برای نسخه ویژه محصول خاصی
دربرگیرد.
توجه: اگر ساخت خود را برای ترکیب چند نسخه ویژه محصول پیکربندی کنید، میتوانید برای هر ترکیب از نسخههای ویژه محصول بین ابعاد نسخه ویژه، دایرکتوریهای مجموعه منبع ایجاد کنید:
src/productFlavor1ProductFlavor2/. -
src/productFlavorBuildType/ - این مجموعه منبع را ایجاد کنید تا کد و منابع را فقط برای یک تنوع ساخت خاص دربرگیرد.
برای مثال، برای تولید نسخه «fullDebug» برنامهتان، سیستم ساخت کد، تنظیمات، و منابع را از مجموعههای منبع زیر ادغام میکند:
-
src/fullDebug/(مجموعه منبع تنوع ساخت) -
src/debug/(مجموعه منبع نوع ساخت) -
src/full/(مجموعه منبع نسخه ویژه محصول) -
src/main/(مجموعه منبع اصلی)
توجه: وقتی فایل یا فهرست راهنمای جدیدی در Android Studio ایجاد میکنید، از گزینههای منو فایل > جدید برای ایجاد آن برای مجموعه منبع خاصی استفاده کنید. مجموعههای منبعی که میتوانید از بین آنها انتخاب کنید براساس پیکربندیهای ساخت شما هستند و Android Studio بهطور خودکار دایرکتوریهای موردنیاز را درصورت عدم وجود ایجاد میکند.
اگر مجموعههای منبع مختلف حاوی نسخههای متفاوتی از یک فایل باشند، Gradle هنگام تصمیمگیری درباره اینکه از کدام فایل استفاده کند، از ترتیب اولویت زیر استفاده میکند. مجموعههای منبع در سمت چپ، فایلها و تنظیمات مجموعههای منبع در سمت راست را لغو میکنند:
تنوع ساخت > نوع ساخت > نسخه ویژه محصول > مجموعه منبع اصلی > وابستگیهای کتابخانه
این کار به Gradle اجازه میدهد از فایلهایی استفاده کند که مختص تنوع ساختی است که میخواهید بسازید و درعینحال از فعالیتها، منطق برنامه، و منابعی که با نسخههای دیگر برنامهتان مشترک است دوباره استفاده کند.
هنگام ادغام کردن چند مانیفست، Gradle از همان ترتیب اولویت استفاده میکند تا هر تنوع ساخت بتواند مؤلفهها یا اجازههای مختلفی را در مانیفست نهایی تعریف کند. برای کسب اطلاعات بیشتر درباره ایجاد مجموعه منبع سفارشی، ایجاد مجموعه منبع را بخوانید.
کاتالوگهای نسخه
اگر ساخت شما حاوی چندین ماژول با وابستگیهای مشترک است، یا اگر چندین پروژه مستقل با وابستگیهای مشترک دارید، توصیه میکنیم که از کاتالوگ نسخه یا صورت مواد (BOM) برای مشخص کردن نسخههای مشترک استفاده کنید.
سیستمهای ساخت دیگر
ساختن برنامههای Android با Bazel امکانپذیر است اما بهطور رسمی پشتیبانی نمیشود. «استودیو Android» بهطور رسمی از پروژههای Bazel پشتیبانی نمیکند.
برای درک بهتر محدودیتهای فعلی ساخت با Bazel، مشکلات شناختهشده را ببینید.