Derleme çeşitlerini yapılandırma

Bu sayfada, tek bir projeden uygulamanızın farklı sürümlerini oluşturmak için sürüm varyantlarını nasıl yapılandırabileceğiniz ve bağımlılıklarınız ile imzalama yapılandırmalarınızı doğru şekilde nasıl yönetebileceğiniz gösterilmektedir.

Her derleme varyantı, 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 grubuyla ücretsiz olan bir sürümünü ve daha fazlasını içeren başka bir ücretli sürümünü oluşturmak isteyebilirsiniz. Ayrıca, API düzeyine veya diğer cihaz varyasyonlarına göre uygulamanızın farklı cihazları hedefleyen farklı sürümlerini oluşturabilirsiniz.

Derleme varyantları, Gradle'ın derleme türlerinizde ve ürün çeşitlerinizde yapılandırılan ayarları, kodu ve kaynakları birleştirmek için belirli bir kural grubu kullanmasının sonucudur. Derleme varyantlarını doğrudan yapılandırmasanız da bunları oluşturan derleme türlerini ve ürün çeşitlerini siz yapılandırırsınız.

Örneğin "demo" ürün aroması; özel kaynak kodu, kaynaklar ve minimum API düzeyleri gibi belirli özellikleri ve cihaz gereksinimlerini belirtebilir. "Hata ayıklama" yapı türü ise hata ayıklama seçenekleri ve imzalama anahtarları gibi farklı derleme ve paketleme ayarları uygular. Bu ikisini birleştiren derleme varyantı, uygulamanızın "demoDebug" sürümüdür ve "demo" ürün türü, "hata ayıklama" derleme türü ve main/ kaynak grubunda yer alan yapılandırmaların ve kaynakların bir kombinasyonunu içerir.

Derleme türlerini yapılandırın

Derleme türlerini, modül düzeyindeki build.gradle.kts dosyasının android bloğunda oluşturabilir ve yapılandırabilirsiniz. Yeni bir modül oluşturduğunuzda Android Studio otomatik olarak hata ayıklama ve sürüm derleme türlerini oluşturur. Hata ayıklama derleme türü, derleme yapılandırma dosyasında görünmese de Android Studio, derleme türünü debuggable true ile yapılandırır. Böylece güvenli Android cihazlarda uygulamada hata ayıklayabilirsiniz ve genel bir hata ayıklama anahtar deposuyla uygulama imzalamayı 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 örnek, hata ayıklama derleme türü için bir applicationIdSuffix belirtir ve hata ayıklama derleme türündeki ayarlar kullanılarak başlatılan "hazırlık" derleme türünü yapılandırı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"
        }
    }
}

Eskitme

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ğundan Projeyi Senkronize Et'i tıklayın. 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 BuildType referansını okuyun.

Ürün çeşitlerini yapılandırın

Ürün aromaları oluşturmak, derleme türleri oluşturmaya benzer. Derleme yapılandırmanızdaki productFlavors blokuna ürün aromaları ekleyin ve istediğiniz ayarları ekleyin. defaultConfig aslında ProductFlavor sınıfına ait olduğundan ürün aromaları defaultConfig ile aynı özellikleri destekler. Bu, defaultConfig blokundaki tüm aromalar için temel yapılandırmayı sağlayabileceğiniz ve her bir çeşit, bu varsayılan değerlerden herhangi birini (ör. applicationId) değiştirebileceği anlamına gelir. Uygulama kimliği hakkında daha fazla bilgi edinmek için Uygulama kimliğini ayarlama bölümünü okuyun.

Not: Yine de main/ manifest dosyasındaki package özelliğini kullanarak bir paket adı belirtmeniz gerekir. R sınıfına başvurmak veya herhangi bir göreli etkinliği ya da hizmet kaydını çözmek için de kaynak kodunuzda bu paket adını kullanmanız gerekir. Bu sayede kaynak kodunuzu değiştirmek zorunda kalmadan her bir ürün aromasına paketleme ve dağıtım için benzersiz bir kimlik vermek üzere applicationId kullanabilirsiniz.

Tüm aromalar, adlandırılmış bir aroma boyutuna ait olmalıdır. Bu boyut, ürün aromalarından oluşan bir gruptur. Tüm aromaları bir aroma 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ülde yalnızca bir tür boyut belirtilmişse Android Gradle eklentisi, modülün tüm çeşitlerini otomatik olarak bu boyuta atar.

