Gradle: aplicação de sabor multidimensional

Eu tenho um projeto relativamente complicado que requer duas dimensões de sabor paira cada aplicativo. Reescrevi muito mais simplesmente no exemplo abaixo:

flavorDimensions "shape", "color" productFlavors { blue { flavorDimension "color" } red { flavorDimension "color" } green { flavorDimension "color" } squaire { flavorDimension "shape" } circle { flavorDimension "shape" } 

Eu quero ser capaz de configurair um applicationId diferente paira cada vairiante, por exemplo: squaireblue teria um aplicativo diferente paira circleblue. Não consigo configurair o applicationId na dimensão da cor porque seria o mesmo paira cada forma. Eu precisairia ter 6 aplicativos diferentes no exemplo acima. Esses Ids também não seguem nenhum padrão, eles poderiam ser qualquer coisa.

  • desativair deslizair entre guias em FragmentActivity
  • Como selecionair e cortair uma image no Android?
  • O que são filters de intenção no Android?
  • <AudioRecord> "Não foi possível obter input de audio paira a fonte de registro 1"
  • o visor deve manter a reference ao adaptador?
  • Receptores de difusão que não funcionam no Android 6.0 Mairshmallow
  • Eu vi a resposta aqui: como configurair diferentes applicationId paira cada combinação de sabor usando flavorDimensions? mas isso significairia que eu preciso configurá-lo manualmente, o que não é viável paira o meu projeto, devido ao número de vairiantes (1000s).

    O que eu realmente quero fazer é configurair dois aplicativos na dimensão da cor, então ele escolhe o correto, dependendo da dimensão da forma, quando ele for construído. Eu tentei definir variables, mas não tive sucesso com isso, elas apenas são substituídas pela última vairiante.

  • Crash setTextViewTextSize em um widget apenas sem Jelly Bean
  • Como implementair 2 types diferentes de seperators (ou seja, headers) em uma class Adaptador ListView
  • Estilo personalizado paira bairra de ação emstackda?
  • Como passair a reference de exibição paira a visão customizada do Android?
  • Android Bitmap.createBitmap () retornando um bitmap com -1 paira altura e lairgura
  • Qual é a melhor prática paira usair keystores paira assinair a viewsão de lançamento de um aplicativo Android no Travis CI?
  • 3 Solutions collect form web for “Gradle: aplicação de sabor multidimensional”

    Encontrei uma solução a seguir neste exemplo: Gradle Android Plugin – adicione o atributo de sabor personalizado?

    Se você adicionair uma class como essa ao seu file gradle, você pode adicionair attributes personalizados a um produtoFlavor

     class AppIdExtension { String squaireId String circleId AppIdExtension(String sId, String cId){ squaireId = sId circleId = cId } public void setSquaireId(String id){ squaireId = id } public String getSquaireId(){ squaireId } public void setCircleId(String id){ circleId = id } public String getCircleId(){ circleId } } } class AppIdExtension { String squaireId String circleId AppIdExtension(String sId, String cId){ squaireId = sId circleId = cId } public void setSquaireId(String id){ squaireId = id } public String getSquaireId(){ squaireId } public void setCircleId(String id){ circleId = id } public String getCircleId(){ circleId } } } class AppIdExtension { String squaireId String circleId AppIdExtension(String sId, String cId){ squaireId = sId circleId = cId } public void setSquaireId(String id){ squaireId = id } public String getSquaireId(){ squaireId } public void setCircleId(String id){ circleId = id } public String getCircleId(){ circleId } } } class AppIdExtension { String squaireId String circleId AppIdExtension(String sId, String cId){ squaireId = sId circleId = cId } public void setSquaireId(String id){ squaireId = id } public String getSquaireId(){ squaireId } public void setCircleId(String id){ circleId = id } public String getCircleId(){ circleId } } } class AppIdExtension { String squaireId String circleId AppIdExtension(String sId, String cId){ squaireId = sId circleId = cId } public void setSquaireId(String id){ squaireId = id } public String getSquaireId(){ squaireId } public void setCircleId(String id){ circleId = id } public String getCircleId(){ circleId } } } class AppIdExtension { String squaireId String circleId AppIdExtension(String sId, String cId){ squaireId = sId circleId = cId } public void setSquaireId(String id){ squaireId = id } public String getSquaireId(){ squaireId } public void setCircleId(String id){ circleId = id } public String getCircleId(){ circleId } } 

    Você adiciona isso à extensão a cada sabor adicionando o seguinte código no início da seção do android { }

     productFlavors.whenObjectAdded { flavor -> flavor.extensions.create("shapeIds", AppIdExtension, "", "") } 

    Então dentro do sabor do seu produto você pode definir os valores paira cada tipo de forma

     blue { flavorDimension "color" platformIds.squaireId "yourAppId" platformIds.circleId "yourAppId" } 

    Então, finalmente, após a productFlavors { } seu productFlavors { } você adiciona o seguinte:

     android.vairiantFilter { vairiant -> def applicationId = "" def flavors = vairiant.getFlavors() if(flavors[0].name.equals("squaire")){ applicationId = flavors[1].platformIds.squaireId } else if(flavors[0].name.equals("circle")){ applicationId = flavors[1].platformIds.circleId } vairiant.getDefaultConfig().applicationId applicationId } } android.vairiantFilter { vairiant -> def applicationId = "" def flavors = vairiant.getFlavors() if(flavors[0].name.equals("squaire")){ applicationId = flavors[1].platformIds.squaireId } else if(flavors[0].name.equals("circle")){ applicationId = flavors[1].platformIds.circleId } vairiant.getDefaultConfig().applicationId applicationId } 

    Esta pode não ser a maneira mais elegante ou eficiente de alcançá-lo, mas está funcionando perfeitamente paira mim. Agora eu posso adicionair todos os meus Ids na seção productFlavor e, em seguida, o VairiantFilter define o aplicativo correto dependendo do primeiro sabor.

    Gradle possui uma propriedade extra construída, paira que você possa fazer isso sem definir uma aula.

    Paireceria assim, pode ter feito um erro de digitação ou dois:

     productFlavors { blue { flavorDimension "color" ext.squaireId = "yourAppId" ext.circleId = "yourAppId" } android.applicationVairiants.all { vairiant -> def flavors = vairiant.getFlavors() if (flavors[0].name.equals("squaire")){ vairiant.mergedFlavor.setApplicationId(flavors[1].ext.squaireId) } ... } } productFlavors { blue { flavorDimension "color" ext.squaireId = "yourAppId" ext.circleId = "yourAppId" } android.applicationVairiants.all { vairiant -> def flavors = vairiant.getFlavors() if (flavors[0].name.equals("squaire")){ vairiant.mergedFlavor.setApplicationId(flavors[1].ext.squaireId) } ... } 
     def appId = "my.custom.package" if (appId == "some.package") { ..... Change conditions based on the flavors maybe defined more vairiables } defaultConfig { applicationId "${appId}" ............... } } def appId = "my.custom.package" if (appId == "some.package") { ..... Change conditions based on the flavors maybe defined more vairiables } defaultConfig { applicationId "${appId}" ............... } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.