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
signingConfig
propriedade pode ser definida nos tipos de construção e nos sabores do produto ... masminifyEnabled
(e, presumoshrinkResources
,?) Só pode ser configurada nos tipos de construção.applicationId
só pode ser especificado nos tipos de produto ... eapplicationIdSuffix
só 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?
fonte
applicationId
, por exemplo.Respostas:
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.
fonte
applicationId
problema 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).buildType configure como empacotamos nosso aplicativo
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
fonte
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.fonte
O
build types
são usados para indicardebug/release
o modo com diferentes certificados e permitindoProguard
oudebuggable
bandeira.Eles
flavors
costumam ter recursos personalizados (por exemplo, versão gratuita ou paga),minimum and target API
níveis, requisitos de dispositivo e API como olayout
,drawable
para que você possa ter diferentes códigos e recursosflavors
.fonte