Pendahuluan: ini bukan pertanyaan tentang cara menggunakan jenis dan rasa produk dalam aplikasi Android. Saya mengerti konsep dasar yang terlibat. Pertanyaan ini lebih lanjut tentang mencoba memahami konfigurasi mana yang harus ditentukan dalam tipe build, konfigurasi mana yang harus ditentukan dalam rasa produk, dan apakah perbedaan sebenarnya diperlukan.
Minggu ini, saya telah belajar lebih banyak tentang konfigurasi gradle untuk aplikasi Android. Awalnya saya pikir saya memiliki pegangan yang baik pada tipe build vs rasa produk, tetapi semakin dalam saya masuk ke dokumentasi semakin saya menyadari perbedaan antara keduanya tidak jelas bagi saya sama sekali.
Karena ada hierarki yang terdefinisi dengan baik (dalam arti bahwa properti yang ditentukan dalam tipe build lebih diutamakan daripada yang ditentukan dalam rasa produk), saya tidak mengerti mengapa ada kebutuhan untuk membedakan antara tipe build dan rasa produk sama sekali. Bukankah lebih baik menggabungkan semua properti dan metode menjadi objek DSL rasa produk, dan kemudian hanya memperlakukan jenis pembuatan sebagai dimensi rasa (default)?
Beberapa contoh nyata yang menyebabkan kebingungan saya:
The
signingConfig
properti dapat diatur dalam kedua jenis membangun dan rasa produk ... tapiminifyEnabled
(dan, saya berasumsi,shrinkResources
?) Hanya dapat dikonfigurasi dalam jenis membangun.applicationId
hanya bisa ditentukan dalam rasa produk ... danapplicationIdSuffix
hanya bisa ditentukan dalam tipe bangunan !?
Pertanyaan aktual :
Dengan contoh-contoh di atas: apakah ada perbedaan yang jelas antara peran tipe bangun vs cita rasa produk?
Jika demikian, apa cara terbaik untuk memahaminya?
Jika tidak, apakah rencana untuk akhirnya menggabungkan tipe dan citarasa produk ke dalam satu objek DSL yang dapat dikonfigurasi?
sumber
applicationId
, misalnya.Jawaban:
Memperluas apa yang @CommonsWare katakan dalam komentar, ide dasarnya adalah bahwa tipe build untuk build berbeda dari aplikasi Anda yang tidak berbeda secara fungsional - jika Anda memiliki versi debug dan rilis aplikasi Anda, mereka adalah aplikasi yang sama , tetapi yang satu berisi kode debugging, mungkin lebih banyak logging, dll., dan yang lainnya efisien dan dioptimalkan dan mungkin dikaburkan melalui ProGuard. Dengan rasa, maksudnya adalah bahwa aplikasi ini berbeda dalam beberapa hal. Contoh paling jelas adalah versi gratis vs versi berbayar dari aplikasi Anda, tetapi pengembang juga dapat membedakan berdasarkan di mana itu didistribusikan (yang dapat mempengaruhi penggunaan API penagihan dalam aplikasi).
Ada pengembang yang membuat banyak, banyak versi berbeda dari aplikasi yang sama untuk pelanggan yang berbeda - contohnya mungkin aplikasi sederhana yang membuka halaman web dalam tampilan web, dengan URL dan merek yang berbeda untuk setiap versi - ini adalah penggunaan rasa yang baik.
Untuk menegaskan kembali, jika itu "aplikasi yang sama", modulo beberapa perbedaan yang tidak penting bagi pengguna akhir, dan terutama jika semua varian kecuali satu untuk pengujian Anda sendiri dan penggunaan pengembangan dan hanya satu varian yang akan digunakan untuk pengguna akhir, maka itu adalah kandidat yang bagus untuk tipe build. Jika itu "berbeda" aplikasi dan beberapa varian akan digunakan untuk pengguna, maka mungkin itu adalah kandidat untuk rasa produk.
Anda telah melihat bahwa ada beberapa perbedaan fungsionalitas antara tipe dan rasa, karena beberapa opsi didukung untuk satu tetapi tidak yang lain. Tetapi konsepnya berbeda walaupun sama, dan tidak ada rencana untuk menggabungkannya.
sumber
applicationId
masalah ini sebagai berikut: karena rasa mewakili versi "sepenuhnya berbeda" dari aplikasi Anda, masuk akal untuk dapat menentukan "sepenuhnya" id aplikasi yang berbeda; sedangkan, untuk rasa yang tetap, beberapa tipe build semuanya mewakili aplikasi "sama" dan oleh karena itu hanya diizinkan untuk mengubah akhiran id aplikasi (dengan demikian mempertahankan 'pengelompokan' id aplikasi).buildType mengonfigurasi bagaimana kami mengemas aplikasi kami
Flavour mengkonfigurasi berbagai kelas dan sumber daya.
di Flavour1, MainActivity Anda dapat melakukan sesuatu, dan dalam Flavour2 implementasinya berbeda
nama Aplikasi yang berbeda
dll.
Setiap rasa produk dapat memiliki nilai sendiri dari sifat-sifat berikut, antara lain, yang didasarkan pada sifat yang sama dari
defaultConfig
:applicationId
minSdkVersion
targetSdkVersion
versionCode
versionName
sumber
Inilah cara saya menyaring perbedaan menjadi esensi:
buildType
adalah bagaimana membangunnya.flavor
adalah apa yang membangun.sumber
The
build types
digunakan untuk menunjukkandebug/release
modus dengan sertifikat yang berbeda dan memungkinkanProguard
ataudebuggable
bendera.The
flavors
digunakan untuk memiliki fitur kustom (misalnya gratis atau versi berbayar),minimum and target API
tingkat, perangkat dan API persyaratan sepertilayout
,drawable
sehingga Anda dapat memiliki kode yang berbeda dan sumber daya di berbagaiflavors
.sumber