Gradle: Application d'arômes multidimensionnelle

J'ai un projet relativement complexe qui nécessite deux dimensions de saveur pour chaque application. Je l'ai réécrit beaucoup plus simplement dans l'exemple ci-dessous:

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

Je veux pouvoir configurer un autre applicationId pour chaque variante, par exemple: squareblue aurait un applicationId différent pour circleblue. Je ne peux pas définir l'applicationId dans la dimension de couleur car il serait identique pour chaque forme. Je devrais avoir 6 applications différentes dans l'exemple ci-dessus. Ces Ids ne suivent pas non plus de modèle, ils pourraient être n'importe quoi.

  • Android: thread d'interruption contenu dans une méthode
  • Android - Est-il possible de créer une bibliothèque personnalisée à utiliser dans plusieurs applications?
  • Disclaim Snackbar On left swipe
  • Android VideoView MediaPlayer OnInfoListener - événements non déclenchés
  • Android Studio 0.8.2 - La synchronisation du projet Gradle a échoué
  • ProgressDialog ne veut pas mettre à jour le message
  • J'ai vu la réponse ici: Comment configurer différents applicationId pour chaque combinaison de saveurs en utilisant flavorDimensions? Mais cela signifie que je dois le configurer manuellement, ce qui n'est pas possible pour mon projet, en raison du nombre de variantes (1000s).

    Ce que je veux vraiment faire est de définir deux applications sur la dimension de la couleur, puis elle choisit celle-ci, en fonction de la dimension de la forme, lorsqu'il est construit. J'ai essayé de définir des variables, mais je n'ai pas eu de succès avec ça, elles sont simplement écrasées par la dernière variante.

  • Getmeasuredheight () et getmeasuredwidth () renvoie 0 après View.measure ()
  • Quelle est la taille des icônes du tiroir de navigation?
  • Android AdRequest retourne uniquement surAdFailedToLoad AdRequest.ERROR_CODE_NO_FILL
  • OnItemLongClickListener ne fonctionne pas dans une liste de liste personnalisée
  • Fermeture ByteArrayOutputStream dans une application Android
  • Android: barre d'état pas le thème sur transitiong vers une nouvelle activité
  • 3 Solutions collect form web for “Gradle: Application d'arômes multidimensionnelle”

    J'ai trouvé une solution à partir de cet exemple ici: Gradle Android Plugin – Ajoutez un attribut de saveur personnalisé?

    Si vous ajoutez une classe comme celle-ci à votre fichier gradle, vous pouvez ajouter des attributs personnalisés à un produitFlavor

     class AppIdExtension { String squareId String circleId AppIdExtension(String sId, String cId){ squareId = sId circleId = cId } public void setSquareId(String id){ squareId = id } public String getSquareId(){ squareId } public void setCircleId(String id){ circleId = id } public String getCircleId(){ circleId } } 

    Vous ajoutez ensuite cette extension à chaque saveur en ajoutant le code suivant au début de votre section android { }

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

    Ensuite, dans la saveur de votre produit, vous pouvez définir les valeurs pour chaque type de forme

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

    Ensuite, après votre section productFlavors { } vous ajoutez ce qui suit:

     android.variantFilter { variant -> def applicationId = "" def flavors = variant.getFlavors() if(flavors[0].name.equals("square")){ applicationId = flavors[1].platformIds.squareId } else if(flavors[0].name.equals("circle")){ applicationId = flavors[1].platformIds.circleId } variant.getDefaultConfig().applicationId applicationId } 

    Ce n'est peut-être pas le moyen le plus élégant ou le plus efficace de l'atteindre, mais ça fonctionne parfaitement pour moi. Maintenant, je peux ajouter tous mes Ids dans la section productFlavor, puis la VariantFilter définit l'application correct selon la première saveur.

    Gradle possède une propriété extras construite, afin que vous puissiez le faire sans définir une classe.

    Je ressemblerais à quelque chose comme ça, aurait peut-être fait une typo ou deux:

     productFlavors { blue { flavorDimension "color" ext.squareId = "yourAppId" ext.circleId = "yourAppId" } android.applicationVariants.all { variant -> def flavors = variant.getFlavors() if (flavors[0].name.equals("square")){ variant.mergedFlavor.setApplicationId(flavors[1].ext.squareId) } ... } 
     def appId = "my.custom.package" if (appId == "some.package") { ..... Change conditions based on the flavors maybe defined more variables } defaultConfig { applicationId "${appId}" ............... } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.