Aşağıdaki kod örneği, "sürüm" adlı bir aroma boyutu oluşturup "demo" ve "tam" ürün aromalarını ekler. Bu aromalar kendi applicationIdSuffix ve versionNameSuffix öğelerini 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"
        }
    }
}

Eskitme

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 bir varyanta farklı bir versionCode değeri 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 çeşitlerinizi 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 çeşitlerinize göre otomatik olarak derleme varyantları oluşturur ve bunları <product-flavor><Build-Type> doğrultusunda adlandırır. Örneğin, "demo" ve "tam" ürün aromaları oluşturup varsayılan "hata ayıklama" ve "sürüm" derleme türlerini koruduysanız Gradle aşağıdaki derleme varyantlarını oluşturur:

  • demoDebug
  • demoRelease
  • fullDebug
  • fullRelease

Derlenip çalıştırılacak derleme varyantını seçmek için Derleme > Derleme Varyantı Seçin'e gidin ve menüden bir derleme varyantı seçin. Her derleme varyantını kendi özellikleri ve kaynaklarıyla özelleştirmeye başlamak için bu sayfada açıklandığı şekilde kaynak grupları oluşturup yönetmeniz gerekir.

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ı aşağıdaki örnekte gösterildiği gibi build.gradle.kts dosyasındaki defaultConfig blokunda tanımlanan uygulama kimliğiyle etiketler. Ancak, Google Play Store'da ayrı girişler olarak görünecek şekilde uygulamanızın farklı sürümlerini (ör. "ücretsiz" ve "pro" sürüm) oluşturmak istiyorsanız her biri farklı bir uygulama kimliğine sahip ayrı varyantlar oluşturmanız gerekir.

Bu durumda, her yapı varyantını ayrı bir ürün çeşidi olarak tanımlayın. productFlavors blokundaki her bir aroma için applicationId özelliğini yeniden tanımlayabilir veya aşağıda gösterildiği gibi 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"
        }
    }
}

Eskitme

android {
    defaultConfig {
        applicationId "com.example.myapp"
    }
    productFlavors {
        free {
            applicationIdSuffix ".free"
        }
        pro {
            applicationIdSuffix ".pro"
        }
    }
}

Bu şekilde, "ücretsiz" ürün aroması için uygulama kimliği "com.example.myapp.free" olur.

Derleme türünüze göre bir segment eklemek için burada gösterildiği gibi applicationIdSuffix aracını da kullanabilirsiniz:

Kotlin

android {
    ...
    buildTypes {
        getByName("debug") {
            applicationIdSuffix = ".debug"
        }
    }
}

Eskitme

android {
    ...
    buildTypes {
        debug {
            applicationIdSuffix ".debug"
        }
    }
}

Gradle, derleme türü yapılandırmasını ürün çeşidinden sonra uyguladığından "ücretsiz hata ayıklama" derleme varyantının uygulama kimliği "com.example.myapp.free.debug" şeklindedir. Bu özellik, hem hata ayıklamanın hem de sürüm derlemesinin aynı cihazda olmasını istediğinizde kullanışlıdır. Çünkü iki uygulama aynı uygulama kimliğine sahip olamaz.

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 API düzeyi gibi farklı bir cihaz yapılandırmasını hedefleyen birden fazla APK'yı dağıtmak için aynı uygulama girişini kullanmak istiyorsanız her derleme varyantı için aynı uygulama kimliğini kullanmanız ancak her APK'ya farklı bir versionCode vermeniz gerekir. Daha fazla bilgi için Birden çok APK desteği konusunu okuyun. AAB kullanarak yayınlama, varsayılan olarak tek bir sürüm kodu ve uygulama kimliği kullanan tek bir yapı kullandığından bu durumdan etkilenmez.

İpucu: Manifest dosyanızda uygulama kimliğine referans vermeniz gerekiyorsa herhangi bir manifest özelliğinde ${applicationId} yer tutucusunu kullanabilirsiniz. Bir derleme sırasında Gradle, bu etiketi gerçek uygulama kimliğiyle değiştirir. Daha fazla bilgi için Manifest'e derleme değişkenleri ekleme konusuna bakın.

