Derleme çeşitlerini yapılandırma

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ı bir versionCode. 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:

  1. Araç penceresi çubuğunda Gradle'ı tıklayın.
  2. 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:

    1. Dosya > Ayarlar > Deneysel (Android Studio > Ayarlar > Deneysel ) tıklayın.
    2. Yapmamanın seçimini kaldır Gradle senkronizasyonu sırasında Gradle görev listesi derleme hakkında daha fazla bilgi edinin.
  3. 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ü:

  1. Proje bölmesini açın ve Proje görünümüne gidin.
  2. MyProject/app/src/ adresine gidiş rotasını izle.
  3. src dizinini sağ tıklayıp seçin Yeni > Dizin.
  4. Gradle Kaynak Grupları altındaki menüde full/java olarak ayarlayın.
  5. 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ü:

  1. Proje bölmesinde src simgesini sağ tıklayın dizini açın ve Yeni > XML > Değerler XML Dosyası.
  2. XML dosyasının adını girin veya varsayılan adı değiştirmeyin.
  3. Hedef Kaynak Grubu'nun yanındaki menüde debug.
  4. 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.

Ş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:

  1. src/demoDebug/ (derleme varyantı kaynak grubu)
  2. src/debug/ (derleme türü kaynak grubu)
  3. src/demo/ (ürün aroması kaynağı grubu)
  4. 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/ veya java/ 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ğin src/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ır main/ 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/ ve asset/ 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ğunda missingDimensionStrategy 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:

  1. 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.
  2. Ö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.
  3. İ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