Mengapa tipe bangunan berbeda dari rasa produk?

173

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 signingConfigproperti dapat diatur dalam kedua jenis membangun dan rasa produk ... tapi minifyEnabled(dan, saya berasumsi, shrinkResources?) Hanya dapat dikonfigurasi dalam jenis membangun.

  • applicationIdhanya bisa ditentukan dalam rasa produk ... dan applicationIdSuffixhanya 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?

stkent
sumber
55
"konfigurasi mana yang harus ditentukan dalam tipe build, konfigurasi mana yang harus ditentukan dalam rasa produk" - tipe build memodelkan siklus hidup pengembangan Anda (debug, "dogfood", release, dll.). Citarasa produk memodelkan strategi distribusi Anda (Google IAP vs Amazon IAP vs BlackBerry IAP, dll.). Ini adalah konsep independen. Mengenai sisanya, saya akan membayangkan bahwa ada alasan teknis terkait dengan implementasi yang sedikit menentukan bagaimana mereka mengatur DSL, dan karenanya saya akan terkejut jika ada rencana untuk merger.
CommonsWare
1
@CommonsWare yang sangat masuk akal di level tinggi. Dan ya, mungkin pemrosesan berurutan dari jenis / rasa membatasi bagaimana dan kapan seseorang dapat mengubah keseluruhan applicationId, misalnya.
stkent

Jawaban:

168

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.

Scott Barta
sumber
17
Terima kasih, Scott. Saya pasti berpikir perbedaan ini masuk akal (dan nama 'tipe bangun' dan 'rasa produk' sesuai untuk penggunaan ini). Mungkin orang dapat memahami applicationIdmasalah 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).
stkent
28

buildType mengonfigurasi bagaimana kami mengemas aplikasi kami

  • Sumber menyusut
  • progaurdFile
  • dll.

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
itzhar
sumber
9

Inilah cara saya menyaring perbedaan menjadi esensi:

  • buildTypeadalah bagaimana membangunnya.
  • flavoradalah apa yang membangun.
Julian A.
sumber
0

The build typesdigunakan untuk menunjukkan debug/releasemodus dengan sertifikat yang berbeda dan memungkinkan Proguardatau debuggablebendera.

The flavorsdigunakan untuk memiliki fitur kustom (misalnya gratis atau versi berbayar), minimum and target APItingkat, perangkat dan API persyaratan seperti layout, drawablesehingga Anda dapat memiliki kode yang berbeda dan sumber daya di berbagai flavors.

Ehsan Mashhadi
sumber