Birden fazla ürün aromasını aroma boyutlarıyla birleştirin

Bazı durumlarda, birden fazla ürün çeşidine ait yapılandırmaları birleştirmek isteyebilirsiniz. Örneğin, "tam" ve "demo" ürün aromaları için API seviyesine göre farklı yapılandırmalar oluşturmak isteyebilirsiniz. Android Gradle eklentisi sayesinde, aroma boyutlarına göre birden fazla ürün aroması grubu oluşturabilirsiniz.

Gradle, uygulamanızı oluştururken nihai derleme varyantını oluşturmak için tanımladığınız her aroma boyutundan bir ürün aroması yapılandırmasını ve derleme türü yapılandırmasını birleştirir. Gradle, aynı aroma boyutuna ait ürün çeşitlerini birleştirmez.

Aşağıdaki kod örneğinde, "full" ve "demo" ürün aromalarını gruplandırmak amacıyla bir "mode" aroma boyutu oluşturmak için flavorDimensions özelliği, ürün aroması yapılandırmalarını API düzeyine göre gruplandırmak içinse bir "api" aroma boyutu kullanılı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"
      ...
    }
  }
}
...

Eskitme

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ı sayısı, her bir aroma boyutundaki aroma sayısının ve yapılandırdığınız derleme türünün sayısına eşittir. Gradle her derleme varyantını veya karşılık gelen yapıları adlandırdığında, önce daha yüksek öncelikli aroma boyutuna ait ürün aromaları, ardından daha düşük öncelikli boyutlardakiler ve ardından derleme türü gösterilir.

Gradle, örnek olarak önceki derleme yapılandırmasını kullanarak aşağıdaki adlandırma şemasıyla toplam 12 derleme varyantı oluşturur:

  • 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 bir ürün aroması ve derleme varyantı için oluşturabileceğiniz kaynak grubu dizinlerinin yanı sıra, her ürün aroma kombinasyonu için kaynak grubu dizinleri de oluşturabilirsiniz. Örneğin, Java kaynakları oluşturup src/demoMinApi24/java/ dizinine ekleyebilirsiniz. Gradle bu kaynakları yalnızca bu iki ürün aromasını birleştiren bir varyant oluştururken kullanır.

Ürün aroması kombinasyonları için oluşturduğunuz kaynak grupları, her bir ürün çeşidine 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 hakkındaki bölümü okuyun.

Filtre varyantları

Gradle, yapılandırdığınız ürün çeşitleri ve yapı türlerinin olası her kombinasyonu için bir derleme varyantı oluşturur. Bununla birlikte, ihtiyaç duymadığınız veya projenizin bağlamında anlam ifade etmeyen belirli derleme varyantları olabilir. Belirli derleme varyantı yapılandırmalarını kaldırmak için modül düzeyindeki build.gradle.kts dosyanızda bir varyant filtresi oluşturun.

Örnek olarak, önceki bölümde yer alan derleme yapılandırmasını kullanarak uygulamanın demo sürümü için yalnızca API düzeyi 23 ve üstünü desteklemeyi planladığınızı varsayalım. "minApi21" ve "demo" ürün çeşitlerini birleştiren tüm derleme varyantı yapılandırmalarını filtrelemek için variantFilter blokunu 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
        }
    }
}
...

Eskitme

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 varyant filtresi ekledikten ve bildirim çubuğunda Şimdi Senkronize Et'i tıkladıktan sonra Gradle belirttiğiniz koşulları karşılayan tüm derleme varyantlarını yoksayar. Menü çubuğundan Oluştur > Derleme Varyantı Seçin'i veya araç pencere çubuğunda Varyant Derleme simgesini tıkladığınızda derleme varyantları menüde görünmez.

Kaynak küme oluşturma

Varsayılan olarak Android Studio, tüm derleme varyantlarınız arasında paylaşmak istediğiniz her şey için main/ kaynak grubunu ve dizinleri oluşturur. Bununla birlikte, Gradle'ın belirli derleme türleri, ürün aromaları, ürün aroma kombinasyonları (aroma boyutlarını kullanırken) ve derleme varyantları için tam olarak hangi dosyaları derleyip paketlediğini kontrol etmek üzere yeni kaynak grupları oluşturabilirsiniz.

