Bu sayfada, derleme varyantlarını tek bir projeden uygulamanızın farklı sürümlerini oluşturabilir ve de dahil olmak üzere, bağımlılıklarınızı ve imzalama yapılandırmalarınızı
Her derleme varyantı, uygulamanızın farklı bir sürümünü temsil eder sizsiniz. Örneğin, uygulamanızın farklı bir sürümünü oluşturmak isteyebilirsiniz. ücretsiz olarak sunulan ücretli başka bir sürüm ise daha fazlasını içerir. Uygulamanızın, oyununuzun performansını gösteren ve göre otomatik olarak değişir.
Derleme varyantları, belirli bir öğe kullanan Gradle'ın sonucudur yapılandırılmış ayarları, kodu ve kaynakları birleştirmeye yarayan bir dizi ve ürün aromaları var. Derleme varyantlarını yapılandırmasanız bile bunları oluşturan derleme türlerini ve ürün aromalarını doğrudan yapılandırırsınız.
Örneğin, bir "demo" ürün aroması belirli özellikleri belirtebilir
ve cihaz gereksinimleri (özel kaynak kodu, kaynaklar ve minimum değer gibi)
API düzeyleri, "hata ayıklama" build type (yapılandırma türü), farklı derlemeleri uygular ve
hata ayıklama seçenekleri ve imzalama anahtarları gibi paketleme ayarlarını değiştirebilirsiniz. İlgili içeriği oluşturmak için kullanılan
Bu ikisini birleştiren derleme varyantı "demoDebug"dür ve uygulamanızın üzerinde bir sürüm yüklü
"demo"da yer alan yapılandırma ve kaynakların kombinasyonu
ürün aroması, "debug" derleme türü ve main/
kaynak grubu.
Derleme türlerini yapılandırma
Derleme türlerini android
içinde oluşturup yapılandırabilirsiniz.
modül düzeyindeki build.gradle.kts
dosyasının bloğunu içerir. Oluştururken
Android Studio, hata ayıklama ve sürüm derlemesini otomatik olarak
bulunur. Hata ayıklama derleme türü, derleme yapılandırmasında görünmese de
dosyasını yüklediğinizde Android Studio bunu debuggable
true
ile yapılandırır. Bu sayede, güvenli Android cihazlarda uygulamadaki hataları ayıklayabilirsiniz.
uygulama imzalamayı genel bir hata ayıklama anahtar deposuyla yapılandırır.
İsterseniz hata ayıklama derleme türünü yapılandırmanıza ekleyebilirsiniz
veya belirli ayarları değiştirebilirsiniz. Aşağıdaki örnek bir
Hata ayıklama derleme türü ve yapılandırması için applicationIdSuffix
"hazırlık" hata ayıklama derleme türündeki ayarlar kullanılarak başlatılan derleme tü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" } } }
Eski
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: Derleme yapılandırma dosyasında değişiklik yaptığınızda,
Android Studio, projenizi yeni
yapılandırma. Projenizi senkronize etmek için Şimdi Senkronize Et'i tıklayın
Bildirim çubuğunda bir değişiklik yaptığınızda veya
Araç çubuğundan projesini senkronize edin. Android
Studio, yapılandırmanızla ilgili herhangi bir hata tespit ederse,
Sorunu açıklamak için Mesajlar penceresi görünür.
Derleme türleriyle yapılandırabileceğiniz tüm özellikler hakkında daha fazla bilgi edinmek için
şunu okuyun:
BuildType
referansı.
Ürün aromalarını yapılandırın
Ürün aromaları oluşturmak, derleme türü oluşturmaya benzer. Ürünlerin aromalarını
Derleme yapılandırmanızda productFlavors
bloku ve istediğiniz ayarları ekleyin.
Ürün aromaları, aşağıdakilerle aynı özellikleri destekler:
defaultConfig
, çünkü defaultConfig
aynı zamanda
ProductFlavor
sınıfı. Bu, her bir ara hedefe ulaşmak için
defaultConfig
bloğundaki tüm aroma için yapılandırma ve
her aroma, bu varsayılan değerlerin herhangi birini (ör. applicationId
) değiştirebilir. Alıcı:
uygulama kimliği hakkında daha fazla bilgi edinmek için
Uygulama kimliğini ayarlayın.
Not: Yine de
package
özelliğini main/
manifest dosyasında bulabilirsiniz. Ayrıca şunu da kullanmanız gerekir:
R
sınıfına başvurmak için kaynak kodunuzdaki paket adı
veya hizmet kaydından
sorumlu olabilir. Bu şekilde
Her ürün aromasına benzersiz bir kimlik vermek için applicationId
ve ambalajlama ve dağıtım süreçlerinizi geliştirmeye hazır olursunuz.
Tüm aroma, adlandırılmış bir aroma boyutuna ait olmalıdır. Bu boyut, özelliklerini de ekleyebilirsiniz. Tüm çeşitleri bir tür boyutuna atamalısınız; 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 belirttiğinde Android Gradle eklentisi otomatik olarak tüm modülün özelliklerini bu boyuta atar.
ziyaret edin.
Aşağıdaki kod örneği, "version" adlı bir aroma boyutu oluşturur ve şunu ekler:
"demo" ve "full" özelliklerini de ekleyebilirsiniz. Bu aromaları, kendi özelliklerini
applicationIdSuffix
ve
versionNameSuffix
:
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" } } }
Eski
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: Eski bir uygulamanız varsa (önceki adıyla
Google Play'de APK'ları kullanarak dağıttığınız birden fazla APK kullanarak uygulamanızı dağıtmak için (Ağustos 2021)
desteği Google Play'de, aynı applicationId
değerini atayın
ve her varyanta farklı bir değer verin
versionCode
. Dağıtılacak
uygulamanızın farklı varyantlarını Google Play'de ayrı uygulamalar halinde kullanıyorsanız
applicationId
her varyant için farklıdır.
Ürün aromalarınızı oluşturup yapılandırdıktan sonra Senkronize et
Artık bildirim çubuğunda görebilirsiniz. Senkronizasyon tamamlandığında Gradle
derleme türlerinize ve ürününüze göre otomatik olarak derleme varyantları oluşturur
aromalarını belirtip bunları
<product-flavor><Build-Type>
Örneğin,
"demo" oluşturuldu ve "full" varsayılan değer olan ürün aromalarını
"hata ayıkla" ve
"yayınla" Gradle, aşağıdaki derleme varyantlarını oluşturur:
-
demoDebug
-
demoRelease
-
fullDebug
-
fullRelease
Derlenecek derleme varyantını seçmek ve çalıştırıp Derleme'ye gidin > Derleme Varyantı'nı seçin ve derleme varyantına karar verirsiniz. Her derleme varyantını kendi özellikleriyle ve kaynak oluşturmak ve yönetmek için anahtar kelimelerini bu sayfada açıklandığı şekilde değiştirin.
Derleme varyantlarının uygulama kimliğini değiştirme
Uygulamanız için bir APK veya AAB oluşturduğunuzda, derleme araçları uygulamayı
build.gradle.kts
içinden defaultConfig
bloğunda tanımlanan uygulama kimliği
dosyası olarak ayarlayın. Ancak, sayfanızın farklı sürümlerini oluşturmak isterseniz
Google Play Store'da ayrı girişler olarak görünür (örneğin, "ücretsiz" ve "pro"
Bunun için ayrı bir sürüm oluşturmanız gerekir
her biri farklı olan derleme varyantları
uygulama kimliği.
Bu durumda, her derleme varyantını ayrı bir öğe olarak tanımlayın
artırmak için de kullanılabilir. Her aroma için
productFlavors
bloğunun içinde, applicationId
öğesini yeniden tanımlayabilirsiniz.
ya da bunun yerine varsayılan uygulama kimliğine bir segment ekleyebilirsiniz
applicationIdSuffix
kullanılarak (burada gösterildiği gibi):
Kotlin
android { defaultConfig { applicationId = "com.example.myapp" } productFlavors { create("free") { applicationIdSuffix = ".free" } create("pro") { applicationIdSuffix = ".pro" } } }
Eski
android { defaultConfig { applicationId "com.example.myapp" } productFlavors { free { applicationIdSuffix ".free" } pro { applicationIdSuffix ".pro" } } }
Bu şekilde, "bedava"nın uygulama kimliğini ürün aroması "com.example.uygulamam.ücretsiz".
Şuna göre segment eklemek için de applicationIdSuffix
kullanabilirsiniz:
aşağıda gösterildiği gibi derleme türünüz:
Kotlin
android { ... buildTypes { getByName("debug") { applicationIdSuffix = ".debug" } } }
Eski
android { ... buildTypes { debug { applicationIdSuffix ".debug" } } }
Gradle, derleme türü yapılandırmasını ürün aromasından sonra uyguladığından "ücretsiz hata ayıklama"nın uygulama kimliği derleme varyantı "com.example.uygulamam.ücretsiz.debug". Bu, hem geniş kapsamlı hem hata ayıklama hem sürüm derlemesi aynı cihazda aynı uygulama kimliğini kullanın.
Eski bir uygulamanız varsa (Ağustos'tan önce oluşturulmuş) 2021) hakkında daha fazla bilgi edinmek istiyorsanız ve Google Play'de APK'ları kullanarak dağıtan birden fazla APK'yı Her biri API düzeyi gibi farklı bir cihaz yapılandırmasını hedefler. her derleme varyantı için aynı uygulama kimliğini kullanmanız gerekir. Ancak APK farklı birversionCode
. Daha fazla bilgi için
Birden fazla APK desteği. Yayınlanıyor
tek bir yapı kullanan tek bir yapı kullandığı için, AAB'lerin kullanımı
varsayılan olarak sürüm kodu ve uygulama kimliğidir.
İpucu:
manifest dosyasını açtığınızda ${applicationId}
yer tutucusunu herhangi bir
manifesto özelliği mevcuttur. Gradle, derleme sırasında bu etiketi gerçek
uygulama kimliği. Daha fazla bilgi için bkz. Derleme ekleme
değişkenlerini manifest dosyasına ekleyin.
Birden fazla ürün aromasını aroma boyutlarıyla birleştirin
Bazı durumlarda, birden çok ürüne ait yapılandırmaları birleştirmek isteyebilirsiniz hoş geldiniz. Örneğin, "tam" ve "demo" üç farklı ürün çeşidi var. Bunu yapmak için Android Gradle eklentisi sayesinde aroma olarak birden fazla aroması grubu oluşturabilirsiniz. seçin.
Gradle, uygulamanızı geliştirirken bir ürünü Tanımladığınız her aroma boyutundan aroma yapılandırması, derleme türü yapılandırmasını kullanabilirsiniz. Gradle'da yapılmıyor aynı aroma boyutuna ait ürün aromalarını birleştirmektir.
Aşağıdaki kod örneğinde
"Mod" oluşturmak için flavorDimensions
özelliği aroma
"tam" değerini gruplamak için ve "demo" ürün aromalarını ve "api" aroma
ürün aroması yapılandırmalarını API düzeyine göre gruplandırmak için boyut:
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" ... } } } ...
Eski
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 varyantlarının sayısı her aroma boyutundaki aroma sayısını ve kullandığınız derleme türlerinin yapılandıramazsınız. Gradle her derleme varyantını veya ilgili yapıları adlandırdığında ürün Daha yüksek öncelikli aroma boyutuna ait aromalar ilk olarak görünür, ardından daha düşük öncelikli boyutlardaki boyutlara göre sıralanmış şekilde gösterir.
Kullanım örneğin, Gradle toplam 12 kod oluşturmak için aşağıdaki adlandırma şemasına sahip varyantlar oluşturun:
- Derleme varyantı:
[minApi24, minApi23, minApi21][Demo, Full][Debug, Release]
- İlgili APK:
app-[minApi24, minApi23, minApi21]-[demo, full]-[debug, release].apk
- Örneğin,
- Derleme varyantı:
minApi24DemoDebug
- İlgili APK:
app-minApi24-demo-debug.apk
Her kullanıcı için oluşturabileceğiniz kaynak kümesi dizinlerine ek olarak,
aromasını ve derleme varyantını almak için kaynak grubu dizinleri de oluşturabilirsiniz.
her bir kombinasyonu kullanmanız gerekir. Örneğin, her sektör için
Java kaynaklarını src/demoMinApi24/java/
dizinine ekleyin,
Gradle da bu kaynakları yalnızca
bahsedeceğiz.
Ürün aroması için oluşturduğunuz kaynak grupları kombinasyonların her birine ait kaynak gruplardan daha yüksek önceliğe sahiptir ayrı bir ürün çeşididir. Kaynak kümeleri ve Gradle'ın nasıl birleştirileceğini öğrenmek için, oluşturma kaynak kümeleri.
Filtre varyantları
Gradle, ürünün olası her kombinasyonu için bir yapı varyantı oluşturur
türlerini ve derleme türlerini seçin. Ancak ekip üyeleri için
ihtiyacınız olmayan veya
daha fazla bilgi edineceksiniz. Belirli derleme varyantı yapılandırmalarını kaldırmak için:
modül düzeyindeki build.gradle.kts
sayfanızda bir varyant filtresi oluşturun
dosyası olarak kaydedebilirsiniz.
Önceki bölümde verilen derleme yapılandırmasını örnek olarak kullanalım.
demo için yalnızca 23. ve sonraki API düzeylerini desteklemeyi planladığınızı varsayalım
sürümünü kullanabilirsiniz. URL parametrelerinin Google tarafından nasıl ele alınmasını istediğinizi belirtmek için
Tüm derleme varyantını filtrelemek için variantFilter
bloğu
"minApi21" kodunu birleştiren yapılandırmalar ve "demo" ürün aromaları:
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 } } } ...
Eski
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 varyant filtresi ekleyip Senkronize et'i tıkladıktan sonra
Artık bildirim çubuğunda Gradle,
koşullar. Derleme varyantları artık menüde görünmüyor
Derle > Menü çubuğundan Derleme Varyantı'nı seçin.
veya Varyant Derleme için
araç pencere çubuğuna
Kaynak kümeleri oluşturma
Android Studio varsayılan olarak main/
için kaynak grubu ve dizinler
tüm derleme varyantlarınız arasında paylaşmak istediğiniz her şeyi
değiştirmeniz gerekir. Ancak,
Gradle'ın tam olarak hangi dosyaları derleyeceğini ve
farklı derleme türleri, ürün çeşitleri ve bunların kombinasyonları için
(aroma kullanırken)
boyutları) kullanın ve derleme varyantları ekleyin.
Örneğin, Ürün İş Listesi’ndeki
main/
kaynak grubundaki işlevsellik ve ürün çeşidini kullanmak
Kaynak grupları kullanarak uygulamanızın markasını farklı müşteriler için değiştirebilir veya
yalnızca derleme varyantları için özel izinleri ve günlük kaydı işlevini içermelidir
hata ayıklama derleme türünü kullanan
dönüşümler vardır.
Gradle, kaynak grubu dosyalarının ve dizinlerinin belirli bir konumda düzenlenmesini bekliyor.
main/
kaynak kümesine benzer. Örneğin, Gradle
"hata ayıklama"nıza özgü Kotlin veya Java sınıfı dosyaları bekler derleme türü
src/debug/kotlin/
veya src/debug/java/
dizininde bulabilirsiniz.
Android Gradle eklentisi, iOS'in performanslarını gösteren faydalı bir Gradle görevi her bir derleme türünüz, ürün veya hizmet için dosyalarınızı çeşitlerini araştırıyoruz. Örneğin, görev sonucundan alınan aşağıdaki örnek Gradle'ın "hata ayıklama" işlemi için belirli dosyaları nerede bulmayı beklediğini açıklar derleme tür:
------------------------------------------------------------ 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 şu adımları uygulayın:
- Araç penceresi çubuğunda Gradle'ı tıklayın.
MyApplication > Görevler > android ve sourceSets'i çift tıklayın.
Görevler klasörünü görmek için Gradle'ın görev listesi oluşturabilirsiniz. Bunun için, aşağıdaki adımları uygulayın:
- Dosya > Ayarlar > Deneysel (Android Studio > Ayarlar > Deneysel ) tıklayın.
- Yapmamanın seçimini kaldır Gradle senkronizasyonu sırasında Gradle görev listesi derleme hakkında daha fazla bilgi edinin.
- Gradle, görevi yürüttükten sonra Çalıştır penceresi açılır. çıktı.
Not: Görev çıkışı, kaynak kümelerinin nasıl düzenleneceğini de gösterir
test etmek için kullanmak istediğiniz dosyalar (örneğin,
test/
ve androidTest/
kaynak kümelerinin test edilmesi
Yeni bir derleme varyantı oluşturduğunuzda Android Studio, kaynağı oluşturmaz
dizin oluşturabilirsiniz, ancak size yardımcı olmak için birkaç seçenek sunar. Örneğin,
örnek olarak, "debug" işleminiz için yalnızca java/
dizinini oluşturabilirsiniz.
derleme türü:
- Proje bölmesini açın ve Proje görünümüne gidin.
MyProject/app/src/
adresine gidiş rotasını izle.src
dizinini sağ tıklayıp seçin Yeni > Dizin.- Gradle Kaynak Grupları altındaki menüde full/java olarak ayarlayın.
- Enter tuşuna basın.
Android Studio, hata ayıklama derleme türünüz için kaynak grubu dizini oluşturur ve
sonra bunun içinde java/
dizinini oluşturur. Alternatif olarak:
Android Studio, Studio'ya yeni bir dosya eklediğinizde sizin için dizinler
projenizin belirli bir derleme varyantına sunun.
Örneğin, "debug" işleminiz için bir değerler XML dosyası oluşturmak derleme türü:
- Proje bölmesinde
src
simgesini sağ tıklayın dizini açın ve Yeni > XML > Değerler XML Dosyası. - XML dosyasının adını girin veya varsayılan adı değiştirmeyin.
- Hedef Kaynak Grubu'nun yanındaki menüde debug.
- Son'u tıklayın.
Çünkü "hata ayıklama" derleme türü, hedef kaynak grubu olarak belirtilmişse Android Studio, gerekli dizinleri otomatik olarak XML dosyasını oluşturur. Elde edilen dizin yapısı aşağıdaki gibi görünür: Şekil 1.
![](https://developer.android.com/static/images/tools/debug-directories_2-1_2x.png?authuser=9&hl=tr)
Şekil 1. "debug" işlemi için yeni kaynak grubu dizinleri derleme türü.
Etkin kaynak gruplarının simgesinde, etkin olduklarını belirten yeşil bir gösterge bulunur. İlgili içeriği oluşturmak için kullanılan
debug
kaynak grubunun son eki, birleştirileceğini göstermek için [main]
ile eklendi
main
kaynak kümesine eklenecek.
Aynı prosedürü kullanarak ayrıca
src/demo/
gibi ürün aromalarını ve derleme varyantları (ör.
src/demoDebug/
. Ayrıca, test amaçlı kaynak kümeleri de
şunun gibi belirli derleme varyantlarını hedefleyen
src/androidTestDemoDebug/
Daha fazla bilgi edinmek için
kaynak gruplarını test etme hakkında bilgi edinin.
Varsayılan kaynak kümesi yapılandırmalarını değiştirme
Varsayılan kaynak ayar dosyasında düzenlenmemiş kaynaklarınız varsa
önceki bölümde açıklandığı gibi, Gradle'ın beklediği yapıyı
kaynak kümeleri oluşturmak için
Gradle'ın toplanmaya baktığı yeri değiştirmek için sourceSets
blok
kaynak kümesinin her bileşeni için dosyaları oluşturur.
sourceSets
bloğu şu şekilde olmalıdır:
ve android
bloğunda.
kaynak dosyalar; Gradle'a yalnızca
modül düzeyinde build.gradle.kts
dosyası oluşturur (Gradle,
her kaynak kümesi bileşenine ait dosyaları bulun. Kullanabileceğiniz bileşenleri öğrenmek için
birden fazla dosya veya dizinle eşleyip eşleyemeyeceğinizi ve
Android Gradle eklentisi API referansı'nı inceleyin.
Aşağıdaki kod örneği, app/other/
dizinindeki kaynakları eşler
main
kaynak kümesinin belirli bileşenlerine çevirir ve
androidTest
kaynak kümesinin kök dizini:
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") ... } } ...
Eski
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 kümesine ait olabileceğini unutmayın. Örneğin,
hem test
hem de androidTest
kaynak kümelerine sahip aynı test kaynakları. Bu
çünkü Android Studio her kaynak grubu için ayrı IntelliJ modülleri oluşturur ve
kaynak kümelerde yinelenen içerik kökleri.
Kaynak kümeleriyle derleme
Oluşturduğunuz kodu ve kaynakları eklemek için kaynak grubu dizinlerini yalnızca belirli yapılandırmalarla paketlenmesini talep edebilirsiniz. Örneğin projenin zamanlamasıyla ilgili "demoDebug"ı derleme ve onun çapraz çarpımı olan derleme varyantı "demo" ürün aroması ve "hata ayıklama" Gradle, geliştirmenin temel bileşenlerini bu dizinlere ve onlara şu önceliği verir:
-
src/demoDebug/
(derleme varyantı kaynak grubu) -
src/debug/
(derleme türü kaynak grubu) -
src/demo/
(ürün aroması kaynağı grubu) -
src/main/
(ana kaynak grubu)
Ürün çeşidi kombinasyonları için oluşturulan kaynak gruplar, tüm tür boyutlarını içermelidir. Örneğin, derleme varyantı kaynak grubu, derleme türü ile tüm türlerin birleşiminden oluşmalıdır seçin. Hepsini değil, birden çok klasörü kapsayan klasörleri içeren kod ve kaynakları birleştirme tür boyutları desteklenmiyor.
Birden çok ürünü bir araya getirirseniz
aroma, ürün aromaları arasındaki öncelik aromaya göre belirlenir
ait oldukları boyuta göre değişir.
android.flavorDimensions
özelliği,
ait olup olmadığını kontrol edin.
öğeler dahil edilir. Ayrıca,
ürün aroma kombinasyonları için oluşturduğunuz kaynak gruplarının,
.
Öncelik sırası, hangi kaynak grubunun daha yüksek
önceliklerini belirleyebilirsiniz. Çünkü demoDebug/
kaynak küme dizini muhtemelen o derlemeye özgü dosyalar içerir
demoDebug/
, şurada da tanımlanmış bir dosya içeriyorsa varyant
debug/
, Gradle, demoDebug/
içindeki dosyayı kullanır
kaynak ayarlanmış olmalıdır. Benzer şekilde Gradle, dosyaları derleme türü ve ürün türü ile verir.
kaynağı, main/
içindeki aynı dosyalara göre daha yüksek bir öncelik ayarlıyor.
Gradle, aşağıdaki derleme kurallarını uygularken bu öncelik sırasını dikkate alır:
kotlin/
veyajava/
dizinlerindeki tüm kaynak kodları derlenir oluşturarak tek bir çıktı üretir.Not: Gradle, belirli bir derleme varyantı için bir yapı oluşturur hatasını verir. aynı Kotlin veya Java sınıfını kullanır. Örneğin, bir hata ayıklama uygulaması oluştururken hem
src/debug/Utility.kt
hem de örneğinsrc/main/Utility.kt
, çünkü Gradle her ikisine de bakıyor derleme işlemi sırasında bu dizinleri alır ve bir "yinelenen sınıf" atar hatası.Utility.kt
için farklı versiyonları istiyorsanız farklı derleme türleri kullanıyorsanız her derleme türü kendi sürümünü tanımlamalıdırmain/
kaynak kümesine dahil etmeyin.- Manifestler tek bir manifestte birleştirilir. Öncelik verildi aşağıdaki örnekteki listeyle aynı sıradadır. Yani bir derlemenin manifest ayarları bir ürün aromasının manifest ayarlarını geçersiz kılabilir, vb. Öğrenmek için Daha fazla bilgi için manifest birleştirme hakkında bilgi edinin.
values/
dizindeki dosyalar birleştirildi birlikte. İki dosya aynı ada sahipse (örneğin, iki dosya)strings.xml
dosyaları varsa, öncelik listesidir. Yani derleme türü kaynak kümesindeki bir dosyada tanımlanan değerler Bir ürün çeşidinde aynı dosyada tanımlanan değerleri geçersiz kılabilir vb.res/
veasset/
dizinlerindeki kaynaklar birlikte paketlendiğinden emin olun. Şurada tanımlanmış aynı ada sahip kaynaklar varsa: iki veya daha fazla kaynak kümesi varsa öncelik, listeyle aynı sırada verilir ele alalım.- Gradle, kitaplıkla birlikte kaynakları ve manifest'leri sağlar modülün bağımlılıkları, uygulamayı derlemek için en düşük önceliğe sahiptir.
Bağımlılıkları belirtme
Belirli bir derleme varyantı için bağımlılık yapılandırmak
test kaynağı kümesi
derleme varyantının veya test kaynağı grubunun adının önüne
Implementation
anahtar kelimesi, aşağıdaki örnekte gösterildiği gibi:
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.5.1") }
Eski
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.5.1' }
Bağımlılıkları yapılandırma hakkında daha fazla bilgi için Derleme bağımlılıkları ekleme bölümünü inceleyin.
Varyanta duyarlı bağımlılık yönetimi kullanın
Android Gradle eklentisi 3.0.0 ve sonraki sürümler, otomatik olarak
bir kitaplık kullanırken varyasyonlarla eşleşir. Bu, bir uygulamanın debug
varyantı anlamına gelir
bir kitaplığın debug
varyantını otomatik olarak kullanır ve bu şekilde devam eder. Bu özellik,
tatlar: bir uygulamanın freeDebug
varyantı bir kitaplığın freeDebug
varyantını kullanır
varyantı.
Eklentinin varyantları doğru şekilde eşleştirmesi için açıklandığı gibi eşleşen yedekler sağlar doğrudan eşlemenin mümkün olmadığı durumlar için aşağıdaki bölüme bakın.
Örneğin, uygulamanızın "hazırlık" adlı bir derleme türü yapılandırdığını ancak bağımlılığı yoktur. Eklenti "hazırlık" oluşturmaya çalıştığında e-postanızın uygulamasını kullanırsanız kitaplığın hangi sürümünün kullanılacağını bilemez ve buna benzer bir hata mesajı görürsünüz şunlara:
Error:Failed to resolve: Could not resolve project :mylibrary. Required by: project :app
Varyant eşleştirmeyle ilgili yapı hatalarını çözme
Eklenti, Gradle'ın şu uygulamalarda sorunları nasıl çözdüğünü kontrol etmenize yardımcı olacak DSL öğeleri içerir: bir uygulama ile bağımlılık arasında doğrudan bir varyantın eşleşmesi mümkün değildir.
Aşağıda, varyanta duyarlı bağımlılık eşleştirmeyle ilgili sorunların bir listesi verilmiştir ve şu adımları izleyin:Uygulamanız, kitaplık bağımlılığının sunmadığı bir derleme türü içeriyor.
Örneğin, uygulamanız bir "hazırlık" ancak bir bağımlılık yalnızca "hata ayıkla" ve "release" derleme türleri.
Kitaplık bağımlılığı bir derleme içerdiğinde sorun olmadığını unutmayın tespit edemediğiniz bir durumdur. Çünkü eklenti hiçbir zaman istekleri için de kullanılmaktadır.
Belirli bir derleme türü için alternatif eşleşmeler belirtmek amacıyla
matchingFallbacks
kullanın. burada gösterildiği gibi: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") } } }
Eski
// 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ığında mevcut olan belirli bir aroma boyutu için uygulamanız, kitaplığın sunmadığı tatlar içeriyor.
Örneğin, hem uygulamanızın hem de kitaplığın bağımlılıkları bir "katman" içerir. tür boyutu. Ancak "katman" Uygulamadaki boyut "ücretsiz" değerini içeriyor ve "paid" ama aroma bağımlılık yalnızca "demo" içerir ve "paid" aromalarını da ekleyin.
Hem uygulamada hem de uygulamanın kitaplığında mevcut olan belirli bir aroma boyutu için bir kitaplıkta uygulamanızın aradığınız bir ürün çeşidini içerdiğinde . Bunun nedeni, eklentinin hiçbir zaman bu aromayı bağımlılıktan istememesidir.
Uygulamanın "ücretsiz" sürümüne alternatif eşleşmeler belirtmek için
matchingFallbacks
kullanın ürün aromasını görebilirsiniz: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") } } }
Eski
// 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 aroma boyutu içerir.
Örneğin, bir kitaplık bağımlılığı "minApi" için tatlar içerir. ancak uygulamanız yalnızca "katman"a ilişkin tatları içeriyorsa boyutunu oluşturabilirsiniz. "freeDebug"ı derlemek istediğinizde sürümünü kullanıyorsanız eklenti, "minApi23Debug" öğesini kullanıp kullanmayacağını veya "minApi18Debug" sürümü dahildir.
Uygulamanız, kitaplığın içerdiği aroma boyutu içerdiğinde sorun oluşmaz. değildir. Bunun nedeni, eklentinin yalnızca arasında yer alır. Örneğin, bir bağımlılık ABI'ler için bir boyut içermiyorsa "freeX86Debug" Uygulamanızın sürümü "freeDebug"ı kullanacaktır. sürümünü desteklenmektedir.
Belirtmek için
defaultConfig
bloğundamissingDimensionStrategy
kullanın aşağıda gösterildiği gibi, eksik her boyut arasından seçim yapması için eklentinin varsayılan örneği inceleyelim. Ayrıca,productFlavors
sayfasında seçimlerinizi geçersiz kılabilirsiniz. Böylece her aroma, eksik bir boyut için farklı bir eşleme 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") {} } }
Eski
// 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 matchingFallbacks
sayfasını inceleyin.
ve missingDimensionStrategy
ifadesini girin.
İmzalama ayarlarını yapılandırın
Gradle, açıkça bir imza yapılandırmasıdır. Henüz bir imzalama anahtarınız yoksa yükleme anahtarı ve anahtar deposu oluşturma Studio'yu kullanabilirsiniz.
Sürüm derleme türünüz için imzalama yapılandırmalarını manuel olarak yapılandırmak üzere aşağıdaki adımları uygulayın:
- Anahtar deposu oluşturun. Keystore, bir ikili program dosyasıdır içerir. Anahtar deponuzu güvenli bir yerde saklamalısınız. ve güvenli bir yer.
- Özel anahtar oluşturun. Özel anahtar, uygulamanızı imzalamak için kullanılır hiçbir zaman uygulamaya dahil edilmez veya yetkisiz üçüncü taraflarla paylaşılmaz.
-
İmzalama yapılandırmasını modül düzeyindeki
build.gradle.kts
öğesine ekleyin dosya:Kotlin
... android { ... defaultConfig {...} signingConfigs { create("release") { storeFile = file("myreleasekey.keystore") storePassword = "password" keyAlias = "MyReleaseKey" keyPassword = "password" } } buildTypes { getByName("release") { ... signingConfig = signingConfigs.getByName("release") } } }
Eski
... 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 yazılımınızın şifrelerini içerir. anahtar deposunun iyi bir güvenlik uygulaması değildir. Bunun yerine, derleme dosyasını bu şifreleri alacak şekilde yapılandırın veya derleme işleminin bunu size bildirmesini sağlayabilirsiniz. şifreler.
Bu şifreleri ortam değişkenlerinden elde etmek için:
Kotlin
storePassword = System.getenv("KSTOREPWD") keyPassword = System.getenv("KEYPWD")
Eski
storePassword System.getenv("KSTOREPWD") keyPassword System.getenv("KEYPWD")
Alternatif olarak, anahtar deposunu bir yerel özellikler dosyasından yükleyebilirsiniz. Güvenlik nedeniyle bu dosyayı kaynak kontrolüne ekle. Bunun yerine, her hizmet için yerel olarak geliştiriciyim. Daha fazla bilgi edinmek için okuyun. Derleme dosyalarınızdan imzalama bilgilerini kaldırın.
Bu işlemi tamamladıktan sonra uygulamanızı dağıtıp yayınlayabilirsiniz .
Uyarı: Anahtar deponuzu ve özel anahtarınızı güvenli ve kolay bir şekilde ve bunların güvenli yedeklerine sahip olduğunuzdan emin olun. Play Uygulama İmzalama kullanıyorsanız ve yükleme anahtarınızı kaybederseniz talep edin: sıfırlama adımlarını uygulayın. 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 için güncelleme yayınlayamazsınız. Uygulamanızın tüm sürümlerini her zaman aynı anahtarla imzalamalıdır.
Wear OS uygulamalarını imzalama
Wear OS uygulamalarını yayınlarken hem saat APK'sı hem de isteğe bağlı telefon APK'sı aynı tuşa sahiptir. Wear OS uygulamalarını paketleme ve imzalama hakkında daha fazla bilgi için bkz. Wear uygulamalarını paketleme ve dağıtma