Gradle ve Gradle için Android eklentisi, derleme için esnek bir yol sağlar. uygulamanızı veya kitaplığınızı derleyip paketleyin. Bu sayfada bazı bilgiler her derlemeden en iyi şekilde yararlanmanıza yardımcı olacak yararlı ipuçları ve yapılandırmalar içerir. Derlemelerinizi daha hızlı hale getirmenin yollarını öğrenmek isterseniz Derleme Hızınızı Optimize Edin.
Gradle'ı kullanmaya yeni başladıysanız Derlemenizi Yapılandırma başlıklı makaleyi okuyarak temel bilgileri edinebilirsiniz. Ayrıca, Android eklentisinin DSL referansı dokümanlarına göz atın.
Projeleri ve kaynakları yönetin
Projenizin modüllerini ve modüllerini yönetebileceğiniz kaynaklar. Proje ve modül oluşturma ve yönetme hakkında daha fazla bilgi edinmek için Projelere Genel Bakış.
Varsayılan kaynak kümesi yapılandırmalarını değiştirme
sourceSets
bloğunu modül düzeyindeki build.gradle
öğesinde kullanabilirsiniz
dosyasını kullanarak Gradle'ın bir sanal makinenin her bileşeni için dosya
kaynak kümesi için geçerlidir.
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'] // When you list multiple directories, Gradle uses all of them to collect // sources. You should avoid specifying a directory which is a parent to one // or more other directories you specify. res.srcDirs = ['other/res1', 'other/res2'] // For each source set, you can specify only one Android manifest. // The following points Gradle to a different manifest for this source set. 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' ... } } } ...
Kotlin
android { ... sourceSets { // Encapsulates configurations for the main source set. getByName("main") { // Changes the directory for Java sources. The default directory is // 'src/main/java'. java.setSrcDirs("other/java") // When you list multiple directories, Gradle uses all of them to collect // sources. You should avoid specifying a directory which is a parent to one // or more other directories you specify. res.setSrcDirs("other/res1", "other/res2") // For each source set, you can specify only one Android manifest. // The following points Gradle to a different manifest for this source set. 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") ... } } } ...
Kitaplıkları ve bağımlılıkları yönetme
Gradle, ister kaynak ister olsun, bağımlılıkları yönetmek için uzak kitaplıklar veya yerel kitaplık modülleri.
Bağımlılık yapılandırmalarıyla belirli derlemeleri hedefleme
Yalnızca belirli bir derleme varyantı kaynak kümesi veya test kaynağı kümesi için bağımlılık istiyorsanız bağımlılık konfigürasyonunun adını ekleyin ve derleme varyantının adını ya da test kaynağı kümesidir.
Eski
android {...} // Creates Gradle dependency configurations to use in the dependencies block. configurations { // For variants that combine a product flavor and build type, you need to // intitialize a placeholder for its dependency configuration. freeDebugRuntimeOnly{} ... } dependencies { // Adds an implementation dependency only to the "free" product flavor. freeImplementation 'com.google.firebase:firebase-ads:21.5.1' // Adds a runtimeOnly dependency only to the "freeDebug" build variant. freeDebugRuntimeOnly fileTree(dir: 'libs', include: ['*.jar']) // 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' }
Kotlin
android {...} dependencies { // Use ""() notation for custom flavors and build types // Adds an implementation dependency only to the "free" product flavor. "freeImplementation"("com.google.firebase:firebase-ads:21.5.1") // Adds a runtimeOnly dependency only to the "freeDebug" build variant. "freeDebugRuntimeOnly"(fileTree("dir" to "libs", "include" to "*.jar")) // 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") }
Uygulamanızın farklı sürümlerini oluşturun
Gradle ve Android eklentisi sayesinde web sitenizin farklı sürümlerini derleme varyantlarını yapılandırarak tek bir modülden uygulamayı kullanabilirsiniz.
Dinamik sürüm kodlarını yapılandırma
Gradle, projeniz için APK oluşturduğunda varsayılan olarak her APK
modül düzeyindeki build.gradle
dosyasında belirtilenle aynı sürüm bilgileri bulunmalıdır.
Google Play Store aynı uygulama için birden fazla APK'ya izin vermediğinden
her APK'nın sürüm bilgilerine sahip olduğundan emin olmalısınız.
sizden önce kendine ait benzersiz versionCode
Play Store'a yükleyebilirsiniz.
Bu işlemi, farklı bir sürüm kodu atayan özel derleme mantığıyla yapabilirsiniz. her APK'ya otomatik olarak ekler. Örneğin, her uygulama için ayrı APK oluştururken ABI, otomatik APK sürümü oluşturma işlemi aşağıdaki gibi görünür:
Eski
android { ... defaultConfig { ... versionCode 4 } splits { ... } } // Map for the version code that gives each ABI a value. ext.abiCodes = ['armeabi-v7a':1, mips:2, x86:3] // For per-density APKs, create a similar map like this: // ext.densityCodes = ['hdpi': 1, 'xhdpi': 2, 'xxhdpi': 3, 'xxxhdpi': 4] import com.android.build.OutputFile // For each APK output variant, override versionCode with a combination of // ext.abiCodes * 1000 + variant.versionCode. In this example, variant.versionCode // is equal to defaultConfig.versionCode. If you configure product flavors that // define their own versionCode, variant.versionCode uses that value instead. android.applicationVariants.all { variant -> // Assigns a different version code for each output APK // other than the universal APK. variant.outputs.each { output -> // Stores the value of ext.abiCodes that is associated with the ABI for this variant. def baseAbiVersionCode = // Determines the ABI for this variant and returns the mapped value. project.ext.abiCodes.get(output.getFilter(OutputFile.ABI)) // Because abiCodes.get() returns null for ABIs that are not mapped by ext.abiCodes, // the following code does not override the version code for universal APKs. // However, because we want universal APKs to have the lowest version code, // this outcome is desirable. if (baseAbiVersionCode != null) { // Assigns the new version code to versionCodeOverride, which changes the version code // for only the output APK, not for the variant itself. Skipping this step simply // causes Gradle to use the value of variant.versionCode for the APK. output.versionCodeOverride = baseAbiVersionCode * 1000 + variant.versionCode } } }
Kotlin
android { ... defaultConfig { ... versionCode = 4 } splits { ... } } // Map for the version code that gives each ABI a value. val abiCodes = mapOf("armeabi-v7a" to 1, "mips" to 2, "x86" to 3) // For per-density APKs, create a similar map like this: // val densityCodes = mapOf("hdpi" to 1, "xhdpi" to 2, "xxhdpi" to 3, "xxxhdpi" to 4) import com.android.build.api.variant.FilterConfiguration.FilterType.* // For each APK output variant, override versionCode with a combination of // abiCodes * 1000 + variant.versionCode. In this example, variant.versionCode // is equal to defaultConfig.versionCode. If you configure product flavors that // define their own versionCode, variant.versionCode uses that value instead. androidComponents { onVariants { variant -> // Assigns a different version code for each output APK // other than the universal APK. variant.outputs.forEach { output -> val name = output.filters.find { it.filterType == ABI }?.identifier // Stores the value of abiCodes that is associated with the ABI for this variant. val baseAbiCode = abiCodes[name] // Because abiCodes.get() returns null for ABIs that are not mapped by ext.abiCodes, // the following code does not override the version code for universal APKs. // However, because we want universal APKs to have the lowest version code, // this outcome is desirable. if (baseAbiCode != null) { // Assigns the new version code to output.versionCode, which changes the version code // for only the output APK, not for the variant itself. output.versionCode.set(baseAbiCode * 1000 + (output.versionCode.get() ?: 0)) } } } }
Birden fazla ürün aromasını birleştirin
Bazı durumlarda, ortak özellikleri bulunuyor. Bunu yapmak için Gradle'a yönelik Android eklentisi aroma adı verilen ürün aroma grupları oluşturmanıza olanak tanır. seçin.
Aşağıdaki kod örneğinde
"Mod" oluşturmak için flavorDimensions
özelliği grup için aroma boyutu
"tam" ve "demo" ürün aromalarını ve "api" grup için aroma boyutu
ürün türü yapılandırmaları. Gradle ve ardından
"mode"dan alınan ürün aromalarını bir boyuta sahip olan boyutunu oluşturabilirsiniz.
Eski
android { ... buildTypes { debug {...} release {...} } // Specifies the flavor dimensions you want to use. The order in which you // list each dimension determines its 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 above--the first dimension has 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. To learn more about assigning version codes to // support app updates and uploading to Google Play, read Multiple APK Support 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" ... } } } ...
Kotlin
android { ... buildTypes { getByName("debug") {...} getByName("release") {...} } // Specifies the flavor dimensions you want to use. The order in which you // list each dimension determines its 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 above--the first dimension has a higher // priority than the second, and so on. create("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. To learn more about assigning version codes to // support app updates and uploading to Google Play, read Multiple APK Support versionCode = 30000 + android.defaultConfig.versionCode versionNameSuffix = "-minApi24" ... } create("minApi23") { dimension = "api" minSdkVersion(23) versionCode = 20000 + android.defaultConfig.versionCode versionNameSuffix = "-minApi23" ... } create("minApi21") { dimension = "api" minSdkVersion(21) versionCode = 10000 + android.defaultConfig.versionCode versionNameSuffix = "-minApi21" ... } } } ...
Filtre varyantları
Filtreleri
istemediğiniz derleme değişkenlerini
Modülün build.gradle
dosyasında variantFilter
bloğu. İlgili içeriği oluşturmak için kullanılan
aşağıdaki örnek kod, Gradle'a
"minApi21" ve "demo" ürün aromaları:
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) } } } ...
Kotlin
android { ... buildTypes {...} flavorDimensions "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.enabled = false } } } ...
Uygulamanızı Test Etme
Yerel ve entegre birim testleri çalıştırma hakkında daha fazla bilgi edinmek için Uygulamanızı test etme bölümünü okuyun.
lint seçeneklerini yapılandırın
Modül düzeyindeki build.gradle
dosyanızda lintOptions
bloğu vardır. Alıcı:
Android projeniz için lint kullanma hakkında daha fazla bilgi edinmek isterseniz Lint ile Kodunuzu İyileştirme bölümünü okuyun.
Eski
android { ... lintOptions { // Turns off checks for the issue IDs you specify. disable 'TypographyFractions','TypographyQuotes' // Turns on checks for the issue IDs you specify. These checks are in // addition to the default lint checks. enable 'RtlHardcoded','RtlCompat', 'RtlEnabled' // To enable checks for only a subset of issue IDs and ignore all others, // list the issue IDs with the 'check' property instead. This property overrides // any issue IDs you enable or disable using the properties above. checkOnly 'NewApi', 'InlinedApi' // If set to true, turns off analysis progress reporting by lint. quiet true // if set to true (default), stops the build if errors are found. abortOnError false // if true, only report errors. ignoreWarnings true } } ...
Kotlin
android { ... lintOptions { // Turns off checks for the issue IDs you specify. disable("TypographyFractions") disable("TypographyQuotes") // Turns on checks for the issue IDs you specify. These checks are in // addition to the default lint checks. enable("RtlHardcoded") enable("RtlCompat") enable("RtlEnabled") // To enable checks for only a subset of issue IDs and ignore all others, // list the issue IDs with the 'check' property instead. This property overrides // any issue IDs you enable or disable using the properties above. checkOnly("NewApi", "InlinedApi") // If set to true, turns off analysis progress reporting by lint. quiet = true // if set to true (default), stops the build if errors are found. abortOnError = false // if true, only report errors. ignoreWarnings = true } } ...
Araç manifest ayarlarını yapılandırın
Gradle, test APK'nızı derlerken otomatik olarak AndroidManifest.xml
dosyasını oluşturur ve
<instrumentation>
ile yapılandırır
düğüm. Bu düğümün ayarlarından bazılarını değiştirmek için
test kaynağı grubundaki başka bir manifest dosyasıyla veya
gösterildiği gibi, modül düzeyindeki build.gradle
dosyanızı
aşağıdaki kod örneğine bakalım.
Eski
android { ... // Each product flavor you configure can override properties in the // defaultConfig block. To learn more, go to Configure Product Flavors. defaultConfig { ... // Specifies the application ID for the test APK. testApplicationId "com.test.foo" // Specifies the fully-qualified class name of the test instrumentation runner. testInstrumentationRunner "android.test.InstrumentationTestRunner" // If set to 'true', enables the instrumentation class to start and stop profiling. // If set to false (default), profiling occurs the entire time the instrumentation // class is running. testHandleProfiling true // If set to 'true', indicates that the Android system should run the instrumentation // class as a functional test. The default value is 'false' testFunctionalTest true } } ...
Kotlin
android { ... // Each product flavor you configure can override properties in the // defaultConfig block. To learn more, go to Configure Product Flavors. defaultConfig { ... // Specifies the application ID for the test APK. testApplicationId = "com.test.foo" // Specifies the fully-qualified class name of the test instrumentation runner. testInstrumentationRunner = "android.test.InstrumentationTestRunner" // If set to 'true', enables the instrumentation class to start and stop profiling. // If set to false (default), profiling occurs the entire time the instrumentation // class is running. testHandleProfiling = true // If set to 'true', indicates that the Android system should run the instrumentation // class as a functional test. The default value is 'false' testFunctionalTest = true } } ...
Test derleme türünü değiştirme
Varsayılan olarak tüm testler, hata ayıklama derleme türüne göre çalıştırılır. Bu ayarı değiştirebilirsiniz.
başka bir derleme türüne geçirmek için testBuildType
özelliğini
modül düzeyindeki build.gradle
dosyanız. Örneğin,
testlerinizi "hazırlama"nıza göre uygulayın derleme türü için, dosyayı aşağıdaki konumda gösterildiği gibi düzenleyin:
snippet'i eklemeniz gerekir.
Eski
android { ... testBuildType "staging" }
Kotlin
android { ... testBuildType "staging" }
Gradle test seçeneklerini yapılandırın
Gradle'ın tüm testlerinizi çalıştırma şeklini değiştiren seçenekleri belirtmek için
Modül düzeyinde testOptions
bloğu
build.gradle
.
Eski
android { ... // Encapsulates options for running tests. testOptions { // Changes the directory where Gradle saves test reports. By default, Gradle saves test reports // in the path_to_your_project/module_name/build/outputs/reports/ directory. // '$rootDir' sets the path relative to the root directory of the current project. reportDir "$rootDir/test-reports" // Changes the directory where Gradle saves test results. By default, Gradle saves test results // in the path_to_your_project/module_name/build/outputs/test-results/ directory. // '$rootDir' sets the path relative to the root directory of the current project. resultsDir "$rootDir/test-results" } }
Kotlin
android { ... // Encapsulates options for running tests. testOptions { // Changes the directory where Gradle saves test reports. By default, Gradle saves test reports // in the path_to_your_project/module_name/build/outputs/reports/ directory. // '$rootDir' sets the path relative to the root directory of the current project. reportDir "$rootDir/test-reports" // Changes the directory where Gradle saves test results. By default, Gradle saves test results // in the path_to_your_project/module_name/build/outputs/test-results/ directory. // '$rootDir' sets the path relative to the root directory of the current project. resultsDir "$rootDir/test-results" } }
Yalnızca yerel birim testlerine ilişkin seçenekleri belirtmek için
testOptions.unitTests
blok.
Eski
android { ... testOptions { ... // Encapsulates options for local unit tests. unitTests { // By default, local unit tests throw an exception any time the code you are testing tries to access // Android platform APIs (unless you mock Android dependencies yourself or with a testing // framework like Mockito). However, you can enable the following property so that the test // returns either null or zero when accessing platform APIs, rather than throwing an exception. returnDefaultValues true // Encapsulates options for controlling how Gradle executes local unit tests. For a list // of all the options you can specify, read Gradle's reference documentation. all { // Sets JVM argument(s) for the test JVM(s). jvmArgs '-XX:MaxPermSize=256m' // You can also check the task name to apply options to only the tests you specify. if (it.name == 'testDebugUnitTest') { systemProperty 'debug', 'true' } } } } }
Kotlin
android { ... testOptions { ... // Encapsulates options for local unit tests. unitTests { // By default, local unit tests throw an exception any time the code you are testing tries to access // Android platform APIs (unless you mock Android dependencies yourself or with a testing // framework like Mockito). However, you can enable the following property so that the test // returns either null or zero when accessing platform APIs, rather than throwing an exception. returnDefaultValues true // Encapsulates options for controlling how Gradle executes local unit tests. For a list // of all the options you can specify, read Gradle's reference documentation. all { // Sets JVM argument(s) for the test JVM(s). jvmArgs '-XX:MaxPermSize=256m' // You can also check the task name to apply options to only the tests you specify. if (it.name == 'testDebugUnitTest') { systemProperty 'debug', 'true' } } } } }
Derlemenizi optimize edin
Bu bölümde, Google Analytics 4'te tam ve dönüşüm alanlarınızı iyi bir fırsattır. Daha fazla bilgi edinmek için Derleme Hızınızı Optimize Edin.
Kodunuzu küçültün
Android Studio, kodunuzu küçültmek için ProGuard kural dosyalarını kullanan R8'i kullanır. Yeni
projeler için Android Studio, şuradan bir varsayılan ayarlar dosyası (proguard-android.txt
) kullanır:
Android SDK'sının tools/proguard/folder
. Daha fazla kod küçültmek için
proguard-android-optimize.txt
dosya aynı konumda olmalıdır.
Eski
android { buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } ... } ...
Kotlin
android { buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } ... } ...
Her derleme varyantına özel kurallar eklemek için aşağıdakileri yapılandırın
ek
proguardFiles
özelliğini kullanın. Örneğin,
aşağıdaki örnekte "aroma2"ye flavor2-rules.pro
eklenir. Artık
"Tür 2"nin yayın sürümü üç kural dosyasının tümünü kullanır çünkü
bu sürüm engellemesi de uygulanır.
Eski
android { ... buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } productFlavors { flavor1 { ... } flavor2 { proguardFile 'flavor2-rules.pro' } } } ...
Kotlin
android { ... buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } productFlavors { flavor1 { ... } flavor2 { proguardFile 'flavor2-rules.pro' } } } ...
Uygulamanızı yayınlama
Uygulamanızı Google Play'de yayınlama hakkında daha fazla bilgi edinmek için Uygulamanızı Yayınlama başlıklı makaleyi okuyun.
Uygulamanızı imzalayın
Android Studio, sürüm için imzalamayı yapılandırmanın kolay bir yolunu sunsa da
derlemelerinin alt tarafındaki
signingConfigs
bloğunu modülünüzün build.gradle
dosya:
Eski
android { ... defaultConfig { ... } // Encapsulates signing configurations. signingConfigs { // Creates a signing configuration called "release". release { // Specifies the path to your keystore file. storeFile file("my-release-key.jks") // Specifies the password for your keystore. storePassword "password" // Specifies the identifying name for your key. keyAlias "my-alias" // Specifies the password for your key. keyPassword "password" } } buildTypes { release { // Adds the "release" signing configuration to the release build type. signingConfig signingConfigs.release ... } } } ...
Kotlin
android { ... defaultConfig { ... } // Encapsulates signing configurations. signingConfigs { // Creates a signing configuration called "release". release { // Specifies the path to your keystore file. storeFile file("my-release-key.jks") // Specifies the password for your keystore. storePassword "password" // Specifies the identifying name for your key. keyAlias "my-alias" // Specifies the password for your key. keyPassword "password" } } buildTypes { release { // Adds the "release" signing configuration to the release build type. signingConfig signingConfigs.release ... } } } ...
Gizli imzalama bilgilerini projenizden kaldırın
Varsayılan olarak, imzalama yapılandırmaları düz metin biçiminde modülün
build.gradle
dosyası yükleyin. Bir ekiple veya
bu hassas bilgileri doğrudan derlemenin dışına taşıyabilirsiniz
dosyalarını aşağıdaki gibi taşıyabilirsiniz.
- Uygulamanızın kök dizininde
keystore.properties
adlı bir dosya oluşturun. şu bilgileri içermelidir:storePassword=myStorePassword keyPassword=myKeyPassword keyAlias=myKeyAlias storeFile=myStoreFileLocation
build.gradle
dosyanızdakeystore.properties
öğesini yükleyin. dosyasını aşağıdaki gibi kullanın (bu dosya, Android bloğundan önce olmalıdır):Eski
// Creates a variable called keystorePropertiesFile, and initializes it to the // keystore.properties file. def keystorePropertiesFile = rootProject.file("keystore.properties") // Initializes a new Properties() object called keystoreProperties. def keystoreProperties = new Properties() // Loads the keystore.properties file into the keystoreProperties object. keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) android { ... } ...
Kotlin
// Creates a variable called keystorePropertiesFile, and initializes it to the // keystore.properties file. def keystorePropertiesFile = rootProject.file("keystore.properties") // Initializes a new Properties() object called keystoreProperties. def keystoreProperties = new Properties() // Loads the keystore.properties file into the keystoreProperties object. keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) android { ... } ...
keystoreProperties
içinde saklanan imza bilgilerini girin nesne:Eski
android { signingConfigs { config { keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] storeFile file(keystoreProperties['storeFile']) storePassword keystoreProperties['storePassword'] } } ... } ...
Kotlin
android { signingConfigs { config { keyAlias keystoreProperties['keyAlias'] keyPassword keystoreProperties['keyPassword'] storeFile file(keystoreProperties['storeFile']) storePassword keystoreProperties['storePassword'] } } ... } ...
- Bildirim çubuğunda Sync Now'ı (Şimdi Senkronize Et) tıklayın.
Uygulama imzalama hakkında daha fazla bilgi için Uygulamanızı İmzalama başlıklı makaleyi okuyun.
Uygulama geliştirme sürecini basitleştirin
Aşağıdaki ipuçları, Android uygulamanızı geliştirmenizi kolaylaştırır.
Özel alanları ve kaynak değerlerini uygulamanızın koduyla paylaşma
Gradle, derleme sırasında BuildConfig
sınıfını oluşturur. Böylece
uygulama kodu, mevcut derlemeyle ilgili bilgileri inceleyebilir. Ayrıca şunları da ekleyebilirsiniz:
Gradle derlemenizden BuildConfig
sınıfına özel alanlar
ve erişimi kullanarak buildConfigField()
yöntemini kullanarak yapılandırma dosyasını
bu değerleri uygulamanızın çalışma zamanı koduna ekleyin. Benzer şekilde, uygulama kaynağı ekleyebilirsiniz.
değerleri resValue()
ile değiştirin.
Eski
android { ... buildTypes { release { // These values are defined only for the release build, which // is typically used for full builds and continuous builds. buildConfigField("String", "BUILD_TIME", "\"${minutesSinceEpoch}\"") resValue("string", "build_time", "${minutesSinceEpoch}") ... } debug { // Use static values for incremental builds to ensure that // resource files and BuildConfig aren't rebuilt with each run. // If these rebuild dynamically, they can interfere with // Apply Changes as well as Gradle UP-TO-DATE checks. buildConfigField("String", "BUILD_TIME", "\"0\"") resValue("string", "build_time", "0") } } } ...
Kotlin
android { ... buildTypes { release { // These values are defined only for the release build, which // is typically used for full builds and continuous builds. buildConfigField("String", "BUILD_TIME", "\"${minutesSinceEpoch}\"") resValue("string", "build_time", "${minutesSinceEpoch}") ... } debug { // Use static values for incremental builds to ensure that // resource files and BuildConfig aren't rebuilt with each run. // If these rebuild dynamically, they can interfere with // Apply Changes as well as Gradle UP-TO-DATE checks. buildConfigField("String", "BUILD_TIME", "\"0\"") resValue("string", "build_time", "0") } } } ...
Uygulama kodunuzda özelliklere aşağıdaki şekilde erişebilirsiniz:
Kotlin
... Log.i(TAG, BuildConfig.BUILD_TIME) Log.i(TAG, getString(R.string.build_time))
Java
... Log.i(TAG, BuildConfig.BUILD_TIME); Log.i(TAG, getString(R.string.build_time));
Mülkleri manifest dosyasıyla paylaşma
Bazı durumlarda,
ve kodunuzu (örneğin, bir kuruluş için yetkilileri bildirirken)
FileProvider
) bilgileri gösterilir.
Birden çok konumda aynı mülkü güncellemek yerine
değiştirin, modülünüzün build.gradle
bölümünde tek bir özellik tanımlayın
dosyası aşağıda gösterildiği gibi hem manifest hem de kodunuzda kullanılabilir olması gerekir:
örneği inceleyelim. Daha fazla bilgi için
Manifest dosyası.
Eski
android { // For settings specific to a product flavor, configure these properties // for each flavor in the productFlavors block. defaultConfig { // Creates a property for the FileProvider authority. def filesAuthorityValue = applicationId + ".files" // Creates a placeholder property to use in the manifest. manifestPlaceholders = [filesAuthority: filesAuthorityValue] // Adds a new field for the authority to the BuildConfig class. buildConfigField("String", "FILES_AUTHORITY", "\"${filesAuthorityValue}\"") } ... } ...
Kotlin
android { // For settings specific to a product flavor, configure these properties // for each flavor in the productFlavors block. defaultConfig { // Creates a property for the FileProvider authority. val filesAuthorityValue = applicationId + ".files" // Creates a placeholder property to use in the manifest. manifestPlaceholders["filesAuthority"] = filesAuthorityValue // Adds a new field for the authority to the BuildConfig class. buildConfigField("String", "FILES_AUTHORITY", "\"${filesAuthorityValue}\"") } ... } ...
Manifest'inizde yer tutucuya aşağıdaki şekilde erişin:
<manifest> ... <application> ... <provider android:name="android.support.v4.content.FileProvider" android:authorities="${filesAuthority}" android:exported="false" android:grantUriPermissions="true"> ... </provider> </application> </manifest>
Uygulamanızın kod görünümündeki FILES_AUTHORITY
alanına erişmek
şunun gibi bir şey:
Kotlin
... val contentUri: Uri = FileProvider.getUriForFile(context, BuildConfig.FILES_AUTHORITY, myFile)
Java
... Uri contentUri = FileProvider.getUriForFile(getContext(), BuildConfig.FILES_AUTHORITY, myFile);