Örneğin, main/ kaynak grubunda temel işlevleri tanımlayabilir ve uygulamanızın markasını farklı istemciler için değiştirmek üzere ürün aroması kaynak gruplarını kullanabilir veya yalnızca hata ayıklama derleme türünü kullanan derleme varyantları için özel izinler ve günlük kaydı işlevi ekleyebilirsiniz.

Gradle, kaynak grubu dosyalarının ve dizinlerin, main/ kaynak kümesine benzer şekilde belirli bir şekilde düzenlenmesini bekler. Örneğin Gradle, "hata ayıklama" derleme türünüze özel Kotlin veya Java sınıfı dosyalarının src/debug/kotlin/ veya src/debug/java/ dizinlerinde olmasını bekler.

Android Gradle eklentisi; yapı türleri, ürün çeşitleri ve sürüm varyantlarından her birine göre dosyalarınızı nasıl düzenleyeceğinizi gösteren faydalı bir Gradle görevi sunar. Örneğin, görev çıkışına ait aşağıdaki örnekte, Gradle'ın "hata ayıklama" derleme türü için belirli dosyaları nerede bulmayı beklediği açıklanmaktadı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 aşağıdaki adımları uygulayın:

  1. Araç penceresi çubuğunda Gradle'ı tıklayın.
  2. Uygulamam > Görevler > android'e gidin ve kaynak kümeleri'ni çift tıklayın.

    Görevler 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:

    1. Dosya > Ayarlar > Deneysel'i (macOS'te Android Studio > Ayarlar > Deneysel) tıklayın.
    2. Gradle senkronizasyonu sırasında Gradle görev listesi derleme'nin seçimini kaldırın.
  3. Gradle görevi yürüttükten sonra, çıkışı görüntülemek için Çalıştır penceresi açılır.

Not: Görev çıkışı, test/ ve androidTest/ test kaynağı grupları gibi uygulamanızın testlerini çalıştırmak istediğiniz dosyalar için kaynak kümelerini nasıl düzenleyeceğinizi de gösterir.

Yeni bir derleme varyantı oluşturduğunuzda Android Studio sizin için kaynak grup dizinlerini oluşturmaz ancak size yardımcı olmak için birkaç seçenek sunar. Örneğin, "hata ayıklama" derleme türünüz için yalnızca java/ dizinini oluşturmak üzere:

  1. Proje bölmesini açın ve bölmenin üst kısmındaki menüden Proje görünümünü seçin.
  2. MyProject/app/src/ adresine gidin.
  3. src dizinini sağ tıklayın ve Yeni > Dizin'i seçin.
  4. Gradle Kaynak Grupları altındaki menüden full/java'yı seçin.
  5. Enter tuşuna basın.

Android Studio, hata ayıklama derleme türünüz için bir kaynak kümesi dizini oluşturup bunun içinde java/ dizinini oluşturur. Alternatif olarak, belirli bir derleme varyantı için projenize yeni bir dosya eklediğinizde Android Studio sizin yerinize dizin oluşturabilir.

Örneğin, "hata ayıklama" derleme türünüz için bir değerler XML dosyası oluşturmak istiyorsanız:

  1. Proje bölmesinde src dizinini sağ tıklayın ve Yeni > XML > Değerler XML Dosyası'nı seçin.
  2. XML dosyasının adını girin veya varsayılan adı koruyun.
  3. Hedef Kaynak Kümesi'nin yanındaki menüden hata ayıklama'yı seçin.
  4. Son'u tıklayın.

Hedef kaynak grubu olarak "hata ayıklama" derleme türü 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.

1. Şekil. "Hata ayıklama" derleme türü için yeni kaynak grubu dizinleri.

Etkin kaynak gruplarının simgesinde yeşil bir gösterge bulunur. Bu gösterge, söz konusu grupların etkin olduğunu gösterir. debug kaynak grubunun son eki, main kaynak grubuyla birleştirileceğini göstermek için [main] ile eklenir.

Aynı prosedürü kullanarak src/demo/ gibi ürün çeşitleri için kaynak grup dizinleri ve src/demoDebug/ gibi varyantlar oluşturabilirsiniz. Ayrıca, src/androidTestDemoDebug/ gibi belirli derleme varyantlarını hedefleyen test kaynağı grupları oluşturabilirsiniz. Daha fazla bilgi için kaynak gruplarını test etme bölümünü okuyun.

