Bu sayfada, tek bir projeden uygulamanızın farklı sürümlerini oluşturmak için derleme varyantlarını nasıl yapılandıracağınız ve bağımlılıklarınızı ve imza yapılandırmalarınızı nasıl doğru şekilde yöneteceğiniz gösterilmektedir.
Her derleme değişkeni, uygulamanızın oluşturabileceğiniz farklı bir sürümünü temsil eder. Örneğin, uygulamanızın sınırlı bir içerik grubuna sahip ücretsiz bir sürümünü ve daha fazla içerik barındıran ücretli bir sürümünü oluşturmak isteyebilirsiniz. Ayrıca, API düzeyine veya diğer cihaz varyasyonlarına göre farklı cihazları hedefleyen farklı uygulama sürümleri de oluşturabilirsiniz.
Derleme değişkenleri, Gradle'ın derleme türlerinizde ve ürün türlerinizde yapılandırılan ayarları, kodu ve kaynakları birleştirmek için belirli bir kural grubunu kullanmasıyla elde edilir. Derleme değişkenlerini doğrudan yapılandırmasanız da bunları oluşturan derleme türlerini ve ürün türlerini yapılandırırsınız.
Örneğin, "demo" ürün türü belirli özellikleri ve cihaz gereksinimlerini (ör. özel kaynak kodu, kaynaklar ve minimum API seviyeleri) belirtebilirken "hata ayıklama" derleme türü farklı derleme ve paketleme ayarları (ör. hata ayıklama seçenekleri ve imzalama anahtarları) uygular. Bu ikisini birleştiren derleme değişkeni, uygulamanızın "demoDebug" sürümüdür ve "demo" ürün türü, "debug" derleme türü ve main/ kaynak grubunda yer alan yapılandırma ve kaynakların bir kombinasyonunu içerir.
Derleme türlerini yapılandırma
Modül düzeyindeki build.gradle.kts dosyasının android bloğunda derleme türleri oluşturup yapılandırabilirsiniz. Yeni bir modül oluşturduğunuzda Android Studio, hata ayıklama ve yayınlanan derleme türlerini otomatik olarak oluşturur. Hata ayıklama derlemesi türü, derleme yapılandırması dosyasında görünmese de Android Studio bunu debuggable
true ile yapılandırır. Bu sayede, güvenli Android cihazlarda uygulamada hata ayıklayabilir ve uygulama imzalamayı genel bir hata ayıklama anahtar deposuyla yapılandırabilirsiniz.
Belirli ayarları eklemek veya değiştirmek istiyorsanız yapılandırmanıza hata ayıklama derlemesi türünü ekleyebilirsiniz. Aşağıdaki örnekte, hata ayıklama derleme türü için bir
applicationIdSuffix belirtilmekte ve hata ayıklama derleme türündeki ayarlar kullanılarak başlatılan bir "hazırlık" derleme türü yapılandırılmaktadır:
Kotlin
android { defaultConfig { manifestPlaceholders["hostName"] = "www.example.com" ... } buildTypes { getByName("release") { isMinifyEnabled = true proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") } getByName("debug") { applicationIdSuffix = ".debug" isDebuggable = true } /** * The `initWith` property lets you copy configurations from other build types, * then configure only the settings you want to change. This one copies the debug build * type, and then changes the manifest placeholder and application ID. */ create("staging") { initWith(getByName("debug")) manifestPlaceholders["hostName"] = "internal.example.com" applicationIdSuffix = ".debugStaging" } } }
Modern
android { defaultConfig { manifestPlaceholders = [hostName:"www.example.com"] ... } buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { applicationIdSuffix ".debug" debuggable true } /** * The `initWith` property lets you copy configurations from other build types, * then configure only the settings you want to change. This one copies the debug build * type, and then changes the manifest placeholder and application ID. */ staging { initWith debug manifestPlaceholders = [hostName:"internal.example.com"] applicationIdSuffix ".debugStaging" } } }
Not: Bir derleme yapılandırma dosyasında değişiklik yaptığınızda Android Studio, projenizi yeni yapılandırmayla senkronize etmenizi gerektirir. Projenizi senkronize etmek için değişiklik yaptığınızda görünen bildirim çubuğunda Şimdi Senkronize Et'i veya araç çubuğunda Projeyi Senkronize Et'i
tıklayın. Android Studio, yapılandırmanızda herhangi bir hata olduğunu fark ederse sorunu açıklayan Mesajlar penceresi görünür.
Derleme türleriyle yapılandırabileceğiniz tüm özellikler hakkında daha fazla bilgi edinmek için
BuildType referansını okuyun.
Ürün türlerini yapılandırma
Ürün türleri oluşturmak, derleme türleri oluşturmaya benzer. Derleme yapılandırmanızdaki productFlavors bloğuna ürün türleri ekleyin ve istediğiniz ayarları dahil edin.
defaultConfig aslında
ProductFlavor sınıfına ait olduğundan ürün türleri, defaultConfig ile aynı özellikleri destekler. Bu, defaultConfig bloğundaki tüm varyantlar için temel yapılandırmayı sağlayabileceğiniz ve her varyantın applicationId gibi varsayılan değerlerden herhangi birini değiştirebileceği anlamına gelir. Uygulama kimliği hakkında daha fazla bilgi edinmek için Uygulama kimliğini ayarlama başlıklı makaleyi okuyun.
Not: main/ manifest dosyasında package özelliğini kullanarak bir paket adı belirtmeniz gerekir. Ayrıca, R sınıfına başvurmak veya ilgili etkinlik ya da hizmet kaydını çözmek için kaynak kodunuzda bu paket adını kullanmanız gerekir. Bu sayede, kaynak kodunuzu değiştirmek zorunda kalmadan her ürün türüne paketleme ve dağıtım için benzersiz bir kimlik vermek üzere applicationId kullanabilirsiniz.
Tüm türler, ürün türlerinden oluşan adlandırılmış bir tür boyutuna ait olmalıdır. Tüm türleri bir tür boyutuna atamanız gerekir. Aksi takdirde aşağıdaki derleme hatasını alırsınız.
Error: All flavors must now belong to a named flavor dimension. The flavor 'flavor_name' is not assigned to a flavor dimension.
Belirli bir modül yalnızca bir tür boyutu belirtiyorsa Android Gradle eklentisi, modülün tüm türlerini otomatik olarak bu boyuta atar.
Aşağıdaki kod örneği, "version" adlı bir tür boyutu oluşturur ve "demo" ile "full" ürün türlerini ekler. Bu varyantlar kendi
applicationIdSuffix ve versionNameSuffix değerlerini sağlar:
Kotlin
android { ... defaultConfig {...} buildTypes { getByName("debug"){...} getByName("release"){...} } // Specifies one flavor dimension. flavorDimensions += "version" productFlavors { create("demo") { // Assigns this product flavor to the "version" flavor dimension. // If you are using only one dimension, this property is optional, // and the plugin automatically assigns all the module's flavors to // that dimension. dimension = "version" applicationIdSuffix = ".demo" versionNameSuffix = "-demo" } create("full") { dimension = "version" applicationIdSuffix = ".full" versionNameSuffix = "-full" } } }
Modern
android { ... defaultConfig {...} buildTypes { debug{...} release{...} } // Specifies one flavor dimension. flavorDimensions "version" productFlavors { demo { // Assigns this product flavor to the "version" flavor dimension. // If you are using only one dimension, this property is optional, // and the plugin automatically assigns all the module's flavors to // that dimension. dimension "version" applicationIdSuffix ".demo" versionNameSuffix "-demo" } full { dimension "version" applicationIdSuffix ".full" versionNameSuffix "-full" } } }
Not: Google Play'de APK'lar kullanarak dağıttığınız eski bir uygulamanız (Ağustos 2021'den önce oluşturulmuş) varsa uygulamanızı Google Play'de birden fazla APK desteği kullanarak dağıtmak için tüm varyantlara aynı applicationId değerini atayın ve her varyanta farklı bir versionCode verin. Uygulamanızın farklı varyantlarını Google Play'de ayrı uygulamalar olarak dağıtmak için her varyanta farklı bir applicationId atamanız gerekir.
Ürün türlerinizi oluşturup yapılandırdıktan sonra bildirim çubuğunda Şimdi Senkronize Et'i tıklayın. Senkronizasyon tamamlandıktan sonra Gradle, derleme türlerinize ve ürün türlerinize göre otomatik olarak derleme değişkenleri oluşturur ve bunları <product-flavor><Build-Type> uyarınca adlandırır. Örneğin, "demo" ve "tam" ürün türlerini oluşturup varsayılan "hata ayıklama" ve "yayın" derleme türlerini koruduysanız Gradle aşağıdaki derleme değişkenlerini oluşturur:
-
demoDebug -
demoRelease -
fullDebug -
fullRelease
Derlenecek ve çalıştırılacak derleme değişkenini seçmek için Build (Derle) > Select Build Variant'a (Derleme Değişkeni Seç) gidin ve menüden bir derleme değişkeni seçin. Her derleme değişkenini kendi özellikleri ve kaynaklarıyla özelleştirmeye başlamak için bu sayfada açıklandığı gibi kaynak grupları oluşturmanız ve yönetmeniz gerekir.
Derleme değişkenleri için uygulama kimliğini değiştirme
Uygulamanız için bir APK veya AAB oluşturduğunuzda derleme araçları, uygulamayı build.gradle.kts dosyasındaki defaultConfig bloğunda tanımlanan uygulama kimliğiyle etiketler. Bu durum aşağıdaki örnekte gösterilmiştir. Ancak uygulamanızın Google Play Store'da ayrı listelemeler olarak görünecek farklı sürümlerini (ör. "ücretsiz" ve "pro" sürüm) oluşturmak istiyorsanız her biri farklı bir uygulama kimliğine sahip ayrı derleme değişkenleri oluşturmanız gerekir.
Bu durumda, her derleme değişkenini ayrı bir ürün türü olarak tanımlayın. productFlavors bloğundaki her varyant için applicationId özelliğini yeniden tanımlayabilir veya applicationIdSuffix kullanarak varsayılan uygulama kimliğine bir segment ekleyebilirsiniz:
Kotlin
android { defaultConfig { applicationId = "com.example.myapp" } productFlavors { create("free") { applicationIdSuffix = ".free" } create("pro") { applicationIdSuffix = ".pro" } } }
Modern
android { defaultConfig { applicationId "com.example.myapp" } productFlavors { free { applicationIdSuffix ".free" } pro { applicationIdSuffix ".pro" } } }
Bu şekilde, "ücretsiz" ürün türünün uygulama kimliği "com.example.myapp.free" olur.
Ayrıca, derleme türünüze göre bir segment eklemek için applicationIdSuffix kullanabilirsiniz. Örnek:
Kotlin
android { ... buildTypes { getByName("debug") { applicationIdSuffix = ".debug" } } }
Modern
android { ... buildTypes { debug { applicationIdSuffix ".debug" } } }
Gradle, derleme türü yapılandırmasını ürün türünden sonra uyguladığı için "ücretsiz hata ayıklama" derleme değişkeninin uygulama kimliği "com.example.myapp.free.debug" olur. Aynı uygulama kimliğine sahip iki uygulama olamayacağından, hem hata ayıklama hem de yayınlanan derlemeyi aynı cihazda bulundurmak istediğinizde bu özellikten yararlanabilirsiniz.
Google Play'de APK'lar kullanarak dağıttığınız eski bir uygulamanız (Ağustos 2021'den önce oluşturulmuş) varsa ve her biri farklı bir cihaz yapılandırmasını (ör. API düzeyi) hedefleyen birden fazla APK'yı dağıtmak için aynı uygulama girişini kullanmak istiyorsanız her derleme değişkeni için aynı uygulama kimliğini kullanmanız ancak her APK'ya farklı bir versionCode vermeniz gerekir. Daha fazla bilgi için Birden fazla APK desteği başlıklı makaleyi okuyun. AAB'ler kullanılarak yapılan yayınlama işlemi, varsayılan olarak tek bir sürüm kodu ve uygulama kimliği kullanan tek bir yapı kullandığından bu durumdan etkilenmez.
İpucu: Manifesto dosyanızda uygulama kimliğine referans vermeniz gerekiyorsa herhangi bir manifesto özelliğinde ${applicationId} yer tutucusunu kullanabilirsiniz. Derleme sırasında Gradle, bu etiketi gerçek uygulama kimliğiyle değiştirir. Daha fazla bilgi için Derleme değişkenlerini manifest dosyasına ekleme başlıklı makaleyi inceleyin.
Tür boyutlarıyla birden fazla ürün türünü birleştirme
Bazı durumlarda, birden fazla ürün türünün yapılandırmalarını birleştirmek isteyebilirsiniz. Örneğin, API düzeyine göre "tam" ve "demo" ürün türleri için farklı yapılandırmalar oluşturmak isteyebilirsiniz. Android Gradle eklentisi, bunu yapabilmeniz için tür boyutları olarak birden fazla ürün türü grubu oluşturmanıza olanak tanır.
Gradle, uygulamanızı oluştururken tanımladığınız her tür boyutundan bir ürün türü yapılandırmasını ve bir derleme türü yapılandırmasını birleştirerek nihai derleme değişkenini oluşturur. Gradle, aynı tür boyutuna ait ürün türlerini birleştirmez.
Aşağıdaki kod örneğinde, "full" ve "demo" ürün türlerini gruplandırmak için "mode" tür boyutunu ve ürün türü yapılandırmalarını API düzeyine göre gruplandırmak için "api" tür boyutunu oluşturmak üzere
flavorDimensions özelliği kullanılmaktadır:
Kotlin
android { ... buildTypes { getByName("debug") {...} getByName("release") {...} } // Specifies the flavor dimensions you want to use. The order in which you // list the dimensions determines their priority, from highest to lowest, // when Gradle merges variant sources and configurations. You must assign // each product flavor you configure to one of the flavor dimensions. flavorDimensions += listOf("api", "mode") productFlavors { create("demo") { // Assigns this product flavor to the "mode" flavor dimension. dimension = "mode" ... } create("full") { dimension = "mode" ... } // Configurations in the "api" product flavors override those in "mode" // flavors and the defaultConfig block. Gradle determines the priority // between flavor dimensions based on the order in which they appear next // to the flavorDimensions property, with the first dimension having a higher // priority than the second, and so on. create("minApi24") { dimension = "api" minSdk = 24 // To ensure the target device receives the version of the app with // the highest compatible API level, assign version codes in increasing // value with API level. versionCode = 30000 + (android.defaultConfig.versionCode ?: 0) versionNameSuffix = "-minApi24" ... } create("minApi23") { dimension = "api" minSdk = 23 versionCode = 20000 + (android.defaultConfig.versionCode ?: 0) versionNameSuffix = "-minApi23" ... } create("minApi21") { dimension = "api" minSdk = 21 versionCode = 10000 + (android.defaultConfig.versionCode ?: 0) versionNameSuffix = "-minApi21" ... } } } ...
Modern
android { ... buildTypes { debug {...} release {...} } // Specifies the flavor dimensions you want to use. The order in which you // list the dimensions determines their priority, from highest to lowest, // when Gradle merges variant sources and configurations. You must assign // each product flavor you configure to one of the flavor dimensions. flavorDimensions "api", "mode" productFlavors { demo { // Assigns this product flavor to the "mode" flavor dimension. dimension "mode" ... } full { dimension "mode" ... } // Configurations in the "api" product flavors override those in "mode" // flavors and the defaultConfig block. Gradle determines the priority // between flavor dimensions based on the order in which they appear next // to the flavorDimensions property, with the first dimension having a higher // priority than the second, and so on. minApi24 { dimension "api" minSdkVersion 24 // To ensure the target device receives the version of the app with // the highest compatible API level, assign version codes in increasing // value with API level. versionCode 30000 + android.defaultConfig.versionCode versionNameSuffix "-minApi24" ... } minApi23 { dimension "api" minSdkVersion 23 versionCode 20000 + android.defaultConfig.versionCode versionNameSuffix "-minApi23" ... } minApi21 { dimension "api" minSdkVersion 21 versionCode 10000 + android.defaultConfig.versionCode versionNameSuffix "-minApi21" ... } } } ...
Gradle'ın oluşturduğu derleme değişkenlerinin sayısı, her bir tür boyutundaki tür sayısının yapılandırdığınız derleme türlerinin sayısıyla çarpımına eşittir. Gradle her derleme değişkenini veya karşılık gelen yapıları adlandırırken, daha yüksek öncelikli tür boyutuna ait ürün türleri önce, ardından daha düşük öncelikli boyutlara ait ürün türleri ve son olarak derleme türü görünür.
Önceki derleme yapılandırmasını örnek olarak kullanırsak Gradle, aşağıdaki adlandırma şemasına sahip toplam 12 derleme değişkeni oluşturur:
- Derleme değişkeni:
[minApi24, minApi23, minApi21][Demo, Full][Debug, Release] - İlgili APK:
app-[minApi24, minApi23, minApi21]-[demo, full]-[debug, release].apk - Örneğin,
- Derleme değişkeni:
minApi24DemoDebug - İlgili APK:
app-minApi24-demo-debug.apk
Her bir ürün türü ve derleme değişkeni için oluşturabileceğiniz kaynak grubu dizinlerine ek olarak, ürün türlerinin her bir kombinasyonu için de kaynak grubu dizinleri oluşturabilirsiniz. Örneğin, Java kaynakları oluşturup src/demoMinApi24/java/ dizinine ekleyebilirsiniz. Gradle, bu kaynakları yalnızca bu iki ürün türünü birleştiren bir varyant oluştururken kullanır.
Ürün türü kombinasyonları için oluşturduğunuz kaynak grupları, her bir ürün türüne ait kaynak gruplarından daha yüksek önceliğe sahiptir. Kaynak grupları ve Gradle'ın kaynakları nasıl birleştirdiği hakkında daha fazla bilgi edinmek için kaynak grupları oluşturma ile ilgili bölümü okuyun.
Filtre varyantları
Gradle, yapılandırdığınız ürün türlerinin ve derleme türlerinin her olası kombinasyonu için bir derleme değişkeni oluşturur. Ancak projeniz bağlamında ihtiyacınız olmayan veya anlamlı olmayan bazı derleme değişkenleri olabilir. Belirli derleme değişkeni yapılandırmalarını kaldırmak için modül düzeyindeki build.gradle.kts dosyanızda bir varyant filtresi oluşturun.
Önceki bölümdeki derleme yapılandırmasını örnek olarak kullanırsak uygulamanın demo sürümü için yalnızca API düzeyi 23 ve sonraki sürümleri desteklemeyi planladığınızı varsayalım. "minApi21" ve "demo" ürün türlerini birleştiren tüm derleme değişkeni yapılandırmalarını filtrelemek için
variantFilter bloğunu kullanabilirsiniz:
Kotlin
android { ... buildTypes {...} flavorDimensions += listOf("api", "mode") productFlavors { create("demo") {...} create("full") {...} create("minApi24") {...} create("minApi23") {...} create("minApi21") {...} } } androidComponents { beforeVariants { variantBuilder -> // To check for a certain build type, use variantBuilder.buildType == "<buildType>" if (variantBuilder.productFlavors.containsAll(listOf("api" to "minApi21", "mode" to "demo"))) { // Gradle ignores any variants that satisfy the conditions above. variantBuilder.enable = false } } } ...
Modern
android { ... buildTypes {...} flavorDimensions "api", "mode" productFlavors { demo {...} full {...} minApi24 {...} minApi23 {...} minApi21 {...} } variantFilter { variant -> def names = variant.flavors*.name // To check for a certain build type, use variant.buildType.name == "<buildType>" if (names.contains("minApi21") && names.contains("demo")) { // Gradle ignores any variants that satisfy the conditions above. setIgnore(true) } } } ...
Derleme yapılandırmanıza bir değişken filtresi ekleyip bildirim çubuğunda Şimdi Senkronize Et'i tıkladığınızda Gradle, belirttiğiniz koşulları karşılayan tüm derleme değişkenlerini yoksayar. Menü çubuğundan Build > Select Build Variant'ı (Derleme > Derleme Değişkeni Seç) veya araç penceresi çubuğunda Build Variants'ı (Derleme Değişkenleri)
tıkladığınızda derleme varyantları artık menüde görünmez.
Kaynak grupları oluşturma
Android Studio, varsayılan olarak tüm derleme varyantlarınız arasında paylaşmak istediğiniz her şey için main/
kaynak grubunu ve dizinleri oluşturur. Ancak Gradle'ın belirli derleme türleri, ürün türleri, ürün türü kombinasyonları (tür boyutları kullanırken) ve derleme değişkenleri için tam olarak hangi dosyaları derleyip paketleyeceğini kontrol etmek üzere yeni kaynak grupları oluşturabilirsiniz.
Örneğin, main/ kaynak grubunda temel işlevleri tanımlayabilir ve farklı müşteriler için uygulamanızın markasını değiştirmek üzere ürün türü kaynak gruplarını kullanabilir ya da yalnızca hata ayıklama derlemesi türünü kullanan derleme değişkenleri için özel izinler ve günlük kaydı işlevleri ekleyebilirsiniz.
Gradle, kaynak grubu dosyalarının ve dizinlerinin main/ kaynak grubuna benzer şekilde belirli bir düzende olmasını bekler. Örneğin Gradle, "hata ayıklama" derleme türünüze özgü Kotlin veya Java sınıf dosyalarının src/debug/kotlin/ ya da src/debug/java/ dizinlerinde bulunmasını bekler.
Android Gradle eklentisi, her derleme türü, ürün türü ve derleme değişkeni için dosyalarınızı nasıl düzenleyeceğinizi gösteren kullanışlı bir Gradle görevi sunar. Örneğin, görev çıkışından alınan aşağıdaki örnek, Gradle'ın "hata ayıklama" derleme türü için belirli dosyaları nerede bulmayı beklediğini açıklar:
------------------------------------------------------------ Project :app ------------------------------------------------------------ ... debug ---- Compile configuration: debugCompile build.gradle name: android.sourceSets.debug Java sources: [app/src/debug/java] Kotlin sources: [app/src/debug/kotlin, app/src/debug/java] Manifest file: app/src/debug/AndroidManifest.xml Android resources: [app/src/debug/res] Assets: [app/src/debug/assets] AIDL sources: [app/src/debug/aidl] RenderScript sources: [app/src/debug/rs] JNI sources: [app/src/debug/jni] JNI libraries: [app/src/debug/jniLibs] Java-style resources: [app/src/debug/resources]
Bu çıkışı görüntülemek için aşağıdaki adımları uygulayın:
- Araç penceresi çubuğunda Gradle'ı tıklayın.
MyApplication > Tasks > android'e gidin ve sourceSets'i çift tıklayın.
Tasks klasörünü görmek için Gradle'ın senkronizasyon sırasında görev listesini oluşturmasına izin vermeniz gerekir. Bunun için uygulamanız gereken adımlar şunlardır:
- File > Settings > Experimental (macOS'te Android Studio > Settings > Experimental) seçeneğini tıklayın.
- Do not build Gradle task list during Gradle sync (Gradle senkronizasyonu sırasında Gradle görev listesi oluşturma) seçeneğinin işaretini kaldırın.
- Gradle görevi yürüttükten sonra çıkışı görüntülemek için Run (Çalıştır) penceresi açılır.
Not: Görev çıktısı, uygulamanız için test çalıştırmak amacıyla kullanmak istediğiniz dosyaların kaynak gruplarını nasıl düzenleyeceğinizi de gösterir. Örneğin, test/ ve androidTest/
test kaynak grupları.
Yeni bir derleme değişkeni oluşturduğunuzda Android Studio, kaynak grubu dizinlerini sizin için oluşturmaz ancak size yardımcı olacak birkaç seçenek sunar. Örneğin, "debug" derleme türünüz için yalnızca java/ dizinini oluşturmak istiyorsanız:
- Project (Proje) bölmesini açın ve bölmenin üst kısmındaki menüden Project (Proje) görünümünü seçin.
MyProject/app/src/uygulamasına gidin.srcdizinini sağ tıklayın ve Yeni > Dizin'i seçin.- Gradle Source Sets (Gradle Kaynak Grupları) altındaki menüden full/java'yı seçin.
- Enter tuşuna basın.
Android Studio, hata ayıklama derleme türünüz için bir kaynak grubu dizini ve ardından bu dizinin içinde java/ dizinini oluşturur. Alternatif olarak, projenize belirli bir derleme değişkeni için yeni bir dosya eklediğinizde Android Studio dizinleri sizin için oluşturabilir.
Örneğin, "hata ayıklama" derleme türünüz için bir değerler XML dosyası oluşturmak istiyorsanız:
- Project (Proje) bölmesinde
srcdizinini sağ tıklayın ve New (Yeni) > XML > Values XML File'ı (Değerler XML Dosyası) seçin. - XML dosyasının adını girin veya varsayılan adı kullanın.
- Target Source Set'in (Hedef Kaynak Grubu) yanındaki menüden debug'ı (hata ayıklama) seçin.
- Son'u tıklayın.
"Hata ayıklama" derleme türü hedef kaynak grubu olarak belirtildiğinden, Android Studio XML dosyasını oluştururken gerekli dizinleri otomatik olarak oluşturur. Elde edilen dizin yapısı Şekil 1'deki gibi görünür.
Şekil 1. "Hata ayıklama" derleme türü için yeni kaynak grubu dizinleri.
Etkin kaynak gruplarının simgelerinde, etkin olduklarını gösteren yeşil bir gösterge bulunur. debug kaynak grubu, main kaynak grubuyla birleştirileceğini göstermek için [main] son ekini alır.
Aynı prosedürü kullanarak src/demo/ gibi ürün türleri ve src/demoDebug/ gibi derleme değişkenleri için kaynak grubu dizinleri de oluşturabilirsiniz. Ayrıca, src/androidTestDemoDebug/ gibi belirli derleme değişkenlerini hedefleyen test kaynak grupları da oluşturabilirsiniz. Daha fazla bilgi edinmek için kaynak gruplarını test etme konusunu okuyun.
Varsayılan kaynak grubu yapılandırmalarını değiştirme
Kaynak grupları oluşturma ile ilgili önceki bölümde açıklandığı gibi, Gradle'ın beklediği varsayılan kaynak grubu dosya yapısına göre düzenlenmemiş kaynaklarınız varsa Gradle'ın bir kaynak grubunun her bileşeni için dosya toplamak üzere baktığı yeri değiştirmek üzere
sourceSets bloğunu kullanabilirsiniz.
sourceSets bloğu, android bloğunun içinde olmalıdır. Kaynak dosyaları yeniden konumlandırmanız gerekmez. Gradle'a yalnızca, her bir kaynak grubu bileşeni için dosyaları bulabileceği, modül düzeyindeki build.gradle.kts dosyasına göre yolları sağlamanız gerekir. Hangi bileşenleri yapılandırabileceğinizi ve bunları birden fazla dosya veya dizine eşleyip eşleyemeyeceğinizi öğrenmek için Android Gradle eklentisi API referansı'na bakın.
Aşağıdaki kod örneği, app/other/ dizinindeki kaynakları main kaynak grubunun belirli bileşenleriyle eşler ve androidTest kaynak grubunun kök dizinini değiştirir:
Kotlin
android { ... // Encapsulates configurations for the main source set. sourceSets.getByName("main") { // Changes the directory for Java sources. The default directory is // 'src/main/java'. java.setSrcDirs(listOf("other/java")) // If you list multiple directories, Gradle uses all of them to collect // sources. Because Gradle gives these directories equal priority, if // you define the same resource in more than one directory, you receive an // error when merging resources. The default directory is 'src/main/res'. res.setSrcDirs(listOf("other/res1", "other/res2")) // Note: Avoid specifying a directory that is a parent to one // or more other directories you specify. For example, avoid the following: // res.srcDirs = ['other/res1', 'other/res1/layouts', 'other/res1/strings'] // Specify either only the root 'other/res1' directory or only the // nested 'other/res1/layouts' and 'other/res1/strings' directories. // For each source set, you can specify only one Android manifest. // By default, Android Studio creates a manifest for your main source // set in the src/main/ directory. manifest.srcFile("other/AndroidManifest.xml") ... } // Create additional blocks to configure other source sets. sourceSets.getByName("androidTest") { // If all the files for a source set are located under a single root // directory, you can specify that directory using the setRoot property. // When gathering sources for the source set, Gradle looks only in locations // relative to the root directory you specify. For example, after applying the // configuration below for the androidTest source set, Gradle looks for Java // sources only in the src/tests/java/ directory. setRoot("src/tests") ... } } ...
Modern
android { ... sourceSets { // Encapsulates configurations for the main source set. main { // Changes the directory for Java sources. The default directory is // 'src/main/java'. java.srcDirs = ['other/java'] // If you list multiple directories, Gradle uses all of them to collect // sources. Because Gradle gives these directories equal priority, if // you define the same resource in more than one directory, you receive an // error when merging resources. The default directory is 'src/main/res'. res.srcDirs = ['other/res1', 'other/res2'] // Note: Avoid specifying a directory that is a parent to one // or more other directories you specify. For example, avoid the following: // res.srcDirs = ['other/res1', 'other/res1/layouts', 'other/res1/strings'] // Specify either only the root 'other/res1' directory or only the // nested 'other/res1/layouts' and 'other/res1/strings' directories. // For each source set, you can specify only one Android manifest. // By default, Android Studio creates a manifest for your main source // set in the src/main/ directory. manifest.srcFile 'other/AndroidManifest.xml' ... } // Create additional blocks to configure other source sets. androidTest { // If all the files for a source set are located under a single root // directory, you can specify that directory using the setRoot property. // When gathering sources for the source set, Gradle looks only in locations // relative to the root directory you specify. For example, after applying the // configuration below for the androidTest source set, Gradle looks for Java // sources only in the src/tests/java/ directory. setRoot 'src/tests' ... } } } ...
Bir kaynak dizinin yalnızca bir kaynak grubuna ait olabileceğini unutmayın. Örneğin, aynı test kaynaklarını hem test hem de androidTest kaynak gruplarıyla paylaşamazsınız. Bunun nedeni, Android Studio'nun her kaynak grubu için ayrı IntelliJ modülleri oluşturması ve kaynak grupları arasında yinelenen içerik köklerini destekleyememesidir.
Kaynak gruplarıyla derleme
Yalnızca belirli yapılandırmalarla paketlenmesini istediğiniz kod ve kaynakları barındırmak için kaynak grubu dizinlerini kullanabilirsiniz. Örneğin, "demo" ürün türü ve "debug" derleme türünün çapraz ürünü olan "demoDebug" derleme değişkenini oluşturuyorsanız Gradle bu dizinlere bakar ve onlara aşağıdaki önceliği verir:
-
src/demoDebug/(derleme değişkeni kaynak grubu) -
src/debug/(derleme türü kaynak grubu) -
src/demo/(ürün türü kaynak grubu) -
src/main/(ana kaynak grubu)
Ürün türü kombinasyonları için oluşturulan kaynak grupları, tüm tür boyutlarını içermelidir. Örneğin, derleme değişkeni kaynak grubu, derleme türü ile tüm tür boyutlarının kombinasyonu olmalıdır. Tüm tür boyutlarını değil, birden fazla tür boyutunu kapsayan klasörleri içeren kod ve kaynakların birleştirilmesi desteklenmez.
Birden fazla ürün türünü birleştirirseniz ürün türleri arasındaki öncelik, ait oldukları tür boyutuna göre belirlenir. Tür boyutlarını
android.flavorDimensions özelliğiyle listelerken ürün türleri, boyutlarının tanımlandığı sıraya göre önceliklendirilir. Önceki boyutlar, sonraki boyutlara göre önceliklidir. Ayrıca, ürün türü kombinasyonları için oluşturduğunuz kaynak grupları, tek bir ürün türüne ait kaynak gruplarından daha yüksek önceliğe sahiptir.
Öncelik sırası, Gradle kod ve kaynakları birleştirdiğinde hangi kaynak grubunun daha yüksek önceliğe sahip olduğunu belirler. demoDebug/ kaynak grubu dizini büyük olasılıkla ilgili derleme varyantına özgü dosyalar içerdiğinden, demoDebug/ debug/ içinde de tanımlanmış bir dosya içeriyorsa Gradle, demoDebug/ kaynak grubundaki dosyayı kullanır. Benzer şekilde Gradle, derleme türü ve ürün türü kaynak gruplarındaki dosyalara main/ içindeki aynı dosyalardan daha yüksek öncelik verir.
Gradle, aşağıdaki derleme kurallarını uygularken bu öncelik sırasını dikkate alır:
kotlin/veyajava/dizinlerindeki tüm kaynak kodlar tek bir çıktı oluşturmak için birlikte derlenir.Not: Belirli bir derleme değişkeni için Gradle, aynı Kotlin veya Java sınıfını tanımlayan iki ya da daha fazla kaynak grubu diziniyle karşılaşırsa derleme hatası verir. Örneğin, hata ayıklama uygulaması oluştururken hem
src/debug/Utility.kthem desrc/main/Utility.kttanımlayamazsınız. Bunun nedeni, Gradle'ın derleme işlemi sırasında bu dizinlerin her ikisine de bakması ve "yinelenen sınıf" hatası vermesidir. Farklı derleme türleri içinUtility.ktdosyasının farklı sürümlerini kullanmak istiyorsanız her derleme türü, dosyanın kendi sürümünü tanımlamalı ve dosyayımain/kaynak grubuna dahil etmemelidir.- Manifestler tek bir manifestte birleştirilir. Öncelik, önceki örnekteki listeyle aynı sırayla verilir. Örneğin, bir derleme türünün manifest ayarları, bir ürün türünün manifest ayarlarını geçersiz kılar. Daha fazla bilgi edinmek için manifest birleştirme hakkında bilgi edinin.
values/dizinlerindeki dosyalar birleştirilir. İki dosyanın adı aynıysa (ör. ikistrings.xmldosyası) öncelik, önceki örnekteki listeyle aynı sırayla verilir. Örneğin, derleme türü kaynak grubundaki bir dosyada tanımlanan değerler, bir ürün türündeki aynı dosyada tanımlanan değerleri geçersiz kılar.res/veasset/dizinlerindeki kaynaklar birlikte paketlenir. İki veya daha fazla kaynak grubunda aynı ada sahip kaynaklar tanımlanmışsa öncelik, önceki örnekteki listeyle aynı sırayla verilir.- Gradle, uygulamayı oluştururken kitaplık modülü bağımlılıklarına dahil edilen kaynaklara ve manifestlere en düşük önceliği verir.
Bağımlılıkları bildirme
Belirli bir derleme değişkeni veya test kaynak grubu için bağımlılık yapılandırmak istiyorsanız aşağıdaki örnekte gösterildiği gibi, derleme değişkeninin veya test kaynak grubunun adını Implementation anahtar kelimesinden önce ekleyin:
Kotlin
dependencies { // Adds the local "mylibrary" module as a dependency to the "free" flavor. "freeImplementation"(project(":mylibrary")) // 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("com.android.support.test.espresso:espresso-core:3.6.1") }
Modern
dependencies { // Adds the local "mylibrary" module as a dependency to the "free" flavor. freeImplementation project(":mylibrary") // 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 'com.android.support.test.espresso:espresso-core:3.6.1' }
Bağımlılıkları yapılandırma hakkında daha fazla bilgi için Derleme bağımlılıkları ekleme başlıklı makaleyi inceleyin.
Varyantları dikkate alan bağımlılık yönetimini kullanma
Android Gradle eklentisi 3.0.0 ve sonraki sürümler, bir kitaplığı kullanırken varyantları otomatik olarak eşleştiren yeni bir bağımlılık mekanizması içerir. Örneğin, bir uygulamanın debug varyantı, bir kitaplığın debug varyantını otomatik olarak kullanır. Bu özellik, varyantlar kullanılırken de çalışır: Bir uygulamanın freeDebug varyantı, bir kitaplığın freeDebug varyantını kullanır.
Eklentinin varyantları doğru şekilde eşleştirmesi için doğrudan eşleşmenin mümkün olmadığı durumlarda aşağıdaki bölümde açıklandığı gibi eşleşen yedekler sağlamanız gerekir.
Örneğin, uygulamanızın "hazırlık" adlı bir derleme türü yapılandırdığını ancak kitaplık bağımlılıklarından birinin bunu yapmadığını varsayalım. Eklenti, uygulamanızın "hazırlık" sürümünü oluşturmaya çalıştığında kitaplığın hangi sürümünü kullanacağını bilemez ve aşağıdakine benzer bir hata mesajı görürsünüz:
Error:Failed to resolve: Could not resolve project :mylibrary.
Required by:
project :app
Varyant eşleştirme ile ilgili derleme hatalarını çözme
Eklenti, bir uygulama ile bağımlılık arasında doğrudan değişken eşleşmesinin mümkün olmadığı durumları Gradle'ın nasıl çözeceğini kontrol etmenize yardımcı olan DSL öğeleri içerir.
Aşağıda, varyant uyumlu bağımlılık eşleştirme ile ilgili sorunların ve DSL özelliklerini kullanarak bu sorunların nasıl çözüleceğinin listesi verilmiştir:
Uygulamanızda, kitaplık bağımlılığının içermediği bir derleme türü var.
Örneğin, uygulamanızda "hazırlık" derleme türü var ancak bir bağımlılık yalnızca "hata ayıklama" ve "yayın" derleme türlerini içeriyor.
Kitaplık bağımlılığı, uygulamanızda bulunmayan bir derleme türü içeriyorsa sorun yaşanmaz. Bunun nedeni, eklentinin bağımlılıktan hiçbir zaman bu derleme türünü istememesidir.
Belirli bir derleme türü için alternatif eşleşmeleri belirtmek üzere
matchingFallbackskullanın. Örnek:Kotlin
// In the app's build.gradle.kts file. android { buildTypes { getByName("debug") {} getByName("release") {} create("staging") { // Specifies a sorted list of fallback build types that the // plugin can try to use when a dependency does not include a // "staging" build type. You may specify as many fallbacks as you // like, and the plugin selects the first build type that's // available in the dependency. matchingFallbacks += listOf("debug", "qa", "release") } } }
Modern
// In the app's build.gradle file. android { buildTypes { debug {} release {} staging { // Specifies a sorted list of fallback build types that the // plugin can try to use when a dependency does not include a // "staging" build type. You may specify as many fallbacks as you // like, and the plugin selects the first build type that's // available in the dependency. matchingFallbacks = ['debug', 'qa', 'release'] } } }
Hem uygulamada hem de uygulamanın kitaplık bağımlılığında bulunan belirli bir tür boyutu için uygulamanız, kitaplıkta bulunmayan türler içeriyor.
Örneğin, hem uygulamanız hem de kitaplık bağımlılıkları bir "katman" tür boyutu içerir. Ancak uygulamadaki "katman" boyutu "ücretsiz" ve "ücretli" varyantları içerirken bir bağımlılık, aynı boyut için yalnızca "demo" ve "ücretli" varyantları içerir.
Hem uygulamada hem de kitaplık bağımlılıklarında bulunan belirli bir tür boyutu için, kitaplıkta uygulamanızda bulunmayan bir ürün türü varsa sorun yaşanmaz. Bunun nedeni, eklentinin bağımlılıktan hiçbir zaman bu varyantı istememesidir.
Uygulamanın "ücretsiz" ürün türü için alternatif eşleşmeleri belirtmek üzere
matchingFallbackskullanın. Örnek:Kotlin
// In the app's build.gradle.kts file. android { defaultConfig{ // Don't configure matchingFallbacks in the defaultConfig block. // Instead, specify fallbacks for a given product flavor in the // productFlavors block, as shown below. } flavorDimensions += "tier" productFlavors { create("paid") { dimension = "tier" // Because the dependency already includes a "paid" flavor in its // "tier" dimension, you don't need to provide a list of fallbacks // for the "paid" flavor. } create("free") { dimension = "tier" // Specifies a sorted list of fallback flavors that the plugin // can try to use when a dependency's matching dimension does // not include a "free" flavor. Specify as many // fallbacks as you like; the plugin selects the first flavor // that's available in the dependency's "tier" dimension. matchingFallbacks += listOf("demo", "trial") } } }
Modern
// In the app's build.gradle file. android { defaultConfig{ // Don't configure matchingFallbacks in the defaultConfig block. // Instead, specify fallbacks for a given product flavor in the // productFlavors block, as shown below. } flavorDimensions 'tier' productFlavors { paid { dimension 'tier' // Because the dependency already includes a "paid" flavor in its // "tier" dimension, you don't need to provide a list of fallbacks // for the "paid" flavor. } free { dimension 'tier' // Specifies a sorted list of fallback flavors that the plugin // can try to use when a dependency's matching dimension does // not include a "free" flavor. Specify as many // fallbacks as you like; the plugin selects the first flavor // that's available in the dependency's "tier" dimension. matchingFallbacks = ['demo', 'trial'] } } }
Kitaplık bağımlılığı, uygulamanızda bulunmayan bir tür boyutu içeriyor.
Örneğin, bir kitaplık bağımlılığı "minApi" boyutu için varyantlar içeriyor ancak uygulamanız yalnızca "katman" boyutu için varyantlar içeriyor. Uygulamanızın "freeDebug" sürümünü derlemek istediğinizde eklenti, bağımlılığın "minApi23Debug" veya "minApi18Debug" sürümünü kullanıp kullanmayacağını bilemez.
Uygulamanızda, kitaplık bağımlılığının içermediği bir tür boyutu varsa sorun yaşanmaz. Bunun nedeni, eklentinin yalnızca bağımlılıkta bulunan boyutların varyantlarıyla eşleşmesidir. Örneğin, bir bağımlılık ABI'ler için boyut içermiyorsa uygulamanızın "freeX86Debug" sürümü, bağımlılığın "freeDebug" sürümünü kullanır.
Eklentinin her eksik boyuttan seçeceği varsayılan varyantı belirtmek için
defaultConfigbloğundamissingDimensionStrategykullanın. Aşağıdaki örnekte bu gösterilmektedir. AyrıcaproductFlavorsbloğundaki seçimlerinizi geçersiz kılabilirsiniz. Böylece her varyant, eksik bir boyut için farklı bir eşleştirme stratejisi belirtebilir.Kotlin
// In the app's build.gradle.kts file. android { defaultConfig{ // Specifies a sorted list of flavors that the plugin can try to use from // a given dimension. This tells the plugin to select the "minApi18" flavor // when encountering a dependency that includes a "minApi" dimension. // You can include additional flavor names to provide a // sorted list of fallbacks for the dimension. missingDimensionStrategy("minApi", "minApi18", "minApi23") // Specify a missingDimensionStrategy property for each // dimension that exists in a local dependency but not in your app. missingDimensionStrategy("abi", "x86", "arm64") } flavorDimensions += "tier" productFlavors { create("free") { dimension = "tier" // You can override the default selection at the product flavor // level by configuring another missingDimensionStrategy property // for the "minApi" dimension. missingDimensionStrategy("minApi", "minApi23", "minApi18") } create("paid") {} } }
Modern
// In the app's build.gradle file. android { defaultConfig{ // Specifies a sorted list of flavors that the plugin can try to use from // a given dimension. This tells the plugin to select the "minApi18" flavor // when encountering a dependency that includes a "minApi" dimension. // You can include additional flavor names to provide a // sorted list of fallbacks for the dimension. missingDimensionStrategy 'minApi', 'minApi18', 'minApi23' // Specify a missingDimensionStrategy property for each // dimension that exists in a local dependency but not in your app. missingDimensionStrategy 'abi', 'x86', 'arm64' } flavorDimensions 'tier' productFlavors { free { dimension 'tier' // You can override the default selection at the product flavor // level by configuring another missingDimensionStrategy property // for the 'minApi' dimension. missingDimensionStrategy 'minApi', 'minApi23', 'minApi18' } paid {} } }
Daha fazla bilgi için Android Gradle eklentisi DSL referansındaki matchingFallbacks
ve missingDimensionStrategy
bölümlerini inceleyin.
İmzalama ayarlarını yapılandırma
Gradle, bu derleme için açıkça bir imza yapılandırması tanımlamadığınız sürece yayınlanan derlemenizin APK'sını veya AAB'sini imzalamaz. Henüz imzalama anahtarınız yoksa Android Studio'yu kullanarak bir yükleme anahtarı ve anahtar deposu oluşturun.
Gradle derleme yapılandırmalarını kullanarak yayınlanan derleme türünüzün imza yapılandırmalarını manuel olarak yapılandırmak için:
- Anahtar deposu oluşturun. Anahtar deposu, bir dizi özel anahtar içeren ikili program dosyasıdır. Anahtar deponuzu güvenli bir yerde saklamanız gerekir.
- Özel anahtar oluşturun. Özel anahtar, uygulamanızı dağıtım için imzalamak amacıyla kullanılır ve hiçbir zaman uygulamaya dahil edilmez veya yetkisiz üçüncü taraflara açıklanmaz.
-
İmza yapılandırmasını modül düzeyindeki
build.gradle.ktsdosyasına ekleyin:Kotlin
... android { ... defaultConfig {...} signingConfigs { create("release") { storeFile = file("myreleasekey.keystore") storePassword = "password" keyAlias = "MyReleaseKey" keyPassword = "password" } } buildTypes { getByName("release") { ... signingConfig = signingConfigs.getByName("release") } } }
Modern
... android { ... defaultConfig {...} signingConfigs { release { storeFile file("myreleasekey.keystore") storePassword "password" keyAlias "MyReleaseKey" keyPassword "password" } } buildTypes { release { ... signingConfig signingConfigs.release } } }
Not: Sürüm anahtarınızın ve anahtar deponuzun şifrelerini derleme dosyasına eklemek güvenlik açısından iyi bir uygulama değildir. Bunun yerine, derleme dosyasını bu şifreleri ortam değişkenlerinden alacak veya derleme işleminin bu şifreleri size soracağı şekilde yapılandırın.
Bu şifreleri ortam değişkenlerinden almak için:
Kotlin
storePassword = System.getenv("KSTOREPWD") keyPassword = System.getenv("KEYPWD")
Modern
storePassword System.getenv("KSTOREPWD") keyPassword System.getenv("KEYPWD")
Alternatif olarak, anahtar deposunu yerel bir özellikler dosyasından yükleyebilirsiniz. Güvenlik nedeniyle bu dosyayı kaynak denetimine eklemeyin. Bunun yerine, her geliştirici için yerel olarak ayarlayın. Daha fazla bilgi için İmzalama bilgilerini derleme dosyalarınızdan kaldırma başlıklı makaleyi inceleyin.
Bu işlemi tamamladıktan sonra uygulamanızı dağıtabilir ve Google Play'de yayınlayabilirsiniz.
Uyarı: Anahtar deponuzu ve özel anahtarınızı güvenli bir yerde saklayın ve bunların güvenli yedeklerini aldığınızdan emin olun. Google Play Uygulama İmzalama'yı kullanıyorsanız ve yükleme anahtarınızı kaybederseniz Google Play Console'u kullanarak sıfırlama isteğinde bulunabilirsiniz. Play Uygulama İmzalama olmadan bir uygulama yayınlıyorsanız (Ağustos 2021'den önce oluşturulan uygulamalar için) ve uygulama imzalama anahtarınızı kaybederseniz uygulamanızın tüm sürümlerini her zaman aynı anahtarla imzalamanız gerektiğinden uygulamanızda güncelleme yayınlayamazsınız.
Wear OS uygulamalarını imzalama
Wear OS uygulamaları yayınlanırken hem saat APK'sı hem de isteğe bağlı telefon APK'sı aynı anahtarla imzalanmalıdır. Wear OS uygulamalarını paketleme ve imzalama hakkında daha fazla bilgi için Wear uygulamalarını paketleme ve dağıtma başlıklı makaleyi inceleyin.