Membuat File Dan Upload File Secara Otomatis Ke Database Android Studio
Halaman ini didasarkan pada ringkasan Mengonfigurasi build Anda untuk menampilkan cara mengonfigurasi varian build agar dapat membuat versi aplikasi yang berbeda dari sebuah projection, serta cara mengelola konfigurasi penandatanganan dan dependensi dengan benar.
Setiap varian build menyatakan versi aplikasi berbeda yang dapat Anda build. Misalnya, Anda ingin mem-build satu versi aplikasi gratuitous, dengan materi terbatas, dan versi lainnya yaitu versi berbayar yang berisi lebih banyak materi. Anda juga dapat mem-build versi lain aplikasi yang menargetkan perangkat berbeda, berdasarkan API level atau variasi perangkat lainnya.
Varian build adalah hasil dari Gradle yang menggunakan seperangkat aturan tertentu untuk menggabungkan setelan, kode, dan resource yang dikonfigurasi dalam jenis build dan ragam produk. Meskipun tidak mengonfigurasi varian build secara langsung, Anda mengonfigurasi jenis build dan ragam produk yang membentuknya.
Misalnya, ragam produk "demo" dapat menetapkan fitur dan persyaratan perangkat yang berbeda, seperti kode sumber khusus, resource, dan API level minimum, sedangkan jenis build "debug" menerapkan setelan build dan paket yang berbeda, seperti opsi debug dan kunci penandatanganan. Varian build yang dihasilkan adalah versi "demoDebug" dari aplikasi Anda, dan mencakup kombinasi konfigurasi dan resource yang disertakan di ragam produk "demo", jenis build "debug", dan prepare sumber master/
.
Mengonfigurasi jenis build
Anda dapat membuat dan mengonfigurasi jenis build dalam file build.gradle
level modul di dalam blok android
. Jika Anda membuat modul baru, Android Studio secara otomatis akan membuatkan debug dan jenis build rilis. Meskipun jenis build debug tidak muncul dalam file konfigurasi build, Android Studio akan mengonfigurasinya dengan debuggable truthful
. Ini memungkinkan Anda men-debug aplikasi di perangkat Android yang aman dan mengonfigurasi penandatanganan aplikasi dengan keystore debug generik.
Anda dapat menambahkan jenis build debug ke konfigurasi jika ingin menambahkan atau mengubah setelan tertentu. Contoh berikut menentukan applicationIdSuffix
untuk jenis build debug, dan mengonfigurasi jenis build "staging" yang diinisialisasi menggunakan setelan dari jenis build debug.
Dandy
android { defaultConfig { manifestPlaceholders = [hostName:"www.example.com"] ... } buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { applicationIdSuffix ".debug" debuggable truthful } /** * The `initWith` holding allows y'all to copy configurations from other build types, * then configure only the settings you desire to modify. This one copies the debug build * blazon, then changes the manifest placeholder and awarding ID. */ staging { initWith debug manifestPlaceholders = [hostName:"internal.example.com"] applicationIdSuffix ".debugStaging" } } }
Kotlin
android { defaultConfig { manifestPlaceholders["hostName"] = "www.instance.com" ... } buildTypes { getByName("release") { isMinifyEnabled = true proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro") } getByName("debug") { applicationIdSuffix = ".debug" isDebuggable = true } /** * The `initWith` property allows you to re-create configurations from other build types, * then configure only the settings you desire to change. This ane copies the debug build * blazon, then changes the manifest placeholder and application ID. */ create("staging") { initWith(getByName("debug")) manifestPlaceholders["hostName"] = "internal.example.com" applicationIdSuffix = ".debugStaging" } } }
Catatan: Jika Anda membuat perubahan pada file konfigurasi build, Android Studio akan mengharuskan Anda untuk menyinkronkan project dengan konfigurasi baru. Untuk menyinkronkan project, Anda dapat mengklik Sync At present dalam baris notifikasi yang muncul begitu Anda membuat perubahan atau mengklik Sync Project dari toolbar. Jika Android Studio menemukan error pada konfigurasi Anda, jendela Messages akan muncul untuk menjelaskan masalah tersebut.
Untuk mempelajari lebih lanjut semua properti yang dapat Anda konfigurasikan dengan jenis build, baca referensi DSL BuildType.
Mengonfigurasi ragam produk
Membuat ragam produk hampir sama dengan membuat jenis build: tambahkan ragam produk ke blok productFlavors
dalam konfigurasi build Anda dan sertakan setelan yang Anda inginkan. Ragam produk mendukung properti yang sama seperti defaultConfig
. Ini karena defaultConfig
sebenarnya termasuk class ProductFlavor
. Hal ini berarti Anda dapat menyediakan konfigurasi dasar untuk semua ragam dalam blok defaultConfig
, dan setiap ragam dapat mengubah bagian mana pun dari nilai default ini, misalnya applicationId
. Untuk mempelajari ID aplikasi lebih lanjut, baca Menyetel ID Aplikasi.
Catatan: Anda masih harus menentukan nama paket menggunakan atribut package
dalam file manifes main/
. Anda juga harus menggunakan nama paket tersebut dalam kode sumber untuk mereferensi ke class R, atau menetapkan aktivitas relatif atau pendaftaran layanan. Ini memungkinkan Anda menggunakan applicationId
sehingga memberi setiap ragam produk sebuah ID unik untuk pemaketan dan distribusi, tanpa harus mengubah kode sumber.
Semua ragam harus dimiliki oleh dimensi ragam bernama, yang merupakan kelompok ragam produk. Anda harus menentukan semua ragam ke dimensinya; jika tidak, Anda akan mengalami mistake build seperti di bawah ini. Jika modul yang diberikan hanya menentukan satu dimensi ragam, plugin Android Gradle akan otomatis menetapkan semua ragam modul ke dimensi tersebut.
Error:All flavors must at present belong to a named flavour dimension. The season 'flavor_name' is non assigned to a flavor dimension.
Contoh kode berikut akan membuat dimensi ragam yang diberi nama "version" dan menambahkan ragam produk "demo" dan "full". Ragam ini memberikan applicationIdSuffix
dan versionNameSuffix
-nya sendiri:
Groovy
android { ... defaultConfig {...} buildTypes { debug{...} release{...} } // Specifies ane flavor dimension. flavorDimensions "version" productFlavors { demo { // Assigns this product flavour to the "version" flavor dimension. // If you are using only one dimension, this belongings 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" } } }
Kotlin
android { ... defaultConfig {...} buildTypes { getByName("debug"){...} getByName("release"){...} } // Specifies i flavor dimension. flavorDimensions += "version" productFlavors { create("demo") { // Assigns this product season to the "version" flavour dimension. // If you lot 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 = "-total" } } }
Catatan: Untuk aplikasi lama yang mendistribusikan menggunakan APK di Google Play (dibuat sebelum Agustus 2021), untuk mendistribusikan aplikasi menggunakan Dukungan Beberapa APK di Google Play, tetapkan nilai applicationId
yang sama ke semua varian dan berikan versionCode
yang berbeda ke setiap varian. Untuk mendistribusikan varian lain dari aplikasi Anda sebagai aplikasi terpisah di Google Play, Anda perlu menetapkan applicationId
yang berbeda ke setiap varian.
Setelah Anda membuat dan mengonfigurasi ragam produk, klik Sync Now di baris notifikasi. Setelah sinkronisasi selesai, Gradle akan otomatis membuat varian build berdasarkan jenis build dan ragam produk Anda, dan memberinya nama yang sesuai dengan <product-flavor><Build-Type>
. Misalnya, jika Anda membuat ragam produk "demo" dan "full", dan mempertahankan jenis build default "debug" dan "release", Gradle akan membuat varian build berikut:
- demoDebug
- demoRelease
- fullDebug
- fullRelease
Anda dapat mengubah varian build menjadi apa pun yang ingin Anda build dan jalankan. Cukup buka Build > Select Build Variant, lalu pilih salah satu dari bill of fare drib-down. Namun, untuk mulai menyesuaikan setiap varian build dengan fitur dan resources-nya sendiri, Anda perlu mengetahui cara membuat dan mengelola set sumber.
Mengubah ID aplikasi untuk varian build
Ketika Anda membuat APK atau AAB untuk aplikasi, alat build akan menandai aplikasi dengan ID aplikasi yang ditentukan dalam blok defaultConfig
dari file build.gradle
(seperti yang ditampilkan di bawah ini). Namun, jika Anda ingin membuat versi lain aplikasi agar muncul sebagai listingan terpisah di Google Play Store, seperti versi "gratis" dan "pro", Anda harus membuat varian build terpisah yang masing-masing memiliki ID aplikasi yang berbeda. Dalam hal ini, setiap varian build harus ditentukan sebagai ragam produk terpisah. Untuk setiap ragam dalam blok productFlavors
, Anda dapat menentukan ulang properti applicationId
, atau menambahkan segmen ke ID aplikasi default menggunakan applicationIdSuffix
, seperti yang ditampilkan di sini:
Smashing
android { defaultConfig { applicationId "com.instance.myapp" } productFlavors { free { applicationIdSuffix ".free" } pro { applicationIdSuffix ".pro" } } }
Kotlin
android { defaultConfig { applicationId = "com.example.myapp" } productFlavors { create("gratis") { applicationIdSuffix = ".complimentary" } create("pro") { applicationIdSuffix = ".pro" } } }
Dengan demikian, ID aplikasi untuk ragam produk "complimentary" adalah "com.case.myapp.free". Anda juga dapat menggunakan applicationIdSuffix
untuk menambahkan segmen berdasarkan jenis build, seperti yang ditampilkan di sini:
Groovy
android { ... buildTypes { debug { applicationIdSuffix ".debug" } } }
Kotlin
android { ... buildTypes { getByName("debug") { applicationIdSuffix = ".debug" } } }
Karena Gradle menerapkan konfigurasi jenis build setelah ragam produk, ID aplikasi untuk varian build "debug gratuitous" sekarang menjadi "com.case.myapp.gratis.debug". Ini berguna jika Anda ingin memiliki build debug dan rilis di perangkat yang sama, karena dua aplikasi tidak dapat memiliki ID aplikasi yang sama. Untuk aplikasi lama yang didistribusikan menggunakan APK di Google Play (dibuat sebelum Agustus 2021), jika ingin menggunakan listingan aplikasi yang sama untuk mendistribusikan beberapa APK yang masing-masing menargetkan konfigurasi perangkat berbeda (seperti API level), Anda harus menggunakan ID aplikasi yang sama untuk setiap varian build, tetapi memberikan versionCode
yang berbeda untuk setiap APK. Untuk mengetahui informasi selengkapnya, baca Dukungan multi-APK. Publikasi yang menggunakan AAB tidak akan terpengaruh karena menggunakan satu artefak yang menggunakan satu kode versi dan ID aplikasi secara default.
Perhatian: Untuk kompatibilitas dengan SDK Tools sebelumnya, jika Anda tidak menentukan properti applicationId
dalam file build.gradle
, alat build akan menggunakan nama paket dari file AndroidManifest.xml
sebagai ID aplikasi. Dalam hal ini, pemfaktoran ulang nama paket juga akan mengubah ID aplikasi Anda.
Tips: Jika perlu mereferensikan ID aplikasi dalam file manifes, Anda dapat menggunakan placeholder ${applicationId}
dalam atribut manifes apa pun. Pada proses build, Gradle akan mengganti tag ini dengan ID aplikasi yang sebenarnya. Untuk mengetahui informasi selengkapnya, lihat Menginjeksi Variabel Build ke dalam Manifes.
Menggabungkan beberapa ragam produk dengan dimensi ragam
Dalam beberapa situasi, Anda mungkin ingin menggabungkan konfigurasi dari beberapa ragam produk. Misalnya, Anda mungkin ingin membuat konfigurasi yang berbeda untuk ragam produk "full" dan "demo" berdasarkan API level. Untuk melakukannya, plugin Android untuk Gradle akan memungkinkan Anda membuat beberapa grup ragam produk yang disebut dimensi ragam. Saat mem-build aplikasi, Gradle akan menggabungkan konfigurasi ragam produk dari setiap dimensi ragam yang Anda tentukan, bersama konfigurasi jenis build, untuk membuat varian build akhir. Gradle tidak menggabungkan ragam produk yang dimiliki dimensi ragam yang sama.
Contoh kode berikut menggunakan properti flavorDimensions
untuk membuat dimensi ragam "manner" guna mengelompokkan ragam produk "total" dan "demo", serta dimensi ragam "api" guna mengelompokkan konfigurasi ragam produk berdasarkan API level:
Keen
android { ... buildTypes { debug {...} release {...} } // Specifies the flavor dimensions you desire to utilize. 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 y'all configure to 1 of the flavour dimensions. flavorDimensions "api", "mode" productFlavors { demo { // Assigns this product flavor to the "style" flavour dimension. dimension "mode" ... } full { dimension "mode" ... } // Configurations in the "api" production flavors override those in "mode" // flavors and the defaultConfig block. Gradle determines the priority // between season dimensions based on the club in which they appear next // to the flavorDimensions property higher up--the outset dimension has a higher // priority than the second, then on. minApi24 { dimension "api" minSdkVersion 24 // To ensure the target device receives the version of the app with // the highest uniform API level, assign version codes in increasing // value with API level. To learn more than 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 utilise. The order in which you // listing each dimension determines its priority, from highest to lowest, // when Gradle merges variant sources and configurations. Y'all must assign // each product flavor y'all configure to one of the flavor dimensions. flavorDimensions += listOf("api", "manner") productFlavors { create("demo") { // Assigns this product flavor to the "manner" 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 club in which they announced adjacent // to the flavorDimensions property above--the outset dimension has 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. To learn more well-nigh assigning version codes to // support app updates and uploading to Google Play, read Multiple APK Back up 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" ... } } } ...
Jumlah varian build yang dibuat Gradle setara dengan produk dari jumlah ragam di setiap dimensi ragam dan jumlah jenis build yang Anda konfigurasikan. Jika Gradle memberi nama setiap varian build atau artefak terkait, ragam produk yang dimiliki dimensi ragam berprioritas lebih tinggi akan muncul terlebih dahulu, diikuti ragam dari dimensi berprioritas lebih rendah, diikuti dengan jenis build. Dengan menggunakan konfigurasi build di atas sebagai contoh, Gradle akan membuat full 12 varian build dengan skema penamaan berikut:
- Varian build:
[minApi24, minApi23, minApi21][Demo, Full][Debug, Release]
- APK terkait:
app-[minApi24, minApi23, minApi21]-[demo, full]-[debug, release].apk
- Misalnya,
- Varian build:
minApi24DemoDebug
- APK terkait:
app-minApi24-demo-debug.apk
Selain direktori gear up sumber yang dapat Anda buat untuk setiap ragam produk individu dan varian build, Anda juga dapat membuat direktori set up sumber untuk setiap kombinasi ragam produk. Misalnya, Anda dapat membuat dan menambahkan sumber Java ke direktori src/demoMinApi24/coffee/
, dan Gradle hanya menggunakan sumber itu saat membuat varian yang menggabungkan kedua ragam produk tersebut. Set sumber yang Anda buat untuk kombinasi ragam produk memiliki prioritas lebih tinggi daripada prepare sumber yang termasuk dalam setiap ragam produk individu. Untuk mempelajari lebih lanjut set sumber dan cara Gradle menggabungkan resource, baca bagian cara membuat set up sumber.
Memfilter varian
Gradle membuat varian build untuk setiap kombinasi yang memungkinkan dari ragam produk dan jenis build yang Anda konfigurasikan. Akan tetapi, mungkin ada varian build tertentu yang tidak Anda perlukan atau tidak masuk akal dalam konteks project Anda. Anda dapat menghapus konfigurasi varian build tertentu dengan membuat filter varian di file build.gradle
level modul.
Dengan menggunakan konfigurasi build dari bagian sebelumnya sebagai contoh, anggaplah Anda hanya ingin mendukung API level 23 dan yang lebih baru untuk aplikasi versi demo. Anda dapat menggunakan blok variantFilter
untuk memfilter semua konfigurasi varian build yang menggabungkan ragam produk "minApi21" dan "demo":
Nifty
android { ... buildTypes {...} flavorDimensions "api", "mode" productFlavors { demo {...} total {...} minApi24 {...} minApi23 {...} minApi21 {...} } variantFilter { variant -> def names = variant.flavors*.proper name // To cheque for a sure build blazon, apply variant.buildType.name == "<buildType>" if (names.contains("minApi21") && names.contains("demo")) { // Gradle ignores whatever variants that satisfy the atmospheric condition above. setIgnore(true) } } } ...
Kotlin
android { ... buildTypes {...} flavorDimensions += listOf("api", "mode") productFlavors { create("demo") {...} create("total") {...} create("minApi24") {...} create("minApi23") {...} create("minApi21") {...} } } androidComponents { beforeVariants { variantBuilder -> // To check for a sure build type, use variantBuilder.buildType == "<buildType>" if (variantBuilder.productFlavors.containsAll(listOf("api" to "minApi21", "manner" to "demo"))) { // Gradle ignores whatsoever variants that satisfy the conditions in a higher place. variantBuilder.enabled = false } } } ...
Setelah Anda menambahkan filter varian ke konfigurasi build dan mengklik Sync Now di baris notifikasi, Gradle akan mengabaikan semua varian build yang memenuhi ketentuan yang Anda tetapkan, dan varian build tersebut tidak lagi terlihat di carte du jour drop-down saat Anda mengklik Build > Select Build Variant dari panel menu (atau Build Variants di kolom jendela alat).
Membuat set sumber
Secara default, Android Studio akan membuat prepare sumber primary/
dan direktori untuk segala sesuatu yang ingin Anda bagikan di antara semua varian build Anda. Namun, Anda dapat membuat set sumber baru untuk mengontrol secara persis file yang dikompilasi oleh Gradle serta paket untuk jenis build, ragam produk (dan kombinasi ragam produk saat menggunakan dimensi ragam), dan varian build tertentu. Misalnya, Anda dapat menetapkan fungsionalitas dasar dalam set sumber main/
dan menggunakan set sumber ragam produk untuk mengubah branding aplikasi Anda bagi klien berbeda, atau menyertakan izin khusus dan fungsionalitas logging hanya untuk varian build yang menggunakan jenis build debug.
Gradle memperkirakan Anda akan mengatur file dan direktori set sumber dengan cara tertentu, serupa dengan set sumber main/
. Misalnya, Gradle memperkirakan file grade Java yang khusus untuk jenis build "debug" ditempatkan dalam direktori src/debug/java/
.
Plugin Android untuk Gradle akan menyediakan tugas Gradle bermanfaat yang akan menunjukkan cara mengatur file Anda untuk setiap jenis build, ragam produk, dan varian build. Misalnya, contoh berikut dari output tugas menjelaskan tempat Gradle diperkirakan akan menemukan file tertentu untuk jenis build "debug".
------------------------------------------------------------ Projection :app ------------------------------------------------------------ ... debug ---- Compile configuration: compile build.gradle name: android.sourceSets.debug Java sources: [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]
Untuk melihat output ini, ikuti langkah berikut:
- Klik Gradle di sisi kanan jendela IDE.
- Buka MyApplication > Tasks > android lalu klik dua kali sourceSets. Untuk melihat folder Tasks, Anda harus mengizinkan Gradle untuk membuat daftar tugas selama sinkronisasi dengan mengklik File > Settings > Experimental dan menghapus centang Do non build Gradle task list during Gradle sync (Android Studio > Preferences > Experimental pada macOS). Setelah Gradle mengeksekusi tugas, jendela Run akan terbuka untuk menampilkan output-nya.
- Jika tampilan tidak dalam mode teks seperti yang ditunjukkan di atas, klik Toggle view di samping kiri jendela Run.
Catatan: Output tugas juga akan menunjukkan cara mengatur set sumber untuk file yang ingin Anda gunakan dalam menjalankan pengujian bagi aplikasi Anda, seperti set sumber pengujian test/
dan androidTest/
.
Jika Anda membuat varian build baru, Android Studio tidak akan membuat direktori set up sumber, melainkan memberikan beberapa opsi untuk membantu Anda. Misalnya, untuk hanya membuat direktori java/
untuk jenis build "debug":
- Buka panel Project, lalu pilih tampilan Projection dari bill of fare drop-down di bagian atas panel.
- Buka
MyProject/app/src/
- Klik kanan direktori
src
dan pilih New > Binder > Java Binder. - Dari menu drop-downwards di sebelah Target Source Set, pilih debug.
- Klik Terminate.
Android Studio membuat direktori set sumber untuk jenis build debug, kemudian membuat direktori coffee/
di dalamnya. Atau, Anda dapat menyetel Android Studio agar membuat direktori jika Anda menambahkan file baru untuk varian build tertentu ke project Anda. Misalnya, untuk membuat file XML nilai untuk jenis build "debug" Anda:
- Di panel Project yang sama, klik kanan direktori
src
dan pilih New > XML > Values XML File. - Masukkan nama untuk file XML atau tetap gunakan nama default.
- Dari menu driblet-down di sebelah Target Source Fix, pilih debug.
- Klik Finish.
Karena jenis build "debug" ditetapkan sebagai gear up sumber target, Android Studio akan otomatis membuat direktori yang diperlukan ketika membuat file XML. Struktur direktori yang dihasilkan akan terlihat seperti gambar 2.
Dengan menggunakan prosedur yang sama, Anda juga dapat membuat direktori ready sumber untuk ragam produk seperti src/demo/
, dan varian build seperti src/demoDebug/
. Anda juga dapat membuat prepare sumber pengujian yang menargetkan varian build tertentu, seperti src/androidTestDemoDebug/
. Untuk mempelajari lebih lanjut, baca set sumber pengujian.
Mengubah konfigurasi gear up sumber default
Jika Anda memiliki sumber yang tidak diatur ke struktur file set sumber default yang diperkirakan Gradle, seperti dijelaskan dalam bagian membuat set sumber di atas, Anda dapat menggunakan blok sourceSets
untuk mengubah lokasi pencarian Gradle guna mengumpulkan file untuk setiap komponen set sumber. Anda tidak perlu memindahkan lokasi file. Anda hanya perlu memberi Gradle jalur ke file tersebut, tergantung file build.gradle
tingkat modulnya, tempat Gradle seharusnya memperkirakan akan menemukan file untuk setiap komponen set up sumber. Untuk mempelajari komponen mana yang dapat Anda konfigurasi, dan apakah Anda dapat memetakannya ke beberapa file atau direktori, lihat Referensi API plugin Android Gradle.
Contoh kode berikut memetakan sumber dari direktori app/other/
ke komponen tertentu dari set sumber main
dan mengubah direktori utama set sumber androidTest
.
Not bad
android { ... sourceSets { // Encapsulates configurations for the main source fix. main { // Changes the directory for Coffee sources. The default directory is // 'src/chief/java'. coffee.srcDirs = ['other/java'] // If yous list multiple directories, Gradle uses all of them to collect // sources. Considering Gradle gives these directories equal priority, if // yous define the same resource in more i directory, you go an // mistake when merging resources. The default directory is 'src/main/res'. res.srcDirs = ['other/res1', 'other/res2'] // Note: Yous should avoid specifying a directory which is a parent to one // or more than other directories you specify. For instance, avoid the following: // res.srcDirs = ['other/res1', 'other/res1/layouts', 'other/res1/strings'] // You lot should specify either merely the root 'other/res1' directory, or only the // nested 'other/res1/layouts' and 'other/res1/strings' directories. // For each source set, y'all tin specify merely one Android manifest. // By default, Android Studio creates a manifest for your master source // ready 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 unmarried root // directory, you can specify that directory using the setRoot holding. // When gathering sources for the source set, Gradle looks only in locations // relative to the root directory yous specify. For instance, after applying the // configuration below for the androidTest source prepare, Gradle looks for Coffee // sources only in the src/tests/coffee/ directory. setRoot 'src/tests' ... } } } ...
Kotlin
android { ... // Encapsulates configurations for the principal source set. sourceSets.getByName("main") { // Changes the directory for Coffee sources. The default directory is // 'src/main/java'. java.setSrcDirs("other/java") // If yous 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, yous become an // fault when merging resource. The default directory is 'src/master/res'. res.setSrcDirs("other/res1", "other/res2") // Note: You should avert specifying a directory which is a parent to one // or more other directories you specify. For example, avert the post-obit: // res.srcDirs = ['other/res1', 'other/res1/layouts', 'other/res1/strings'] // Yous should specify either only the root 'other/res1' directory, or only the // nested 'other/res1/layouts' and 'other/res1/strings' directories. // For each source ready, y'all can specify only 1 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 boosted blocks to configure other source sets. sourceSets.getByName("androidTest") { // If all the files for a source set are located under a unmarried root // directory, you lot tin can specify that directory using the setRoot property. // When gathering sources for the source set, Gradle looks simply in locations // relative to the root directory you lot 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") ... } } ...
Mem-build dengan set sumber
Anda dapat menggunakan direktori set sumber untuk memuat kode dan resource yang ingin Anda paketkan hanya dengan konfigurasi tertentu. Misalnya, jika Anda membuat varian build "demoDebug" yang merupakan produk persilangan ragam produk "demo" dan jenis build "debug", Gradle akan melihat direktori ini dan memberinya prioritas berikut:
-
src/demoDebug/
(set up sumber varian build) -
src/debug/
(prepare sumber jenis build) -
src/demo/
(ready sumber ragam produk) -
src/main/
(gear up sumber utama)
Prepare sumber yang dibuat untuk kombinasi ragam produk harus menyertakan semua dimensi ragam. Misalnya, gear up sumber varian build harus berupa kombinasi (jenis build + semua dimensi ragam). Penggabungan kode dan resource yang melibatkan folder yang mencakup beberapa, tetapi tidak semua, dimensi ragam tidak didukung.
Catatan: Jika Anda menggabungkan beberapa ragam produk, prioritas antara ragam produk akan ditentukan oleh dimensi ragam yang mencakupnya. Saat mencantumkan dimensi ragam dengan properti android.flavorDimensions
, ragam produk yang termasuk dalam dimensi ragam pertama yang Anda cantumkan akan memiliki prioritas lebih tinggi daripada ragam produk yang termasuk dalam dimensi ragam kedua, dan seterusnya. Selain itu, set sumber yang Anda buat untuk kombinasi ragam produk memiliki prioritas lebih tinggi daripada set up sumber yang termasuk dalam setiap ragam produk individu.
Urutan yang tercantum di atas akan menentukan set sumber yang memiliki prioritas lebih tinggi jika Gradle menggabungkan kode dan resources. Karena direktori set up sumber demoDebug/
kemungkinan berisi file yang dikhususkan untuk varian build terkait, jika demoDebug/
memuat file yang juga ditentukan di debug/
, Gradle akan menggunakan file tersebut dalam set up sumber demoDebug/
. Demikian pula, Gradle akan memberi file dalam set sumber jenis build dan ragam produk prioritas yang lebih tinggi daripada file yang sama yang berada di main/
. Gradle mempertimbangkan urutan prioritas ini saat menerapkan aturan build berikut:
- Semua kode sumber dalam direktori
coffee/
dikompilasi bersama untuk menghasilkan satu output.Catatan: Untuk varian build tertentu, Gradle akan menampilkan error build jika menemukan dua atau lebih direktori set sumber yang telah menentukan course Java yang sama. Misalnya, jika mem-build aplikasi debug, Anda tidak dapat menetapkan sekaligus
src/debug/Utility.java
dansrc/main/Utility.java
. Hal ini karena Gradle melihat kedua direktori ini selama proses build dan menampilkan mistake "course duplikat". Jika menginginkan versi lainUtility.coffee
untuk jenis build berbeda, Anda dapat menetapkan agar setiap jenis build menentukan versi filenya sendiri dan tidak menyertakannya dalam set sumbermaster/
. - Beberapa manifes digabungkan menjadi satu manifes. Prioritas diberikan dengan urutan yang sama seperti dalam daftar di atas. Artinya, setelan manifes untuk jenis build akan menggantikan setelan manifes untuk ragam produk, dan seterusnya. Untuk mempelajari lebih lanjut, baca penggabungan manifes.
- Demikian juga, file dalam direktori
values/
digabungkan bersama-sama. Jika ada dua file memiliki nama yang sama, misalnya dua filestrings.xml
, prioritas akan diberikan dengan urutan yang sama seperti dalam daftar di atas. Artinya, nilai yang ditentukan dalam file di ready sumber jenis build akan menggantikan nilai yang ditentukan dalam file yang sama di ragam produk, dan seterusnya. - Resource di direktori
res/
danasset/
dipaketkan bersama-sama. Jika beberapa resource dengan nama yang sama ditetapkan dalam dua atau lebih set sumber, prioritas akan diberikan dengan urutan yang sama seperti dalam daftar di atas. - Terakhir, Gradle akan memberikan prioritas terendah ke resource dan manifes yang disertakan bersama dependensi modul library saat mem-build aplikasi.
Mendeklarasikan dependensi
Anda dapat mengonfigurasi dependensi untuk varian build atau set sumber pengujian tertentu dengan menambahkan awalan ke nama varian build atau set up sumber pengujian tersebut sebelum kata kunci Implementation
, seperti ditunjukkan dalam contoh berikut ini.
Groovy
dependencies { // Adds the local "mylibrary" module as a dependency to the "free" flavour. freeImplementation projection(":mylibrary") // Adds a remote binary dependency merely for local tests. testImplementation 'junit:junit:four.12' // Adds a remote binary dependency only for the instrumented examination APK. androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' }
Kotlin
dependencies { // Adds the local "mylibrary" module equally 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-cadre:three.0.2") }
Untuk mengetahui informasi selengkapnya, lihat Menambahkan dependensi build.
Menggunakan pengelolaan dependensi berdasarkan varian
Plugin Android three.0.0 dan yang lebih tinggi menyertakan mekanisme dependensi baru yang otomatis mencocokkan varian saat menggunakan library. Hal ini berarti varian debug
aplikasi akan otomatis menggunakan varian debug
library, dan seterusnya. Plugin ini juga berfungsi saat menggunakan ragam— varian freeDebug
aplikasi akan menggunakan varian freeDebug
library.
Agar plugin mencocokkan varian secara akurat, Anda perlu menyediakan fallback pencocokan untuk example jika pencocokan langsung tidak memungkinkan. Pertimbangkan jika aplikasi Anda mengonfigurasi jenis build yang disebut "staging", tetapi salah satu dependensi library-nya tidak. Saat mencoba mem-build versi "staging" aplikasi Anda, plugin tidak akan mengetahui versi library mana yang digunakan, dan Anda akan melihat pesan error yang mirip dengan berikut ini:
Error:Failed to resolve: Could not resolve project :mylibrary. Required past: project :app
Mengatasi error build yang berkaitan dengan pencocokan varian
Plugin menyertakan elemen DSL untuk membantu Anda mengontrol cara Gradle harus mengatasi situasi ketika pencocokan varian langsung antara aplikasi dan dependensi tidak mungkin dilakukan. Lihat tabel di bawah ini untuk menentukan properti DSL mana yang harus Anda gunakan untuk mengatasi error build tertentu yang terkait dengan pencocokan dependensi berdasarkan varian.
Penyebab error build | Penyelesaian |
---|---|
Misalnya, aplikasi Anda menyertakan jenis build "staging", tetapi dependensi hanya menyertakan jenis build "debug" dan "release". Perlu diperhatikan bahwa tidak akan ada masalah jika dependensi library menyertakan jenis build yang tidak disertakan oleh aplikasi Anda. Hal ini dikarenakan plugin tidak pernah meminta jenis build tersebut dari dependensi. | Gunakan Keen// In the app'south build.gradle file. android { buildTypes { debug {} release {} staging { // Specifies a sorted list of fallback build types that the // plugin should try to use when a dependency does not include a // "staging" build type. Yous may specify equally many fallbacks as you // like, and the plugin selects the first build type that's // bachelor in the dependency. matchingFallbacks = ['debug', 'qa', 'release'] } } } Kotlin// In the app's build.gradle file. android { buildTypes { getByName("debug") {} getByName("release") {} create("staging") { // Specifies a sorted listing of fallback build types that the // plugin should effort to use when a dependency does not include a // "staging" build type. You may specify as many fallbacks every bit you // similar, and the plugin selects the offset build type that's // available in the dependency. matchingFallbacks += listOf("debug", "qa", "release") } } } |
Untuk dimensi ragam tertentu yang ada dalam aplikasi dan dependensi library-nya, aplikasi Anda menyertakan ragam yang tidak disertakan oleh library. Misalnya, aplikasi Anda dan dependensi library-nya menyertakan dimensi ragam "tier". Namun, dimensi "tier" dalam aplikasi menyertakan ragam "gratuitous" dan "paid", sementara dependensi hanya menyertakan ragam "demo" dan "paid" untuk dimensi yang sama. Perlu diperhatikan bahwa untuk dimensi ragam tertentu yang ada dalam aplikasi dan dependensi library-nya, tidak akan ada masalah jika library menyertakan ragam produk yang tidak disertakan aplikasi Anda. Hal ini dikarenakan plugin tidak pernah meminta ragam tersebut dari dependensi. | Gunakan Neat// In the app'south build.gradle file. android { defaultConfig{ // Do not configure matchingFallbacks in the defaultConfig cake. // Instead, you lot must 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 demand to provide a list of fallbacks // for the "paid" flavour. } free { dimension 'tier' // Specifies a sorted listing of fallback flavors that the plugin // should endeavour to use when a dependency'due south matching dimension does // non include a "gratuitous" flavor. You may specify as many // fallbacks every bit you like, and the plugin selects the starting time flavor // that's available in the dependency's "tier" dimension. matchingFallbacks = ['demo', 'trial'] } } } Kotlin// In the app'due south build.gradle file. android { defaultConfig{ // Practise not configure matchingFallbacks in the defaultConfig block. // Instead, you lot must specify fallbacks for a given production flavor in the // productFlavors block, as shown beneath. } flavorDimensions += "tier" productFlavors { create("paid") { dimension = "tier" // Because the dependency already includes a "paid" flavor in its // "tier" dimension, you don't demand to provide a list of fallbacks // for the "paid" season. } create("free") { dimension = "tier" // Specifies a sorted listing of fallback flavors that the plugin // should endeavour to use when a dependency's matching dimension does // not include a "costless" flavor. Yous may specify as many // fallbacks equally you similar, and the plugin selects the first flavor // that'due south available in the dependency'south "tier" dimension. matchingFallbacks += listOf("demo", "trial") } } } |
Dependensi library menyertakan dimensi ragam yang tidak disertakan oleh aplikasi Anda. Misalnya, dependensi library menyertakan ragam untuk dimensi "minApi", sementara aplikasi Anda hanya menyertakan ragam untuk dimensi "tier". Jadi, saat Anda ingin mem-build versi "freeDebug" untuk aplikasi, plugin tidak tahu apakah akan menggunakan versi dependensi "minApi23Debug" atau "minApi18Debug". Perlu diperhatikan bahwa tidak akan ada masalah jika aplikasi Anda menyertakan dimensi ragam yang tidak disertakan oleh dependensi library. Hal ini dikarenakan plugin tersebut hanya mencocokkan ragam dari dimensi yang ada dalam dependensi. Misalnya, jika dependensi tidak menyertakan dimensi untuk ABI, versi "freeX86Debug" aplikasi Anda akan menggunakan versi "freeDebug" dependensi. | Gunakan Cracking// In the app's build.gradle file. android { defaultConfig{ // Specifies a sorted listing of flavors that the plugin should try to utilize from // a given dimension. The following tells the plugin that, when encountering // a dependency that includes a "minApi" dimension, it should select the // "minApi18" flavour. You can include boosted flavor names to provide a // sorted list of fallbacks for the dimension. missingDimensionStrategy 'minApi', 'minApi18', 'minApi23' // Y'all should specify a missingDimensionStrategy property for each // dimension that exists in a local dependency but non in your app. missingDimensionStrategy 'abi', 'x86', 'arm64' } flavorDimensions 'tier' productFlavors { free { dimension 'tier' // You can override the default selection at the product flavour // level past configuring another missingDimensionStrategy property // for the 'minApi' dimension. missingDimensionStrategy 'minApi', 'minApi23', 'minApi18' } paid {} } } Kotlin// In the app's build.gradle file. android { defaultConfig{ // Specifies a sorted list of flavors that the plugin should try to apply from // a given dimension. The following tells the plugin that, when encountering // a dependency that includes a "minApi" dimension, information technology should select the // "minApi18" season. You lot tin include additional flavor names to provide a // sorted list of fallbacks for the dimension. missingDimensionStrategy("minApi", "minApi18", "minApi23") // Yous should specify a missingDimensionStrategy belongings 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 lot can override the default selection at the product flavor // level past configuring another missingDimensionStrategy holding // for the "minApi" dimension. missingDimensionStrategy("minApi", "minApi23", "minApi18") } create("paid") {} } } |
Untuk informasi selengkapnya, lihat matchingFallbacks dan missingDimensionStrategy di referensi DSL Plugin Android.
Mengonfigurasi setelan penandatanganan
Gradle tidak menandatangani APK atau AAB build rilis kecuali jika Anda secara eksplisit menentukan konfigurasi penandatanganan untuk build ini. Jika belum memiliki kunci penandatanganan, lihat cara membuat keystore dan kunci upload menggunakan Android Studio.
Untuk mengubah konfigurasi penandatanganan jenis build rilis Anda secara manual menggunakan konfigurasi build Gradle:
- Buat keystore. Keystore adalah file biner yang berisi seperangkat kunci pribadi. Anda harus menyimpan keystore di tempat yang aman dan terlindung.
- Buat kunci pribadi. Kunci pribadi digunakan untuk menandatangani aplikasi Anda untuk distribusi dan tidak pernah disertakan dalam aplikasi atau diungkapkan kepada pihak ketiga yang tidak sah.
-
Tambahkan konfigurasi penandatanganan ke file
build.gradle
level modul:Not bad
... android { ... defaultConfig {...} signingConfigs { release { storeFile file("myreleasekey.keystore") storePassword "password" keyAlias "MyReleaseKey" keyPassword "password" } } buildTypes { release { ... signingConfig signingConfigs.release } } }
Kotlin
... android { ... defaultConfig {...} signingConfigs { create("release") { storeFile = file("myreleasekey.keystore") storePassword = "password" keyAlias = "MyReleaseKey" keyPassword = "password" } } buildTypes { getByName("release") { ... signingConfig = signingConfigs.getByName("release") } } }
Catatan: Menyertakan sandi untuk kunci rilis dan keystore di dalam file build bukanlah praktik keamanan yang baik. Sebagai alternatif, Anda dapat mengonfigurasi file build untuk memperoleh sandi ini dari variabel lingkungan atau menyetel agar proses build meminta sandi ini.
Untuk memperoleh sandi ini dari variabel lingkungan:
Smashing
storePassword System.getenv("KSTOREPWD") keyPassword System.getenv("KEYPWD")
Kotlin
storePassword = Arrangement.getenv("KSTOREPWD") keyPassword = System.getenv("KEYPWD")
Agar proses build meminta kata sandi ini jika Anda memanggil build dari control line:
Slap-up
storePassword System.console().readLine("\nKeystore countersign: ") keyPassword Organization.console().readLine("\nKey password: ")
Kotlin
storePassword = Arrangement.console().readLine("\nKeystore password: ") keyPassword = System.console().readLine("\nKey countersign: ")
Setelah menyelesaikan proses ini, Anda dapat mendistribusikan aplikasi dan memublikasikannya di Google Play.
Peringatan: Simpan keystore dan kunci pribadi Anda di tempat yang aman dan terlindungi, serta pastikan Anda memiliki cadangannya yang aman. Jika menggunakan Penandatanganan Aplikasi Play dan kehilangan kunci upload, Anda dapat meminta reset menggunakan Konsol Play. Jika memublikasikan aplikasi tanpa Penandatanganan Aplikasi Play (untuk aplikasi yang dibuat sebelum Agustus 2021) dan kunci penandatanganan aplikasi hilang, Anda tidak akan dapat memublikasikan update apa pun ke aplikasi, karena Anda harus selalu menandatangani semua versi aplikasi dengan kunci yang sama.
Menandatangani aplikasi Wear OS
Saat memublikasikan aplikasi Habiliment Bone, APK smartwatch dan APK ponsel opsional perlu ditandatangani. Untuk mengetahui informasi selengkapnya tentang memaketkan dan menandatangani aplikasi Wearable Bone, lihat Memaketkan dan mendistribusikan aplikasi Wear.
Source: https://developer.android.google.cn/studio/build/build-variants?hl=id
0 Response to "Membuat File Dan Upload File Secara Otomatis Ke Database Android Studio"
Post a Comment