Varsayılan kaynak grubu yapılandırmalarını değiştirme

Kaynak grupları oluşturma hakkında ö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 kaynak grubun her bileşeni için dosya toplamak istediği yeri değiştirmek üzere sourceSets bloğunu kullanabilirsiniz.

sourceSets bloku, android bloğunda olmalıdır. Kaynak dosyaların yerini değiştirmenize gerek yoktur. Gradle'ın her kaynak grubu bileşeninin dosyalarını bulabileceği modül düzeyindeki build.gradle.kts dosyasına göre Gradle'a yalnızca yolları sağlamanız gerekir. Hangi bileşenleri yapılandırabileceğinizi ve bunları birden fazla dosya veya dizinle 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 kümesinin belirli bileşenleriyle eşler ve androidTest kaynak kümesinin 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")
      ...
  }
}
...

Eskitme

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, aynı test kaynaklarını hem test hem de androidTest kaynak gruplarıyla paylaşamazsınız. Bunun nedeni, Android Studio'nun her kaynak kümesi için ayrı IntelliJ modülleri oluşturması ve kaynak kümelerinde yinelenen içerik köklerini destekleyememesidir.

Kaynak gruplarıyla derleme

Yalnızca belirli yapılandırmalarla paketlenmesini istediğiniz kodu ve kaynakları eklemek için kaynak grubu dizinlerini kullanabilirsiniz. Örneğin, "demo" ürün türü ve "hata ayıklama" derleme türünün çapraz ürünü olan "demoDebug" derleme varyantını oluşturuyorsanız Gradle bu dizinlere bakar ve onlara aşağıdaki önceliği verir:

  1. src/demoDebug/ (varyant kaynak grubunu oluştur)
  2. src/debug/ (yapı türü kaynak grubu)
  3. src/demo/ (ürün aroması kaynak grubu)
  4. src/main/ (ana kaynak grubu)

Ürün aroması kombinasyonları için oluşturulan kaynak gruplarında tüm aroma boyutları yer almalıdır. Örneğin, derleme varyantı kaynak grubu, yapı türü ve tüm aroma boyutlarının kombinasyonu olmalıdır. Birden çok aroma boyutunu kapsayan ancak tümünü kapsamayan klasörleri içeren kod ve kaynakları birleştirme işlemi desteklenmez.

Birden fazla ürün aromasını birleştirdiğinizde ürün aromaları arasındaki öncelik, ait oldukları aroma boyutuna göre belirlenir. Aroma boyutlarını android.flavorDimensions özelliğiyle listelerken, listelediğiniz birinci aroma boyutuna ait ürün aromaları, ikinci aroma boyutuna ait olanlara kıyasla daha yüksek önceliğe sahip olur. Ayrıca, ürün aroması kombinasyonları için oluşturduğunuz kaynak grupları, tek bir ürün çeşidine ait kaynak gruplarından daha yüksek önceliğe sahiptir.

