Android Studio'daki Gradle derleme sistemi, derlemenize harici ikili programları veya diğer kitaplık modüllerini bağımlılık olarak eklemeyi kolaylaştırır. Bağımlılıklar makinenizde veya uzak bir depoda bulunabilir. Ayrıca bildirdikleri tüm geçişli bağımlılıklar da otomatik olarak dahil edilir. Bu sayfada, Gradle için Android eklentisine özgü davranış ve yapılandırmalarla ilgili ayrıntılar dahil olmak üzere Android projenizde bağımlılıkları nasıl kullanacağınız açıklanmaktadır. Gradle bağımlılıkları hakkında daha kapsamlı bir kavramsal kılavuz için Bağımlılık yönetimiyle ilgili Gradle kılavuzunu da incelemeniz gerekir. Ancak Android projenizin yalnızca bu sayfada tanımlanan bağımlılık yapılandırmalarını kullanması gerektiğini unutmayın.
Bağımlılık türleri
Projenize bağımlılık eklemek için modülünüzün build.gradle.kts
dosyasının dependencies
bloğunda implementation
gibi bir bağımlılık yapılandırması belirtin.
Örneğin, bir uygulama modülü için aşağıdaki build.gradle.kts
dosyası üç farklı tür bağımlılık içerir:
Kotlin
plugins { id("com.android.application") } android { ... } dependencies { // Dependency on a local library module implementation(project(":mylibrary")) // Dependency on local binaries implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) // Dependency on a remote binary implementation("com.example.android:app-magic:12.3") }
Modern
plugins { id 'com.android.application' } android { ... } dependencies { // Dependency on a local library module implementation project(':mylibrary') // Dependency on local binaries implementation fileTree(dir: 'libs', include: ['*.jar']) // Dependency on a remote binary implementation 'com.example.android:app-magic:12.3' }
Bunların her biri aşağıdaki gibi farklı türde bir kitaplık bağımlılığı ister:
- Yerel kitaplık modülü bağımlılığı
-
Kotlin
implementation(project(":mylibrary"))
Modern
implementation project(':mylibrary')
Bu, "mylibrary" adlı Android kitaplık modülüne bağımlılığı tanımlar (bu ad
settings.gradle.kts
dosyanızdainclude:
ile tanımlanan kitaplık adıyla eşleşmelidir). Uygulamanızı derlediğinizde derleme sistemi, kitaplık modülünü derler ve ortaya çıkan derlenmiş içeriği uygulamada paketler. - Yerel ikili bağımlılık
-
Kotlin
implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))
Modern
implementation fileTree(dir: 'libs', include: ['*.jar'])
Gradle, projenizin
module_name/libs/
dizinindeki JAR dosyalarında bağımlılıklar bildirir (çünkü Gradle, yollarıbuild.gradle.kts
dosyasına göre okur).Alternatif olarak, aşağıdaki gibi dosyaları tek tek belirtebilirsiniz:
Kotlin
implementation(files("libs/foo.jar", "libs/bar.jar"))
Modern
implementation files('libs/foo.jar', 'libs/bar.jar')
- Uzaktan ikili program bağımlılığı
-
Kotlin
implementation("com.example.android:app-magic:12.3")
Modern
implementation 'com.example.android:app-magic:12.3'
Bu, aslında şunun kısa halidir:
Kotlin
implementation(group = "com.example.android", name = "app-magic", version = "12.3")
Modern
implementation group: 'com.example.android', name: 'app-magic', version: '12.3'
Bu, "com.example.android" ad alanı grubu içinde "app-magic" kitaplığının 12.3 sürümüne bağımlılığı tanımlar.
Not: Bunun gibi uzaktan bağımlılıklar, Gradle'ın kitaplığı araması gereken uygun uzaktan depoları bildirmenizi gerektirir. Kitaplık halihazırda yerel olarak mevcut değilse derleme için gerekli olduğunda (örneğin, Projeyi Gradle Dosyalarıyla Senkronize Et'i
tıkladığınızda veya bir derleme çalıştırdığınızda) Gradle bunu uzak siteden çeker.
Derleme zamanında bir AGP bağımlılığı kullanıyorsanız bunu açık bağımlılık olarak eklediğinizden emin olun. AGP dahili olarak api/implementation
yapılandırmalarını kullandığından, bazı yapılar derleme sınıf yolunuzdan kaldırılabilir ve derleme sınıf yolunuz değişebilir.
Yerel bağımlılıklar
Android Gradle eklentisi 4.0 sürümünden itibaren yerel bağımlılıklar bu sayfada açıklanan şekilde de içe aktarılabilir.
Yerel kitaplıkları gösteren bir AAR'ye bağlı olarak, yerel kitaplıklar otomatik olarak externalNativeBuild
tarafından kullanılan derleme sisteminde kullanılabilir hale gelir. Kitaplıklara kodunuzdan erişmek için yerel derleme komut dosyalarınızda bağlantı oluşturmanız gerekir. Bu sayfadaki Yerel bağımlılıkları kullanma bölümüne bakın.
Bağımlılık yapılandırmaları
dependencies
bloğunun içinde, birkaç farklı bağımlılık yapılandırmasından birini (yukarıda gösterilen implementation
gibi) kullanarak bir kitaplık bağımlılığı beyan edebilirsiniz. Her bağımlılık yapılandırması, Gradle'a bağımlılığın nasıl kullanılacağıyla ilgili farklı talimatlar sağlar. Aşağıdaki tabloda, Android projenizdeki bir bağımlılık için kullanabileceğiniz yapılandırmaların her biri açıklanmaktadır. Tablo ayrıca bu yapılandırmaları, Android Gradle eklentisi 3.0.0 sürümü itibarıyla kullanımdan kaldırılan yapılandırmalarla da karşılaştırır.
Yapılandırma | Davranış |
---|---|
implementation |
Gradle, bağımlılığı derleme sınıf yoluna ekler ve bağımlılığı derleme çıktısına paketler. Bununla birlikte, modülünüz implementation bağımlılığını yapılandırdığında, derleme sırasında modülün bağımlılığı diğer modüllere sızdırmasını istemediğinizi Gradle'a bildirir. Yani bağımlılık yalnızca çalışma zamanında diğer modüller için kullanılabilir.
|
api |
Gradle, bağımlılığı derleme sınıf yoluna ve derleme çıkışına ekler. Bir modül api bağımlılığı içerdiğinde, Gradle'ın bu bağımlılığı diğer modüllere geçişli olarak dışa aktarmak istediğini bilmesini sağlar. Böylece, hem çalışma zamanında hem de derleme zamanında bu bağımlılar tarafından kullanılabilir.
Bu yapılandırma, |
compileOnly |
Gradle, bağımlılığı yalnızca derleme sınıf yoluna ekler (yani derleme çıkışına eklenmez). Bu, bir Android modülü oluşturduğunuzda ve derleme sırasında bağımlılığa ihtiyacınız olduğunda yararlı olur ancak çalışma zamanında mevcut olması isteğe bağlıdır.
Bu yapılandırmayı kullanırsanız kitaplık modülünüz, bağımlılığın mevcut olup olmadığını kontrol etmek için bir çalışma zamanı koşulu içermelidir. Daha sonra bu koşul sağlanmasa da özelliğin çalışmaya devam edebilmesi için davranışını gerektiği şekilde değiştirin. Bu, kritik olmayan geçici bağımlılıkları eklemeyerek son uygulamanın boyutunu küçültmeye yardımcı olur.
Bu yapılandırma,
Not: |
runtimeOnly |
Gradle, çalışma zamanında kullanılmak üzere bağımlılığı yalnızca derleme çıkışına ekler. Yani derleme sınıf yoluna eklenmez.
Bu yapılandırma, apk (artık kullanımdan kaldırılmıştır) gibi davranır.
|
annotationProcessor |
Ek açıklama işlemcisi olan bir kitaplığa bağımlılık eklemek için Android Gradle eklentisi JAR dosyası aşağıdaki dosyayı içeriyorsa bir bağımlılığın ek açıklama işlemcisi olduğunu varsayar:
Eklenti, derleme sınıf yolunda bulunan bir ek açıklama işlemcisi algılarsa yapı hatası oluşturur. Not: Kotlin projeleri, ek açıklama işlemcisi bağımlılıklarını tanımlamak için kapt yöntemini kullanmalıdır. |
lintChecks |
Projenizi oluştururken Gradle'ın yürütmesini istediğiniz lint kontrollerini eklemek için bu yapılandırmayı kullanın. Not: Android Gradle eklentisi 3.4.0 ve sonraki sürümleri kullanılırken bu bağımlılık yapılandırması artık Android Kitaplığı projelerinizde lint kontrollerini paketlemez. AAR kitaplıklarınıza lint kontrolü bağımlılıklarını eklemek için aşağıda açıklanan |
lintPublish |
Gradle'ın bir lint.jar dosyası ve AAR'nizde paket halinde derlemesini istediğiniz lint kontrollerini eklemek için Android kitaplık projelerinde bu yapılandırmayı kullanın. Bu, AAR'nizi kullanan projelerin bu hata analizi kontrollerini de uygulamasını sağlar. Yayınlanan AAR'ye lint kontrollerini eklemek için daha önce lintChecks bağımlılık yapılandırmasını kullandıysanız bu bağımlılıkları, bunun yerine lintPublish yapılandırmasını kullanacak şekilde taşımanız gerekir.
Kotlindependencies { // 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")) } Moderndependencies { // 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') } |
apk
|
Gradle, çalışma zamanında kullanılmak üzere bağımlılığı yalnızca derleme çıkışına ekler. Yani derleme sınıf yoluna eklenmez. Bu yapılandırmanın desteği sonlandırılmıştır (AGP 1.0-4.2 sürümlerinde kullanılabilir). |
compile
|
Gradle, bağımlılığı derleme sınıf yoluna ve derleme çıkışına ekler ve bağımlılığı diğer modüllere aktarır. Bu yapılandırmanın desteği sonlandırılmıştır (AGP 1.0-4.2 arasında kullanılabilir). |
provided
|
Gradle, bağımlılığı yalnızca derleme sınıf yoluna ekler (yani derleme çıkışına eklenmez). Bu yapılandırmanın desteği sonlandırılmıştır (AGP 1.0-4.2 arasında kullanılabilir). |
Yukarıdaki yapılandırmaların hepsi, tüm derleme varyantlarına bağımlılık uygular. Bunun yerine yalnızca belirli bir derleme varyantı kaynak grubu veya bir test kaynağı grubu için bağımlılık bildirmek isterseniz yapılandırma adını büyük harfle yazmanız ve derleme varyantının veya test kaynağı grubunun adını ön ek olarak koymanız gerekir.
Örneğin, bir implementation
bağımlılığını yalnızca "ücretsiz" ürün türünüze eklemek (uzaktan ikili bağımlılığı kullanarak) şu şekilde görünür:
Kotlin
dependencies { freeImplementation("com.google.firebase:firebase-ads:9.8.0") }
Modern
dependencies { freeImplementation 'com.google.firebase:firebase-ads:9.8.0' }
Ancak ürün niteliğini ve derleme türünü birleştiren bir varyant için bağımlılık eklemek istiyorsanız configurations
bloğunda yapılandırma adını başlatmanız gerekir. Aşağıdaki örnek, "freeDebug" derleme varyantınıza bir runtimeOnly
bağımlılığı ekler (yerel ikili bağımlılığı kullanarak).
Kotlin
// Initializes a placeholder for the freeDebugRuntimeOnly dependency configuration. val freeDebugRuntimeOnly by configurations.creating dependencies { freeDebugRuntimeOnly(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar")))) }
Modern
configurations { // Initializes a placeholder for the freeDebugRuntimeOnly dependency configuration. freeDebugRuntimeOnly {} } dependencies { freeDebugRuntimeOnly fileTree(dir: 'libs', include: ['*.jar']) }
Yerel ve araçlı testlerinize implementation
bağımlılıkları eklemek için şu şekilde görünür:
Kotlin
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.5.1") }
Modern
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.5.1' }
Ancak belirli yapılandırmalar bu durumda anlamlı olmaz. Örneğin, diğer modüller androidTest
öğesine bağlı olamayacağından androidTestApi
yapılandırmasını kullanırsanız aşağıdaki uyarıyı alırsınız:
WARNING: Configuration 'androidTestApi' is obsolete and has been replaced with 'androidTestImplementation'.
Ek açıklama işlemcileri ekleme
Derleme sınıf yolunuza ek açıklama işlemcileri eklerseniz aşağıdakine benzer bir hata mesajı görürsünüz:
Error: Annotation processors must be explicitly declared now.
Bu hatayı çözmek için annotationProcessor
kullanarak bağımlılığınızı aşağıda gösterildiği gibi yapılandırarak projenize ek açıklama işlemcileri ekleyin:
Kotlin
dependencies { // Adds libraries defining annotations to only the compile classpath. compileOnly("com.google.dagger:dagger:version-number") // Adds the annotation processor dependency to the annotation processor classpath. annotationProcessor("com.google.dagger:dagger-compiler:version-number") }
Modern
dependencies { // Adds libraries defining annotations to only the compile classpath. compileOnly 'com.google.dagger:dagger:version-number' // Adds the annotation processor dependency to the annotation processor classpath. annotationProcessor 'com.google.dagger:dagger-compiler:version-number' }
Not: Gradle 3.0.0+ için Android eklentisi
android-apt
eklentisini desteklememektedir.
Bağımsız değişkenleri ek açıklama işlemcilerine iletme
Bir ek açıklama işlemcisine bağımsız değişkenler aktarmanız gerekiyorsa bunu modülünüzün derleme yapılandırmasındaki AnnotationProcessorOptions
bloğunu kullanarak yapabilirsiniz. Örneğin, temel veri türlerini anahtar/değer çiftleri olarak iletmek isterseniz aşağıda gösterildiği gibi argument
özelliğini kullanabilirsiniz:
Kotlin
android { ... defaultConfig { ... javaCompileOptions { annotationProcessorOptions { arguments += mapOf("key1" to "value1", "key2" to "value2") } } } }
Modern
android { ... defaultConfig { ... javaCompileOptions { annotationProcessorOptions { argument 'key1', 'value1' argument 'key2', 'value2' } } } }
Ancak Android Gradle eklentisi 3.2.0 ve sonraki sürümlerini kullanırken, dosya veya dizinleri temsil eden işlemci bağımsız değişkenlerini Gradle'ın CommandLineArgumentProvider
arayüzünü kullanarak aktarmanız gerekir.
CommandLineArgumentProvider
kullanımı, sizin veya ek açıklama işleyenin yazarının, her bağımsız değişkene artımlı derleme özelliği türü ek açıklamaları uygulayarak artımlı ve önbelleğe alınmış temiz derlemelerin doğruluğunu ve performansını iyileştirmesine olanak tanır.
Örneğin, aşağıdaki sınıf CommandLineArgumentProvider
uygular ve işlemci için her bağımsız değişkene ek açıklama ekler.
Kotlin
class MyArgsProvider( // Annotates each directory as either an input or output for the // annotation processor. @get:InputFiles // Using this annotation helps Gradle determine which part of the file path // should be considered during up-to-date checks. @get:PathSensitive(PathSensitivity.RELATIVE) val inputDir: FileCollection, @get:OutputDirectory val outputDir: File ) : CommandLineArgumentProvider { // Specifies each directory as a command line argument for the processor. // The Android plugin uses this method to pass the arguments to the // annotation processor. override fun asArguments(): Iterable<String> { // Use the form '-Akey[=value]' to pass your options to the Java compiler. return listOf("-AinputDir=${inputDir.singleFile.absolutePath}", "-AoutputDir=${outputDir.absolutePath}") } } android {...}
Modern
class MyArgsProvider implements CommandLineArgumentProvider { // Annotates each directory as either an input or output for the // annotation processor. @InputFiles // Using this annotation helps Gradle determine which part of the file path // should be considered during up-to-date checks. @PathSensitive(PathSensitivity.RELATIVE) FileCollection inputDir @OutputDirectory File outputDir // The class constructor sets the paths for the input and output directories. MyArgsProvider(FileCollection input, File output) { inputDir = input outputDir = output } // Specifies each directory as a command line argument for the processor. // The Android plugin uses this method to pass the arguments to the // annotation processor. @Override Iterable<String> asArguments() { // Use the form '-Akey[=value]' to pass your options to the Java compiler. ["-AinputDir=${inputDir.singleFile.absolutePath}", "-AoutputDir=${outputDir.absolutePath}"] } } android {...}
CommandLineArgumentProvider
yöntemini uygulayan bir sınıf tanımladıktan sonra, aşağıda gösterildiği gibi bir örnek oluşturup annotationProcessorOptions.compilerArgumentProvider
yöntemini kullanarak Android eklentisine iletmeniz gerekir.
Kotlin
// This is in your module's build.gradle file. android { defaultConfig { javaCompileOptions { annotationProcessorOptions { // Creates a new MyArgsProvider object, specifies the input and // output paths for the constructor, and passes the object // to the Android plugin. compilerArgumentProvider(MyArgsProvider(files("input/path"), file("output/path"))) } } } }
Modern
// This is in your module's build.gradle file. android { defaultConfig { javaCompileOptions { annotationProcessorOptions { // Creates a new MyArgsProvider object, specifies the input and // output paths for the constructor, and passes the object // to the Android plugin. compilerArgumentProvider new MyArgsProvider(files("input/path"), new File("output/path")) } } } }
CommandLineArgumentProvider
uygulamasının derleme performansını iyileştirmeye nasıl yardımcı olduğu hakkında daha fazla bilgi edinmek için Java projelerini önbelleğe alma bölümünü okuyun.
Ek açıklama işlemcisi hata kontrolünü devre dışı bırak
Derleme sınıf yolunda ihtiyacınız olmayan ek açıklama işlemcilerini içeren bağımlılıklarınız varsa aşağıdaki kodu build.gradle.kts
dosyanıza ekleyerek hata kontrolünü devre dışı bırakabilirsiniz. Derleme sınıf yoluna eklediğiniz ek açıklama işlemcilerinin yine de işlemci sınıf yoluna eklenmediğini unutmayın.
Kotlin
android { ... defaultConfig { ... javaCompileOptions { annotationProcessorOptions { argument("includeCompileClasspath", "false") } } } }
Modern
android { ... defaultConfig { ... javaCompileOptions { annotationProcessorOptions { includeCompileClasspath false } } } }
Kotlin ve kapt kullanıyorsanız:
Kotlin
android { ... defaultConfig { ... kapt { includeCompileClasspath = false } } }
Modern
android { ... defaultConfig { ... kapt { includeCompileClasspath false } } }
Projenizin ek açıklama işlemcilerini işlemci sınıf yoluna taşıdıktan sonra sorun yaşarsanız includeCompileClasspath
değerini true
olarak ayarlayarak ek açıklama işlemcilerine, derleme sınıf yolunda izin verebilirsiniz. Ancak, bu özelliğin true
değerine ayarlanması önerilmez ve ayarlama seçeneği Android eklentisinin gelecekteki bir güncellemesinde kaldırılacaktır.
Geçişli bağımlılıkları hariç tutma
Uygulama kapsamı genişledikçe doğrudan bağımlılıklar ve geçişli bağımlılıklar (uygulamanızın içe aktarılan kitaplıklarının bağımlı olduğu kitaplıklar) dahil olmak üzere bir dizi bağımlılığı içerebilir.
Artık ihtiyaç duymadığınız geçişli bağımlılıkları hariç tutmak için exclude
anahtar kelimesini aşağıda gösterildiği gibi kullanabilirsiniz:
Kotlin
dependencies { implementation("some-library") { exclude(group = "com.example.imgtools", module = "native") } }
Modern
dependencies { implementation('some-library') { exclude group: 'com.example.imgtools', module: 'native' } }
Geçişli bağımlılıkları test yapılandırmalarından hariç tutma
Belirli geçişli bağımlılıkları testlerinizden hariç tutmanız gerekirse yukarıda gösterilen kod örneği beklendiği gibi çalışmayabilir. Bunun nedeni, test yapılandırmasının (ör. androidTestImplementation
) modülün implementation
yapılandırmasını genişletir. Yani Gradle yapılandırmayı çözümlediğinde her zaman implementation
bağımlılıkları içerir.
Bu nedenle, geçişli bağımlılıkları testlerinizden hariç tutmak için bunu aşağıda gösterildiği gibi yürütme sırasında yapmanız gerekir:
Kotlin
android.testVariants.all { compileConfiguration.exclude(group = "com.jakewharton.threetenabp", module = "threetenabp") runtimeConfiguration.exclude(group = "com.jakewharton.threetenabp", module = "threetenabp") }
Modern
android.testVariants.all { variant -> variant.getCompileConfiguration().exclude group: 'com.jakewharton.threetenabp', module: 'threetenabp' variant.getRuntimeConfiguration().exclude group: 'com.jakewharton.threetenabp', module: 'threetenabp' }
Not: Test yapılandırmasına özel olan ve diğer yapılandırmalara dahil olmayan geçişli bağımlılıkları hariç tutmak için Geçişli bağımlılıkları hariç tutma bölümündeki orijinal kod örneğinde gösterildiği gibi bağımlılık bloğunda exclude
anahtar kelimesini kullanmaya devam edebilirsiniz.
Wear OS uygulama bağımlılıklarını yapılandırın
Wear OS modülünde bağımlılıkları yapılandırmak diğer herhangi bir modülünkine benzerdir. Yani Wear OS modüllerinde implementation
ve compileOnly
gibi aynı bağımlılık yapılandırmaları kullanılır.
Wear modülleri, varyant duyarlı bağımlılık yönetimini de destekler. Bunun sonucunda, temel uygulama modülünüzün bir Wear modülüne bağımlılığı varsa temel modülün her varyantı, Wear modülündeki eşleşen varyantı tüketir.
Uzak depolar
Bağımlılığınız yerel kitaplık veya dosya ağacı dışında bir şey olduğunda Gradle, settings.gradle
dosyanızın dependencyResolutionManagement { repositories {...} }
bloğunda belirtilen online depolardaki dosyaları arar.
Her bir depoyu listeleme sıranız, Gradle'ın her bir proje bağımlılığı için depoları arama sırasını belirler. Örneğin, hem A hem de B deposunda bir bağımlılık mevcutsa ve önce A'yı listelerseniz Gradle, bağımlılığı A deposundan indirir.
Aşağıda gösterildiği gibi, yeni Android Studio projelerinde varsayılan olarak Google'ın Maven deposu ve projenin settings.gradle
dosyasındaki depo konumları olarak Maven merkezi depo konumu belirtilir:
Kotlin
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() } }
Modern
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() } }
Yerel bir depodan öğe istiyorsanız mavenLocal()
öğesini kullanın:
Kotlin
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() mavenLocal() } }
Modern
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() mavenLocal() } }
Belirli Maven veya Ivy depolarını aşağıdaki şekilde de belirtebilirsiniz:
Kotlin
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { maven(url = "https://repo.example.com/maven2") maven(url = "file://local/repo/") ivy(url = "https://repo.example.com/ivy") } }
Modern
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { maven { url 'https://repo.example.com/maven2' } maven { url 'file://local/repo/' } ivy { url 'https://repo.example.com/ivy' } } }
Daha fazla bilgi için Gradle Kod Depoları kılavuzuna bakın.
Google'ın Maven deposu
Aşağıdaki Android kitaplıklarının en yeni sürümleri Google'ın Maven deposunda mevcuttur:
- AndroidX Kitaplıkları
- Mimari Bileşenler Kitaplığı
- Sınırlama Düzeni Kitaplığı
- AndroidX Testi
- Veri Bağlama Kitaplığı
- Android Hazır Uygulama Kitaplığı
- Wear OS
- Google Play Hizmetleri
- Google Play Faturalandırma Kitaplığı
- Firebase
Mevcut tüm yapıları Google'ın Maven deposu dizininde görebilirsiniz (programatik erişim için aşağıya bakın).
Derlemenize bu kitaplıklardan birini eklemek için üst düzey build.gradle.kts
dosyanıza Google'ın Maven deposunu ekleyin:
Kotlin
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() // If you're using a version of Gradle lower than 4.1, you must instead use: // maven { // url = "https://maven.google.com" // } // An alternative URL is "https://dl.google.com/dl/android/maven2/". } }
Modern
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() // If you're using a version of Gradle lower than 4.1, you must instead use: // maven { // url 'https://maven.google.com' // } // An alternative URL is 'https://dl.google.com/dl/android/maven2/'. } }
Ardından istediğiniz kitaplığı modülünüzün dependencies
bloğuna ekleyin.
Örneğin,uygulama kitaplığı aşağıdaki gibi görünür:
Kotlin
dependencies { implementation("com.android.support:appcompat-v7:28.0.0") }
Modern
dependencies { implementation 'androidx.appcompat:appcompat:1.6.1' }
Ancak yukarıdaki kitaplıkların daha eski bir sürümünü kullanmaya çalışırsanız ve bağımlılığınız başarısız olursa Maven deposunda kullanılamaz ve kitaplığı çevrimdışı depodan almanız gerekir.
Programatik erişim
Google'ın Maven yapılarına programlı erişim için maven.google.com/master-index.xml adresinden yapı gruplarının XML listesini alabilirsiniz. Ardından, herhangi bir grubun kitaplık adlarını ve sürümlerini şurada görüntüleyebilirsiniz:
maven.google.com/group_path/group-index.xml
Örneğin, android.arch.lifecycle grubundaki kitaplıklar maven.google.com/android/arch/lifecycle/group-index.xml adresinde listelenir.
POM ve JAR dosyalarını şu adresten de indirebilirsiniz:
maven.google.com/group_path/library/version /library-version.ext
Örneğin: maven.google.com/android/arch/lifecycle/derr/1.0.0/derr-1. 0.0.pom.
SDK Manager'dan çevrimdışı depo
Google Maven deposunda bulunmayan kitaplıklar için (genellikle eski kitaplık sürümleri) SDK Yöneticisi'nden çevrimdışı Google Repository paketini indirmeniz gerekir.
Ardından bu kitaplıkları her zamanki gibi dependencies
blokunuza ekleyebilirsiniz.
Çevrimdışı kitaplıklar android_sdk/extras/
dosyasına kaydedilir.
Android Gradle eklentisiyle yerel bağımlılıklar
AAR kitaplıkları, Android Gradle Eklentisi'nin tüketebileceği yerel bağımlılıklar içerebilir. AGP, tüketicilerine yerel kitaplıkları gösteren AAR'ler üretebilir.
Yerel bağımlılıkları kullanma
C/C++ bağımlılıkları, Android Gradle eklentisi 4.0 sürümünden itibaren build.gradle
dosyanıza bağlı AAR'lerden içe aktarılabilir. Gradle, bunları otomatik olarak yerel derleme sisteminin kullanımına sunar ancak derleme sisteminiz, içe aktarılan kitaplıkları ve üst bilgileri kullanacak şekilde yapılandırılmalıdır. C/C++ bağımlılıkları AAR'ler olarak dağıtıldığından, genel AAR'lerle ilgili aşağıdaki bağlantılar yararlı olabilir:
- Özellikle AAR'yi yerel bir C/C++ bağımlılığı olarak kullanmak istediğinizde, genel AAR belgeleri ve bunu projenize nasıl entegre edeceğiniz için bir Android Kitaplığı oluşturma.
- Özellikle uzaktan bağımlılıklar için,
build.gradle
dosyanıza bağımlılık ekleme hakkında bilgi edinmek için derleme bağımlılıkları ekleyin.
Bu belge, yerel derleme sisteminizi nasıl yapılandıracağınıza odaklanır ve projenizin Gradle derleme ortamına zaten bir C/C++ bağımlılık AAR'si eklediğiniz varsayılır.
AAR'lerde yerel bağımlılıklar
Gradle modüllerinizin AAR bağımlılıkları, uygulamanızın kullanabileceği yerel kitaplıkları açığa çıkarabilir. AAR'nin içindeki prefab
dizini, yerel bağımlılığın üst bilgilerini ve kitaplıklarını içeren bir Prefab paketi içerir.
Her bağımlılık, bir veya daha fazla modülden oluşan en fazla bir Prefab paketi gösterebilir. Prefab modülü tek bir kitaplıktır. Bu kitaplık paylaşımlı, statik veya yalnızca başlık kitaplığı olabilir.
Kitaplıkları kullanabilmek için paket ve modül adlarının bilinmesi gerekir. Kural olarak, paket adı Maven yapı adıyla, modül adı da C/C++ kitaplık adıyla eşleşir ancak bu zorunlu değildir. Kullandığı adları belirlemek için bağımlılığın belgelerine bakın.
Sistem yapılandırması oluşturun
Android Gradle modülünüz için prefab
özelliği etkinleştirilmiş olmalıdır.
Bunu yapmak için modülünüzün build.gradle
dosyasındaki android
bloğuna aşağıdaki kodu ekleyin:
Kotlin
buildFeatures { prefab = true }
Modern
buildFeatures { prefab true }
İsteğe bağlı olarak projenizin gradle.properties
dosyasında bir sürümü yapılandırın:
android.prefabVersion=2.0.0
Genellikle seçilen AGP varsayılan sürümü gereksinimlerinize uygundur. Düzeltmeniz gereken bir hata veya istediğiniz yeni bir özellik varsa farklı bir sürüm seçmeniz gerekir.
Bir AAR'den içe aktarılan bağımlılıklar, CMAKE_FIND_ROOT_PATH aracılığıyla CMake'e maruz bırakılır. Bu değer, CMake çağrıldığında Gradle tarafından otomatik olarak ayarlanır. Bu nedenle, derlemeniz bu değişkeni değiştirirse değişken atamak yerine eklediğinizden emin olun.
Her bağımlılık, derlemenize bir yapılandırma dosyası paketi sunar. Bu dosyalar find_package komutuyla içe aktarılır. Bu komut, belirtilen paket adı ve sürümle eşleşen yapılandırma dosyası paketlerini arar ve tanımladığı hedefleri derlemenizde kullanılmak üzere sunar. Örneğin, uygulamanız libapp.so
öğesini tanımlıyor ve cURL kullanıyorsa CMakeLists.txt
aşağıdakileri içermelidir:
add_library(app SHARED app.cpp)
# Add these two lines.
find_package(curl REQUIRED CONFIG)
target_link_libraries(app curl::curl)
app.cpp
artık #include "curl/curl.h"
işlemini gerçekleştirebilir, libapp.so
uygulama geliştirme sırasında libcurl.so
ile otomatik olarak bağlanır ve libcurl.so
uygulamaya dahil edilir.
AAR'lerde yerel kitaplıklar yayınlama
Yerel AAR'ler oluşturma olanağı ilk olarak AGP 4.1'de eklenmiştir.
Yerel kitaplıklarınızı dışa aktarmak için kitaplık projenizin build.gradle.kts
dosyasının android
bloğuna aşağıdakileri ekleyin:
Kotlin
buildFeatures { prefabPublishing = true } prefab { create("mylibrary") { headers = "src/main/cpp/mylibrary/include" } create("myotherlibrary") { headers = "src/main/cpp/myotherlibrary/include" } }
Modern
buildFeatures { prefabPublishing true } prefab { mylibrary { headers "src/main/cpp/mylibrary/include" } myotherlibrary { headers "src/main/cpp/myotherlibrary/include" } }
Bu örnekte, ndk-build veya CMake harici yerel derlemenizdeki mylibrary
ve myotherlibrary
kitaplıkları, derlemeniz tarafından oluşturulan AAR'de paketlenir ve her biri, başlıkları belirtilen dizinden kendi bağımlılarına dışa aktarır.
Bağımlılık sırası
Bağımlılıklarınızı listelediğiniz sıra, her birinin önceliğini gösterir: Birinci kitaplık ikinciden daha önceliklidir, ikincisi üçüncüden daha önceliklidir vb. Bu sıra, kaynakların veya kitaplıklardan uygulamanızın manifest öğelerinin birleştirilmesi durumunda önemlidir.
Örneğin, projenizde aşağıdakiler belirtilmişse:
LIB_A
veLIB_B
ürünlerine (bu sırayla) olan bağımlılıkLIB_A
iseLIB_C
veLIB_D
ürünlerine bağlıdır (bu sırayla)- Ayrıca
LIB_B
,LIB_C
metriğine de bağlıdır
Bu durumda sabit bağımlılık sırası aşağıdaki gibi olur:
LIB_A
LIB_D
LIB_B
LIB_C
Bu, hem LIB_A
hem de LIB_B
'nin LIB_C
değerini geçersiz kılmasını sağlar. Ayrıca, LIB_A
(buna bağlıdır) LIB_B
'den daha yüksek önceliğe sahip olduğu için LIB_D
, LIB_B
değerinden daha yüksek önceliklidir.
Farklı proje kaynaklarından/bağımlılıklarından gelen manifestlerin nasıl birleştirildiği hakkında daha fazla bilgi için Birden fazla manifest dosyasını birleştirme bölümüne bakın.
Modül bağımlılıklarını görüntüleyin
Bazı doğrudan bağımlılıkların kendi bağımlılıkları olabilir. Bunlara geçişli bağımlılıklar denir. Gradle, her geçişli bağımlılığı manuel olarak bildirmenizi şart koşmak yerine, bunları otomatik olarak toplar ve sizin için ekler. Gradle için Android eklentisi, Gradle'ın belirli bir modül için çözdüğü bağımlılıkların listesini gösteren bir görev sunar.
Rapor her modül için bağımlılıkları derleme varyantına, test kaynağı kümesine ve sınıf yoluna göre de gruplandırır. Aşağıda, bir uygulama modülünün hata ayıklama derleme varyantına ait çalışma zamanı sınıf yolu ve göstergeli test kaynağı grubunun derleme sınıf yolunun örnek raporu verilmiştir.
debugRuntimeClasspath - Dependencies for runtime/packaging
+--- :mylibrary (variant: debug)
+--- com.google.android.material:material:1.0.0@aar
+--- androidx.appcompat:appcompat:1.0.2@aar
+--- androidx.constraintlayout:constraintlayout:1.1.3@aar
+--- androidx.fragment:fragment:1.0.0@aar
+--- androidx.vectordrawable:vectordrawable-animated:1.0.0@aar
+--- androidx.recyclerview:recyclerview:1.0.0@aar
+--- androidx.legacy:legacy-support-core-ui:1.0.0@aar
...
debugAndroidTest
debugAndroidTestCompileClasspath - Dependencies for compilation
+--- androidx.test.ext:junit:1.1.0@aar
+--- androidx.test.espresso:espresso-core:3.1.1@aar
+--- androidx.test:runner:1.1.1@aar
+--- junit:junit:4.12@jar
...
Görevi çalıştırmak için aşağıdaki adımları uygulayın:
- Görünüm > Araç Pencereleri > Gradle'ı seçin (veya araç pencereleri çubuğunda Gradle
simgesini tıklayın).
- AppName > Görevler > android öğesini genişletin ve androidDependencies'i çift tıklayın. Gradle görevi yürüttükten sonra, çıkışı görüntülemek için Çalıştır penceresi açılır.
Gradle'da bağımlılıkları yönetme hakkında daha fazla bilgi için Gradle Kullanıcı Kılavuzu'nda Bağımlılık yönetimiyle ilgili temel bilgiler bölümüne bakın.
Bağımlılık çözümleme hatalarını düzeltme
Uygulama projenize birden fazla bağımlılık eklediğinizde bu doğrudan ve geçişli bağımlılıklar birbiriyle çakışabilir. Android Gradle eklentisi bu çakışmaları sorunsuz bir şekilde çözmeye çalışır ancak bazı çakışmalar, derleme zamanı veya çalışma zamanı hatalarına neden olabilir.
Hangi bağımlılıkların hatalara katkıda bulunduğunu araştırmanıza yardımcı olması için uygulamanızın bağımlılık ağacını inceleyin ve birden fazla kez görünen veya çakışan sürümleri olan bağımlılıkları arayın.
Yinelenen bağımlılığı kolayca belirleyemiyorsanız Android Studio'nun kullanıcı arayüzünü kullanarak kopya sınıfı içeren bağımlılıkları aşağıdaki gibi arayabilirsiniz:
- Menü çubuğundan Git > Sınıf'ı seçin.
- Pop-up arama iletişim kutusunda Proje olmayan öğeleri dahil et seçeneğinin yanındaki kutunun işaretli olduğundan emin olun.
- Yapı hatasında görünen sınıfın adını yazın.
- Sınıfı içeren bağımlılıklar için sonuçları inceleyin.
Aşağıdaki bölümlerde, karşılaşabileceğiniz farklı türlerde bağımlılık çözümlemeleri ve bunların nasıl düzeltileceği açıklanmaktadır.
Yinelenen sınıf hatalarını düzeltme
Bir sınıf, çalışma zamanı sınıf yolunda birden fazla kez görünüyorsa aşağıdakine benzer bir hata alırsınız:
Program type already present com.example.MyClass
Bu hata genellikle aşağıdaki durumlardan birinden kaynaklanır:
- İkili bağımlılık, uygulamanızın doğrudan bağımlılık olarak dahil ettiği bir kitaplığı içerir. Örneğin, uygulamanız A Kitaplığı ve B Kitaplığı'na doğrudan bağımlı olduğunu beyan eder, ancak A Kitaplığı B kitaplığını zaten ikili olarak içerir.
- Bu sorunu çözmek için doğrudan bağımlılık olarak B Kitaplığını kaldırın.
- Uygulamanız, yerel bir ikili bağımlılığa ve aynı kitaplıkta uzaktan ikili bağımlılığa sahip.
- Bu sorunu çözmek için ikili bağımlılıklardan birini kaldırın.
Sınıf yolları arasındaki çakışmaları düzeltme
Gradle, derleme sınıf yolunu çözümlediğinde önce çalışma zamanı sınıf yolunu çözümler ve sonucu kullanarak derleme sınıf yoluna hangi bağımlılık sürümlerinin eklenmesi gerektiğini belirler. Başka bir deyişle, çalışma zamanı sınıf yolu, aşağı akış sınıf yollarındaki özdeş bağımlılıklar için gerekli sürüm numaralarını belirler.
Uygulamanızın çalışma zamanı sınıf yolu, Gradle'ın, uygulamanın test APK'sı için çalışma zamanı sınıf yolundaki bağımlılıkları eşleştirmek için ihtiyaç duyduğu sürüm numaralarını da belirler. Sınıf yolları hiyerarşisi, Şekil 1'de açıklanmıştır.
Şekil 1. Birden çok sınıf yolunda görünen bağımlılıkların sürüm numaraları bu hiyerarşiye göre eşleşmelidir.
Örneğin, uygulamanız implementation
bağımlılık yapılandırmasını kullanan bir bağımlılığın sürümünü içeriyorsa ve bir kitaplık modülü, runtimeOnly
yapılandırmasını kullanarak bağımlılığın farklı bir sürümünü içeriyorsa aynı bağımlılığın farklı sürümlerinin birden fazla sınıf yolunda göründüğü bir çakışma meydana gelebilir.
Android Gradle eklentisi 3.3.0 ve sonraki sürümleri, çalışma zamanınızdaki bağımlılıkları çözerken ve zaman sınıf yollarını derlerken belirli aşağı akış sürümü çakışmalarını otomatik olarak düzeltmeye çalışır. Örneğin, çalışma zamanı sınıf yolu, Kitaplığı A 2.0 sürümünü ve derleme sınıf yolu da Kitaplık A sürüm 1.0'ı içeriyorsa eklenti, hataları önlemek için derleme sınıfı yolu üzerindeki bağımlılığı Kitaplık A sürüm 2.0'a otomatik olarak günceller.
Bununla birlikte, çalışma zamanı sınıf yolu, Kitaplık A sürüm 1.0'ı ve derleme sınıf yolu da Kitaplık A sürüm 2.0'ı içeriyorsa eklenti, derleme sınıf yolu üzerindeki bağımlılığı Kitaplık A sürüm 1.0'a düşürmez. Yine de aşağıdakine benzer bir hata alırsınız:
Conflict with dependency 'com.example.library:some-lib:2.0' in project 'my-library'. Resolved versions for runtime classpath (1.0) and compile classpath (2.0) differ.
Bu sorunu çözmek için aşağıdakilerden birini yapın:
- Bağımlılığın istediğiniz sürümünü, kitaplık modülünüze
api
bağımlılığı olarak ekleyin. Yani bağımlılığı yalnızca kitaplık modülünüz tanımlar ancak uygulama modülü de geçişli olarak kendi API'sine erişebilir. - Alternatif olarak, her iki modülde de bağımlılığı beyan edebilirsiniz ancak her modülün aynı bağımlı sürümünü kullandığından emin olmanız gerekir. Her bir bağımlılığın sürümlerinin projeniz boyunca tutarlı kalmasını sağlamak için proje genelinde mülkler yapılandırmayı düşünün.
Özel derleme mantığı uygulayın
Bu bölümde, Android Gradle eklentisini genişletmek veya kendi eklentinizi yazmak istediğinizde faydalı olacak ileri düzey konular açıklanmaktadır.
Varyant bağımlılıklarını özel mantıkta yayınlayın
Bir kitaplık, diğer projelerin veya alt projelerin kullanmak isteyebileceği işlevlere sahip olabilir. Kitaplık yayınlama, kitaplığın tüketicilerine sunulma sürecidir. Kitaplıklar, derleme zamanında ve çalışma zamanında tüketicilerinin hangi bağımlılıklara erişebileceğini kontrol edebilir.
Her sınıf yolunun geçişli bağımlılıklarını içeren iki ayrı yapılandırma vardır. Bu yapılandırmaların tüketiciler tarafından aşağıda açıklandığı gibi kitaplığı tüketmek için kullanılması gerekir:
variant_nameApiElements
: Bu yapılandırma, derleme sırasında tüketicilere sunulan geçişli bağımlılıkları barındırır.variant_nameRuntimeElements
: Bu yapılandırma, çalışma zamanında tüketicilere sunulan geçişli bağımlılıkları barındırır.
Farklı yapılandırmalar arasındaki ilişkiler hakkında daha fazla bilgi edinmek için Java Kitaplığı eklenti yapılandırmaları bölümüne gidin.
Özel bağımlılık çözüm stratejileri
Bir projede aynı kitaplığın iki farklı sürümüne bağımlılık olabilir, bu da bağımlılık çakışmalarına yol açabilir. Örneğin, projeniz A modülünün 1 ve B modülünün 2 sürümünü kullanıyorsa ve A modülü geçişli olarak B modülün 3 sürümüne bağımlıysa bir bağımlılık sürümü çakışması ortaya çıkar.
Android Gradle eklentisi bu çakışmayı çözmek için aşağıdaki bağımlılık çözümü stratejisini kullanır: Eklenti, bağımlılık grafiğinde aynı modülün farklı sürümlerinin yer aldığını algıladığında varsayılan olarak sürüm numarası en yüksek olanı seçer.
Ancak bu strateji her zaman istediğiniz gibi çalışmayabilir. Bağımlılık çözümü stratejisini özelleştirmek için bir varyantın göreviniz için gerekli olan belirli bağımlılıklarını çözmek üzere aşağıdaki yapılandırmaları kullanın:
variant_nameCompileClasspath
: Bu yapılandırma, belirli bir varyantın derleme sınıfı yolu için çözüm stratejisini içerir.variant_nameRuntimeClasspath
: Bu yapılandırma, belirli bir varyantın çalışma zamanı sınıf yolu için çözüm stratejisini içerir.
Android Gradle eklentisi, her bir varyantın yapılandırma nesnelerine erişmek için kullanabileceğiniz alıcılar içerir. Bu nedenle, aşağıdaki örnekte gösterildiği gibi bağımlılık çözünürlüğünü sorgulamak için varyant API'sini kullanabilirsiniz:
Kotlin
android { applicationVariants.all { // Return compile configuration objects of a variant. compileConfiguration.resolutionStrategy { // Use Gradle's ResolutionStrategy API // to customize how this variant resolves dependencies. ... } // Return runtime configuration objects of a variant. runtimeConfiguration.resolutionStrategy { ... } // Return annotation processor configuration of a variant. annotationProcessorConfiguration.resolutionStrategy { ... } } }
Modern
android { applicationVariants.all { variant -> // Return compile configuration objects of a variant. variant.getCompileConfiguration().resolutionStrategy { // Use Gradle's ResolutionStrategy API // to customize how this variant resolves dependencies. ... } // Return runtime configuration objects of a variant. variant.getRuntimeConfiguration().resolutionStrategy { ... } // Return annotation processor configuration of a variant. variant.getAnnotationProcessorConfiguration().resolutionStrategy { ... } } }
Play Console için bağımlılık bilgileri
AGP, uygulamanızı derlerken uygulamanızda derlenen kitaplık bağımlılıklarını açıklayan meta veriler içerir. Play Console, uygulamanızı yüklerken bu meta verileri inceler ve uygulamanızın kullandığı SDK'lar ve bağımlılıklarla ilgili bilinen sorunlar hakkında uyarı vermek ve bazı durumlarda bu sorunları çözmek için uygulanabilir geri bildirimler sağlar.
Veriler sıkıştırılır, bir Google Play imzalama anahtarıyla şifrelenir ve sürüm uygulamanızın imzalama bloğunda depolanır. Güvenli ve olumlu bir kullanıcı deneyimi için bu bağımlılık dosyasını saklamanızı öneririz. Modülünüzün build.gradle.kts
dosyasına aşağıdaki dependenciesInfo
bloğunu ekleyerek kapsam dışında kalmayı seçebilirsiniz.
android {
dependenciesInfo {
// Disables dependency metadata when building APKs.
includeInApk = false
// Disables dependency metadata when building Android App Bundles.
includeInBundle = false
}
}
Politikalarımız ve bağımlılıklarla ilgili olası sorunlar hakkında daha fazla bilgi için uygulamanızda üçüncü taraf SDK'ları kullanma konulu destek sayfamıza bakın.
SDK analizleri
Android Studio, Google Play SDK Dizini'te yazarları tarafından eski olarak işaretlenmiş herkese açık SDK'larla ilgili build.gradle
dosyalarda ve Proje Yapısı İletişim kutusunda lint uyarıları gösterir. Eski sürümlerin kullanılması ileride Google Play Console'da içerik yayınlamanızı engelleyebileceği için bu, söz konusu bağımlılıkların güncellenmesine yönelik bir işarettir.