Por que os tipos de construção são diferentes dos tipos de produtos?

173

Prefácio: esta não é uma pergunta sobre como usar tipos de construção e sabores de produtos em um aplicativo Android. Eu entendo os conceitos básicos envolvidos. Esta pergunta é mais sobre como tentar entender qual configuração deve ser especificada em um tipo de construção, qual configuração deve ser especificada em um tipo de produto e se alguma distinção é realmente necessária.

Nesta semana, aprendi mais sobre a configuração do gradle para aplicativos Android. Inicialmente, pensei que tinha uma boa capacidade de lidar com tipos de compilação versus tipos de produtos, mas quanto mais aprofundava a documentação, mais percebia que a distinção entre os dois não estava clara para mim.

Como existe uma hierarquia bem definida (no sentido de que as propriedades especificadas nos tipos de construção têm precedência sobre as especificadas nos tipos de produto), não entendo por que é necessário distinguir entre tipos de construção e tipos de produto. Não seria melhor mesclar todas as propriedades e métodos no objeto DSL de sabor do produto e apenas tratar o tipo de construção como uma dimensão de sabor (padrão)?

Alguns exemplos concretos que levaram à minha confusão:

  • A signingConfigpropriedade pode ser definida nos tipos de construção e nos sabores do produto ... mas minifyEnabled(e, presumo shrinkResources,?) Só pode ser configurada nos tipos de construção.

  • applicationIdsó pode ser especificado nos tipos de produto ... e applicationIdSuffixsó pode ser especificado nos tipos de construção !?

A (s) questão (s) real (is) :

Dados os exemplos acima: existe uma distinção clara entre os papéis dos tipos de construção versus os sabores dos produtos?

Em caso afirmativo, qual é a melhor maneira de entendê-lo?

Caso contrário, o plano é eventualmente mesclar tipos de construção e sabores de produtos em um único objeto DSL configurável?

stkent
fonte
55
"qual configuração deve ser especificada em um tipo de construção, qual configuração deve ser especificada em um tipo de produto" - os tipos de construção modelam seu ciclo de vida de desenvolvimento (depuração, "dogfood", release etc.). Os sabores dos produtos modelam sua estratégia de distribuição (Google IAP x Amazon IAP x BlackBerry IAP etc.). Estes são conceitos independentes. Quanto ao resto, eu imagino que haja razões técnicas ligadas à implementação que ditem um pouco como eles configuram o DSL e, portanto, ficaria surpreso se houver um plano para uma fusão.
CommonsWare
1
@CommonsWare que faz muito sentido em um nível alto. E sim, talvez o processamento seqüencial dos tipos / sabores restrinja como e quando é possível alterar o todo applicationId, por exemplo.
stkent

Respostas:

168

Expandindo o que o @CommonsWare disse nos comentários, a idéia básica é que os tipos de compilação são para compilações diferentes do seu aplicativo que não são funcionalmente diferentes - se você tem uma versão de depuração e lançamento do aplicativo, é o mesmo aplicativo , mas um contém código de depuração, talvez mais registros etc., e o outro é otimizado e otimizado e possivelmente ofuscado pelo ProGuard. Com os sabores, a intenção é que o aplicativo seja notavelmente diferente de alguma forma. O exemplo mais claro seria uma versão gratuita versus uma versão paga do seu aplicativo, mas os desenvolvedores também podem se diferenciar com base em onde ele está sendo distribuído (o que pode afetar o uso da API de cobrança no aplicativo).

Existem desenvolvedores que criam muitas versões diferentes de um aplicativo semelhante para clientes diferentes - um exemplo pode ser um aplicativo simples que abre uma página da Web em uma exibição da Web, com URLs e marcas diferentes para cada versão - esta é uma bom uso de sabores.

Para reiterar, se for "o mesmo aplicativo", module algumas diferenças que não são importantes para o usuário final e, especialmente, se todas as variantes, exceto uma, forem para seu próprio uso de teste e desenvolvimento e apenas uma variante será implantada no usuários finais, é um bom candidato para os tipos de compilação. Se for um aplicativo "diferente" e várias variantes forem implantadas para os usuários, talvez seja uma candidata a um sabor de produto.

Você já viu que existem algumas diferenças de funcionalidade entre tipos e tipos de build, já que algumas opções são suportadas para um, mas não para o outro. Mas os conceitos são diferentes, mesmo sendo parecidos, e não há nenhum plano para mesclá-los.

Scott Barta
fonte
17
Obrigado, Scott. Definitivamente, acho que essa distinção faz sentido (e os nomes 'tipo de compilação' e 'sabor do produto' são apropriados para esse uso). Talvez alguém possa entender o applicationIdproblema da seguinte maneira: como os sabores representam versões "completamente diferentes" do seu aplicativo, faz sentido poder especificar "completamente" diferentes IDs do aplicativo; enquanto que, para um sabor fixo, os vários tipos de compilação representam o aplicativo "mesmo" e, portanto, só podem alterar o sufixo do ID do aplicativo (mantendo assim o "agrupamento" dos IDs do aplicativo).
stkent
28

buildType configure como empacotamos nosso aplicativo

  • shrinkResources
  • progaurdFile
  • etc.

Sabor configurar diferentes classes e recursos.

  • no Flavor1, sua MainActivity pode fazer alguma coisa, e no Flavor2, uma implementação diferente

  • Nome do aplicativo

  • etc.

Cada sabor do produto pode ter seus próprios valores das seguintes propriedades, entre outras, baseadas nas mesmas propriedades de defaultConfig:

  • applicationId
  • minSdkVersion
  • targetSdkVersion
  • versionCode
  • versionName
itzhar
fonte
9

Aqui está como eu destilar a diferença até a sua essência:

  • buildTypeé o como da construção.
  • flavoré o que da construção.
Julian A.
fonte
0

O build typessão usados para indicar debug/releaseo modo com diferentes certificados e permitindo Proguardou debuggablebandeira.

Eles flavorscostumam ter recursos personalizados (por exemplo, versão gratuita ou paga), minimum and target APIníveis, requisitos de dispositivo e API como o layout, drawablepara que você possa ter diferentes códigos e recursos flavors.

Ehsan Mashhadi
fonte