Gradle, kod ve kaynakları birleştirdiğinde öncelik sırası hangi kaynak grubunun daha yüksek önceliğe sahip olduğunu belirler. demoDebug/ kaynak grubu dizini muhtemelen bu derleme varyantına özel dosyalar içerdiğinden, demoDebug/ içinde debug/ politikası da tanımlanmış bir dosya varsa Gradle, demoDebug/ kaynak grubundaki dosyayı kullanır. Benzer şekilde, Gradle, derleme türü ve ürün aroması kaynağındaki dosyalara main/ öğesinde aynı dosyalara göre daha yüksek öncelik verir. Gradle, aşağıdaki derleme kurallarını uygularken bu öncelik sırasını dikkate alır:

  • kotlin/ veya java/ dizinlerindeki tüm kaynak kodlar tek bir çıkış oluşturmak için derlenir.

    Not: Gradle, belirli bir derleme varyantı için aynı Kotlin veya Java sınıfını tanımlayan iki veya daha fazla kaynak grubu diziniyle karşılaşırsa yapı hatası bildirir. Örneğin, bir hata ayıklama uygulaması derlerken hem src/debug/Utility.kt hem de src/main/Utility.kt tanımlayamazsınız. Bunun nedeni, Gradle'ın derleme işlemi sırasında her iki dizine de bakarak "kopya sınıf" hatası vermesidir. Farklı derleme türleri için farklı Utility.kt sürümlerini kullanmak isterseniz her derleme türü dosyanın kendi sürümünü tanımlamalı ve main/ kaynak grubuna eklememelidir.

  • Manifestler birleştirilir ve tek bir manifestte toplanır. Öncelik, önceki örnekteki listeyle aynı sırayla verilir. Yani bir derleme türünün manifest ayarları, bir ürün çeşidinin manifest ayarlarını geçersiz kılar ve bu şekilde devam eder. Daha fazla bilgi için manifest birleştirme hakkında bilgi edinin.
  • values/ dizinindeki dosyalar birleştirildi. İki dosya aynı ada sahipse (ör. iki strings.xml dosyası) öncelik, önceki örnekteki listeyle aynı sırada verilir. Yani yapı türü kaynak grubundaki bir dosyada tanımlanan değerler, bir ürün çeşidindeki aynı dosyada tanımlanan değerleri geçersiz kılar ve bu şekilde devam eder.
  • res/ ve asset/ dizinlerindeki kaynaklar birlikte paketlenir. İki veya daha fazla kaynak kümesinde aynı ada sahip kaynaklar tanımlanmışsa öncelik, önceki örnekteki listeyle aynı sırada verilir.
  • Gradle, uygulamayı derlerken kitaplık modülü bağımlılıklarına en düşük önceliğe sahip olan kaynakları ve manifestleri verir.

Bağımlılıkları bildirme

Belirli bir derleme varyantı veya test kaynağı grubu için bağımlılık yapılandırmak üzere derleme varyantının veya test kaynağının adının, aşağıdaki örnekte gösterildiği gibi Implementation anahtar kelimesinin önüne 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.5.1")
}

Eskitme

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 edinmek için Derleme bağımlılıkları ekleme bölümüne bakın.

Varyanta duyarlı bağımlılık yönetimini kullanma

Android Gradle eklentisi 3.0.0 ve sonraki sürümler, bir kitaplığı kullanırken varyantlarla otomatik olarak eşleşen yeni bir bağımlılık mekanizması içerir. Bu durumda, bir uygulamanın debug varyantı otomatik olarak kitaplığın debug varyantını tüketir ve bu şekilde devam eder. Bu işlev, aromalar kullanılırken de çalışır: Bir uygulamanın freeDebug varyantı, kitaplığın freeDebug varyantını kullanır.

Eklentinin varyantları doğru şekilde eşleştirmesi için doğrudan eşlemenin 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 yapılandırmadığını varsayalım. Eklenti, uygulamanızın "hazırlık" sürümünü derlemeye çalıştığında, kitaplığın hangi sürümünün kullanılacağı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ştirmeyle ilgili derleme hatalarını düzeltme

Eklenti, bir uygulama ile bağımlılığın doğrudan varyant eşleşmesinin mümkün olmadığı durumları Gradle'ın nasıl çözümlediğini kontrol etmenize yardımcı olmak için DSL öğeleri içerir.

