سیستم ساخت Gradle در Android Studio به شما امکان میدهد تا باینریهای خارجی یا سایر ماژولهای کتابخانه را بهعنوان وابستگی به ساخت خود اضافه کنید. وابستگیها میتوانند در دستگاه شما یا در مخزن راه دور قرار داشته باشند و هرگونه وابستگی انتقالی که اعلام میکنند نیز بهطور خودکار گنجانده میشود. این صفحه نحوه استفاده از وابستگیها را با پروژه Android شما شرح میدهد، ازجمله جزئیات درباره رفتارها و پیکربندیهایی که مختص افزایه Android Gradle (AGP) است. برای راهنمای مفهومی عمیقتر درباره وابستگیهای Gradle، راهنمای Gradle برای مدیریت وابستگی را ببینید، اما بهخاطر داشته باشید که پروژه Android شما باید فقط از پیکربندیهای وابستگی تعریفشده در این صفحه استفاده کند.
افزودن وابستگی کتابخانه یا افزونه
بهترین راه برای افزودن و مدیریت وابستگیهای ساخت، استفاده از کاتالوگهای نسخه است، روشی که پروژههای جدید بهطور پیشفرض استفاده میکنند. این بخش رایجترین انواع پیکربندیهای مورداستفاده برای پروژههای Android را پوشش میدهد؛ برای گزینههای بیشتر، به اسناد Gradle مراجعه کنید. برای نمونهای از برنامهای که از کاتالوگهای نسخه استفاده میکند، اکنون در Android را ببینید. اگر ازقبل وابستگیهای ساخت را بدون کاتالوگهای نسخه راهاندازی کردهاید و پروژه چندپیمانهای دارید، توصیه میکنیم انتقال دهید.
برای راهنمایی درباره افزودن و مدیریت وابستگیهای بومی (غیررایج)، به وابستگیهای بومی مراجعه کنید.
در مثال زیر، یک وابستگی دودویی ازراهدور (کتابخانه Jetpack Macrobenchmark)، وابستگی ماژول کتابخانه محلی (myLibrary)، و یک وابستگی افزونه (افزونه Android Gradle) به پروژه اضافه شده است. مراحل کلی برای افزودن این وابستگیها به پروژهتان در اینجا آمده است:
در بخش
[versions]فایل کاتالوگ نسخه، کهlibs.versions.tomlنام دارد (در فهرستgradleدر نمای پروژه یا اسکریپتهای Gradle در نمای Android)، نام مستعاری برای نسخه وابستگی موردنظرتان اضافه کنید:[versions] agp = "8.3.0" androidx-macro-benchmark = "1.2.2" my-library = "1.4" [libraries] ... [plugins] ...نامهای مستعار میتوانند شامل خط تیره یا زیرخط باشند. این نامهای مستعار مقادیر تودرتویی تولید میکنند که میتوانید در اسکریپتهای ساخت به آنها ارجاع دهید. مرجعها با نام کاتالوگ شروع میشوند، بخش
libsازlibs.versions.toml. هنگام استفاده از کاتالوگ تکنسخهای، توصیه میکنیم مقدار پیشفرض «libs» را حفظ کنید.در بخشهای
[libraries](برای باینریهای راه دور یا ماژولهای کتابخانه محلی) یا[plugins](برای افزایهها) در فایلlibs.versions.toml، نام مستعاری برای وابستگی اضافه کنید.[versions] ... [libraries] androidx-benchmark-macro = { group = "androidx.benchmark", name = "benchmark-macro-junit4", version.ref = "androidx-macro-benchmark" } my-library = { group = "com.myapplication", name = "mylibrary", version.ref = "my-library" } [plugins] androidApplication = { id = "com.android.application", version.ref = "agp" }برخیاز کتابخانهها در «فهرست مواد» (BOM) منتشرشدهای دردسترس هستند که خانوادههای کتابخانهها و نسخههای آنها را گروهبندی میکند. میتوانید BOM را در کاتالوگ نسخه و فایلهای ساخت خود بگنجانید و اجازه دهید آن نسخهها را برای شما مدیریت کند. برای جزئیات، به استفاده از فهرست مواد مراجعه کنید.
ارجاعی به نام مستعار وابستگی به اسکریپت ساخت ماژول(هایی) که به وابستگی نیاز دارند اضافه کنید. هنگام ارجاع به نام مستعار از اسکریپت ساخت، زیرخطها و خط تیرههای آن را به نقطه تبدیل کنید. اسکریپت ساخت سطح ماژول ما به این شکل خواهد بود:
کاتلین
plugins { alias(libs.plugins.androidApplication) } dependencies { implementation(libs.androidx.benchmark.macro) implementation(libs.my.library) }
شیک
plugins { alias 'libs.plugins.androidApplication' } dependencies { implementation libs.androidx.benchmark.macro implementation libs.my.library }
ارجاعهای افزونه شامل
pluginsبعداز نام کاتالوگ است و ارجاعهای نسخه شاملversionsبعداز نام کاتالوگ است (ارجاعهای نسخه رایج نیستند؛ برای نمونههایی از ارجاعهای نسخه، به وابستگیها با شماره نسخه یکسان مراجعه کنید). ارجاعهای کتابخانه شامل شناسهlibrariesنیستند، بنابراین نمیتوانید ازversionsیاpluginsدر ابتدای نام مستعار کتابخانه استفاده کنید.
پیکربندی وابستگیها
درون بلوک dependencies، میتوانید وابستگی کتابخانه را بااستفاده از یکی از چند پیکربندی وابستگی مختلف (مانند implementation که قبلاً نشان داده شد) اعلام کنید. هر پیکربندی وابستگی دستورالعملهای متفاوتی درباره نحوه استفاده از وابستگی به Gradle ارائه میدهد. جدول زیر هریک از پیکربندیهایی را که میتوانید برای وابستگی در پروژه Android خود استفاده کنید شرح میدهد.
| پیکربندی | رفتار |
|---|---|
implementation |
Gradle وابستگی را به مسیر کلاس کامپایل اضافه میکند و
وابستگی را به خروجی ساخت بستهبندی میکند. وقتی
واحد شما وابستگی implementation را پیکربندی میکند،
به Gradle اطلاع میدهد که نمیخواهید واحد در زمان ترجمه،
وابستگی را به واحدهای دیگر نشت دهد. یعنی وابستگی برای پیمانههای دیگری که به پیمانه فعلی وابسته هستند دردسترس قرار نمیگیرد.
استفاده از این پیکربندی وابستگی بهجای
|
api |
Gradle وابستگی را به مسیر کلاس کامپایل و خروجی ساخت اضافه میکند. وقتی یک ماژول شامل وابستگی api است، به Gradle اطلاع میدهد که ماژول میخواهد آن وابستگی را بهصورت گذرا به ماژولهای دیگر صادر کند تا در زمان اجرا و زمان ترجمه برای آنها دردسترس باشد.
از این پیکربندی با احتیاط و فقط با وابستگیهایی استفاده کنید که
باید بهصورت انتقالی به دیگر مصرفکنندگان بالادستی صادر کنید. اگر
وابستگی |
compileOnly |
Gradle وابستگی را فقط به مسیر کلاس کامپایل اضافه میکند
(یعنی به خروجی ساخت اضافه نمیشود). این زمانی مفید است که
درحال ایجاد یک ماژول Android هستید و درطول کامپایل به وابستگی نیاز دارید،
اما وجود آن در زمان اجرا اختیاری است. برای مثال، اگر به کتابخانهای وابسته هستید که فقط شامل حاشیهنویسیهای زمان ترجمه است (معمولاً برای تولید کد استفاده میشود اما اغلب در خروجی ساخت گنجانده نمیشود)، میتوانید آن کتابخانه را compileOnly علامتگذاری کنید.
اگر از این پیکربندی استفاده میکنید، واحد کتابخانه شما باید شامل یک شرط زمان اجرا باشد تا بررسی کند که آیا وابستگی دردسترس است یا نه، و سپس رفتار خود را بهطور مناسب تغییر دهد تا درصورت عدم ارائه وابستگی، همچنان بتواند کار کند. این کار به کاهش اندازه برنامه نهایی کمک میکند، زیرا وابستگیهای گذرا را که حیاتی نیستند اضافه نمیکند.
توجه: نمیتوانید از پیکربندی |
runtimeOnly |
Gradle وابستگی را فقط به خروجی ساخت اضافه میکند تا درطول زمان اجرا استفاده شود. یعنی به مسیر کلاس کامپایل اضافه نمیشود.
این مورد بهندرت در Android استفاده میشود، اما معمولاً در برنامههای سرور برای ارائه پیادهسازیهای ثبت استفاده میشود. برای مثال، یک کتابخانه میتواند از میانای برنامهنویسی کاربردی ثبت وقایع استفاده کند که شامل پیادهسازی نباشد. مصرفکنندگان آن کتابخانه میتوانند آن را بهعنوان وابستگی
implementation اضافه کنند و وابستگی
runtimeOnly را برای پیادهسازی واقعی ثبت گزارش
برای استفاده اضافه کنند.
|
ksp |
این پیکربندیها کتابخانههایی را ارائه میدهند که حاشیهنویسیها و سایر نمادها را در کد شما قبلاز کامپایل شدن پردازش میکنند. این ابزارها معمولاً کد شما را اعتبارسنجی میکنند یا کد اضافی تولید میکنند و درنتیجه کدی را که باید بنویسید کاهش میدهند. برای افزودن چنین وابستگیای، باید آن را بااستفاده از پیکربندیهای افزونه Android Gradle فرض میکند که وابستگی پردازشگر گزارمان است اگر فایل JAR آن حاوی فایل زیر باشد:
اگر افزونه پردازشگر گزارمانی را در مسیر کلاس کامپایل شناسایی کند، خطای ساخت ایجاد میکند.
هنگام تصمیمگیری درباره اینکه از کدام پیکربندی استفاده کنید، موارد زیر را درنظر بگیرید:
برای اطلاعات بیشتر درباره استفاده از پردازشگرهای گزارمان، به افزودن پردازشگرهای گزارمان مراجعه کنید. |
lintChecks |
از این پیکربندی برای گنجاندن کتابخانهای حاوی بررسیهای lint استفاده کنید که میخواهید Gradle هنگام ساختن پروژه برنامه Android شما اجرا کند. توجه داشته باشید که AARهایی که حاوی فایل |
lintPublish |
از این پیکربندی در پروژههای کتابخانه Android استفاده کنید تا بررسیهای lint را که میخواهید Gradle در فایل lint.jar کامپایل کند و در AAR شما بستهبندی کند، اضافه کنید. این کار باعث میشود پروژههایی که از AAR شما استفاده میکنند، آن بررسیهای lint را نیز اعمال کنند. اگر قبلاً از پیکربندی وابستگی lintChecks برای گنجاندن بررسیهای lint در AAR منتشرشده استفاده میکردید، باید آن وابستگیها را منتقل کنید تا بهجای آن از پیکربندی lintPublish استفاده کنید.
کاتلینdependencies { // Executes lint checks from the ":checks" project at build time. lintChecks(project(":checks")) // Compiles lint checks from the ":checks-to-publish" into a // lint.jar file and publishes it to your Android library. lintPublish(project(":checks-to-publish")) } شیکdependencies { // Executes lint checks from the ':checks' project at build time. lintChecks project(':checks') // Compiles lint checks from the ':checks-to-publish' into a // lint.jar file and publishes it to your Android library. lintPublish project(':checks-to-publish') } |
پیکربندی وابستگیها برای یک تنوع ساخت خاص
همه پیکربندیهای قبلی وابستگیها را بر همه تنوعهای ساخت اعمال میکنند. اگر درعوض میخواهید وابستگی را فقط برای مجموعه منبع تنوع ساخت خاص یا برای مجموعه منبع آزمایشی اعلام کنید، باید نام پیکربندی را با حروف بزرگ بنویسید و نام تنوع ساخت یا مجموعه منبع آزمایشی را بهعنوان پیشوند به آن اضافه کنید.
برای مثال، برای افزودن وابستگی دودویی ازراهدور فقط به نسخه ویژه محصول «رایگان» خود بااستفاده از پیکربندی implementation، از این استفاده کنید:
کاتلین
dependencies { freeImplementation("com.google.firebase:firebase-ads:21.5.1") }
شیک
dependencies { freeImplementation 'com.google.firebase:firebase-ads:21.5.1' }
بااینحال، اگر میخواهید وابستگیای برای متغیری اضافه کنید که نسخه ویژه محصول و نوع ساخت را ترکیب میکند، باید نام پیکربندی را مقداردهی اولیه کنید:
کاتلین
// Initializes a placeholder for the freeDebugImplementation dependency configuration. val freeDebugImplementation by configurations.creating dependencies { freeDebugImplementation(project(":free-support")) }
شیک
configurations { // Initializes a placeholder for the freeDebugImplementation dependency configuration. freeDebugImplementation {} } dependencies { freeDebugImplementation project(":free-support") }
برای افزودن وابستگیهای implementation برای آزمایشهای محلی و آزمایشهای ابزاری
، به این شکل است:
کاتلین
dependencies { // Adds a remote binary dependency only for local tests. testImplementation("junit:junit:4.12") // Adds a remote binary dependency only for the instrumented test APK. androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1") }
شیک
dependencies { // Adds a remote binary dependency only for local tests. testImplementation 'junit:junit:4.12' // Adds a remote binary dependency only for the instrumented test APK. androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1' }
بااینحال، برخی پیکربندیها در این شرایط منطقی نیست. برای مثال،
چون سایر پیمانهها نمیتوانند به androidTest وابسته باشند،
اگر از پیکربندی androidTestApi استفاده کنید، هشدار زیر را دریافت میکنید:
WARNING: Configuration 'androidTestApi' is obsolete and has been replaced with 'androidTestImplementation'.
ترتیب وابستگی
ترتیبی که وابستگیهایتان را فهرست میکنید نشاندهنده اولویت هرکدام است. برای مثال، کتابخانه اول اولویت بالاتری نسبت به کتابخانه دوم دارد و کتابخانه دوم اولویت بالاتری نسبت به کتابخانه سوم دارد. این ترتیب درصورتی مهم است که منابع ادغام شوند یا عناصر مانیفست از کتابخانهها در برنامهتان ادغام شوند.
برای مثال، اگر پروژه شما موارد زیر را اعلام کند:
- وابستگی به
LIB_AوLIB_B(به همین ترتیب) - و
LIB_AبهLIB_CوLIB_Dوابسته است (به همین ترتیب) -
LIB_BبهLIB_Cنیز وابسته است
سپس، ترتیب وابستگی مسطح بهصورت زیر خواهد بود:
LIB_ALIB_DLIB_BLIB_C
این کار تضمین میکند که هم LIB_A و هم LIB_B میتوانند
LIB_C را لغو کنند؛ و LIB_D همچنان اولویت بالاتری نسبتبه
LIB_B دارد زیرا LIB_A (که به آن وابسته است)
اولویت بالاتری نسبتبه LIB_B دارد.
برای اطلاعات بیشتر درباره نحوه ادغام مانیفستها از منابع یا وابستگیهای مختلف پروژه، به ادغام چندین فایل مانیفست مراجعه کنید.
اطلاعات وابستگی برای «کنسول Play»
هنگام ساختن برنامه، AGP فرادادهای را اضافه میکند که وابستگیهای کتابخانه را که در برنامه شما کامپایل شدهاند توصیف میکند. هنگام بارگذاری برنامه، «کنسول Play» این فراداده را بررسی میکند تا هشدارهایی برای مشکلات شناختهشده در کیتهای توسعه نرمافزار و وابستگیهایی که برنامه شما استفاده میکند ارائه دهد و در برخی موارد، بازخوردهای قابلاجرایی برای حل این مشکلات ارائه دهد.
این دادهها فشرده میشوند، با کلید امضای Google Play رمزگذاری میشوند، و در بلوک امضای برنامه انتشار شما ذخیره میشوند. توصیه میکنیم این فایل وابستگیها را برای تجربه کاربری ایمن و مثبت نگه دارید. با گنجاندن بلوک زیر در فایل build.gradle.kts واحدتان میتوانید انصراف دهید:
dependenciesInfo
android {
dependenciesInfo {
// Disables dependency metadata when building APKs.
includeInApk = false
// Disables dependency metadata when building Android App Bundles.
includeInBundle = false
}
}
برای اطلاعات بیشتر درباره خطمشیهای ما و مشکلات احتمالی مربوط به وابستگیها، صفحه پشتیبانی ما درباره استفاده از کیتهای توسعه نرمافزار طرف سوم در برنامه را ببینید.
اطلاعات آماری کیت توسعه نرمافزار
«استودیو Android» هشدارهای Lint را در فایل کاتالوگ نسخه و گفتگوی ساختار پروژه برای کیتهای توسعه نرمافزار عمومی در نمایه کیت توسعه نرمافزار Google Play نشان میدهد، درصورتیکه مشکلات زیر وجود داشته باشد:
- کیتهای توسعه نرمافزار توسط نویسندگانشان بهعنوان قدیمی علامتگذاری شدهاند.
- کیتهای توسعه نرمافزار خطمشیهای Play را نقض میکنند.
- کیتهای توسعه نرمافزار آسیبپذیریهای امنیتی شناختهشدهای دارند.
- کیتهای توسعه نرمافزار توسط نویسندگانشان منسوخ شدهاند.
این هشدارها نشان میدهند که باید آن وابستگیها را بهروز کنید، زیرا استفاده از نسخههای قدیمی ممکن است در آینده مانع از انتشار برنامه در «کنسول Google Play» شود.
افزودن وابستگیهای ساخت بدون کاتالوگهای نسخه
توصیه میکنیم برای افزودن و مدیریت وابستگیها از کاتالوگهای نسخه استفاده کنید، اما پروژههای ساده ممکن است به آنها نیاز نداشته باشند. در اینجا نمونهای از فایل ساخت آورده شده است که از کاتالوگهای نسخه استفاده نمیکند:
کاتلین
plugins { id("com.android.application") } android { ... } dependencies { // Dependency on a remote binary implementation("com.example.android:app-magic:12.3") // Dependency on a local library module implementation(project(":mylibrary")) }
شیک
plugins { id 'com.android.application' } android { ... } dependencies { // Dependency on a remote binary implementation 'com.example.android:app-magic:12.3' // Dependency on a local library module implementation project(':mylibrary') }
این فایل ساخت وابستگی به نسخه ۱۲.۳ کتابخانه «app-magic» را در گروه فضای نام «com.example.android» اعلام میکند. اعلام وابستگی دودویی از راه دور مخفف عبارت زیر است:
کاتلین
implementation(group = "com.example.android", name = "app-magic", version = "12.3")
شیک
implementation group: 'com.example.android', name: 'app-magic', version: '12.3'
فایل ساخت همچنین وابستگی به واحد کتابخانه Android
بهنام «mylibrary» را اعلام میکند؛ این نام باید با نام کتابخانه تعریفشده با
include: در فایل settings.gradle.kts شما مطابقت داشته باشد. وقتی برنامهتان را میسازید،
سیستم ساخت، واحد کتابخانه را کامپایل میکند و محتوای کامپایلشده حاصل را
در برنامه بستهبندی میکند.
فایل ساخت همچنین وابستگی به افزایه Android Gradle
(com.application.android) را اعلام میکند. اگر چند ماژول دارید که از یک
افزایه استفاده میکنند، فقط میتوانید یک نسخه از افزایه را در مسیر کلاس ساخت
در همه ماژولها داشته باشید. بهجای مشخص کردن نسخه در هریک از دستورگان ساخت پیمانه، باید وابستگی افزونه را در دستورگان ساخت ریشه با نسخه اضافه کنید و نشان دهید که اعمال نشود. افزودن apply false به Gradle میگوید که نسخه افزونه را یادداشت کند اما از آن در ساخت ریشه استفاده نکند.
معمولاً اسکریپت ساخت ریشه خالی است، بهجز این بلوک plugins.
کاتلین
plugins { id("org.jetbrains.kotlin.android") version "1.9.0" apply false }
شیک
plugins { id 'com.android.application' version '8.3.0-rc02' apply false }
اگر پروژه تکماژولی دارید، میتوانید نسخه را بهطور صریح در اسکریپت ساخت سطح ماژول مشخص کنید و اسکریپت ساخت سطح پروژه را خالی بگذارید:
کاتلین
plugins { id("com.android.application") version "8.3.0" }
شیک
plugins { id 'com.android.application' version '8.3.0-rc02' }