Aşağıda, varyanta duyarlı bağımlılık eşleştirmesi ve bunların DSL mülkleri kullanılarak nasıl çözüleceğiyle ilgili sorunların bir listesi bulunmaktadır:

  • Uygulamanız, kitaplık bağımlılığında olmayan bir derleme türü içeriyor.

    Örneğin, uygulamanız "hazırlık" derleme türü içeriyor ancak bir bağımlılık yalnızca "hata ayıklama" ve "sürüm" derleme türlerini içeriyor.

    Bir kitaplık bağımlılığı, uygulamanızın sahip olmadığı bir derleme türü içerdiğinde sorun olmadığını unutmayın. Bunun nedeni, eklentinin hiçbir zaman bağımlılıktan derleme türü istememesidir.

    Belirli bir derleme türü için alternatif eşleşmeler belirtmek amacıyla matchingFallbacks kullanın. Eşleşme türleri aşağıda açıklanmıştır:

    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")
            }
        }
    }

    Eskitme

    // 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 kitaplık bağımlılığında mevcut olan belirli bir aroma boyutu, uygulamanız kitaplıkta bulunmayan aromaları içerir.

    Örneğin, hem uygulamanız hem de kitaplık bağımlılıkları "katman" öğe boyutu içerir. Ancak uygulamadaki "katman" boyutu "ücretsiz" ve "ücretli" aromaları içerirken bir bağımlılık aynı boyut için yalnızca "demo" ve "ücretli" aromaları içerir.

    Hem uygulamada hem de kitaplık bağımlılıklarında bulunan belirli bir aroma boyutu için bir kitaplık, uygulamanızda bulunmayan bir ürün aroması içeriyorsa herhangi bir sorun olmaz. Bunun nedeni, eklentinin bu aromayı hiçbir zaman bağımlılıktan istememesidir.

    Uygulamanın "ücretsiz" ürün aroması için alternatif eşleşmeler belirtmek amacıyla matchingFallbacks değerini kullanın. Eşleşmeleri aşağıda 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")
            }
        }
    }
    

    Eskitme

    // 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çeriyor.

    Örneğin, bir kitaplık bağımlılığı "minApi" boyutu için tatlar içerir ancak uygulamanız yalnızca "katman" boyutu için tatlar içerir. Uygulamanızın "freeDebug" sürümünü derlemek istediğinizde, eklenti bağımlılığın "minApi23Debug" sürümünü mü yoksa "minApi18Debug" sürümünü mü kullanacağını bilemez.

    Uygulamanızda, kitaplık bağımlılığının barındırmadığı bir aroma boyutu bulunduğunda herhangi bir sorun yaşanmadığını unutmayın. Bunun nedeni, eklentinin yalnızca bağımlılıkta bulunan boyutların çeşitlerini eşleştirmesidir. Ö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.

    Aşağıdaki örnekte gösterildiği gibi, defaultConfig bloğunda missingDimensionStrategy öğesini kullanarak eklentinin eksik olan boyutları arasından seçim yapacağı varsayılan türü belirtin. Ayrıca productFlavors blokunda seçimlerinizi geçersiz kılabilirsiniz. Böylece her bir çeşit, 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") {}
        }
    }
    

    Eskitme

    // 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ında matchingFallbacks ve missingDimensionStrategy bölümlerine bakın.

İmzalama ayarlarını yapılandırın

Bu derleme için açıkça bir imzalama yapılandırması tanımlamadığınız sürece Gradle sürüm derlemenizin APK'sını veya AAB'sini imzalamaz. Henüz imzalama anahtarınız yoksa Android Studio'yu kullanarak yükleme anahtarı ve anahtar deposu oluşturun.

Gradle derleme yapılandırmalarını kullanarak sürüm derleme türünüz için imzalama yapılandırmalarını manuel olarak yapılandırmak için:

  1. Anahtar deposu oluşturun. Anahtar deposu, bir dizi özel anahtardan oluşan ikili bir dosyadır. Anahtar deponuzu güvenli bir yerde saklamalısınız.
  2. Özel anahtar oluşturun. Özel anahtar, uygulamanızı dağıtılmak üzere imzalamak için kullanılır, hiçbir zaman uygulamaya dahil edilmez veya yetkisiz üçüncü taraflara ifşa edilmez.
  3. İmzalama yapılandırmasını modül düzeyindeki build.gradle.kts dosyası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")
            }
        }
    }

    Eskitme

    ...
    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 iyi bir güvenlik uygulaması değildir. Bunun yerine, bu şifreleri ortam değişkenlerinden almak veya derleme işleminin sizden bu şifreleri istemesini sağlamak için derleme dosyasını yapılandırın.

Bu şifreleri ortam değişkenlerinden almak için:

Kotlin

storePassword = System.getenv("KSTOREPWD")
keyPassword = System.getenv("KEYPWD")

Eskitme

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 eklemeyin. Bunun yerine, her geliştirici için yerel olarak ayarlayın. Daha fazla bilgi için Derleme dosyalarınızdan imzalama bilgilerini kaldırma bölümünü okuyun.

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 bulundurduğunuzdan emin olun. Play Uygulama İmzalama özelliğini kullanıyorsanız ve yükleme anahtarınızı kaybederseniz Play Console'u kullanarak sıfırlama isteğinde bulunabilirsiniz. Play Uygulama İmzalama özelliğini kullanmadan 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ınlarken 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ı makaleye bakın.