2017-10-09 2 views
1

J'ai un grand nombre de modules gradle que j'utilise pour construire mes applications et bibliothèques Android. Mon application est décomposée en plusieurs bibliothèques Java C++ &. Chaque module peut être une bibliothèque Java ou un projet APK. Pour chaque module représentant un fichier APK, j'ai un build.gradle qui spécifie diverses sections productFlavors qui contrôlent la façon de les construire. Exemple:Comment spécifier les propriétés de dégradé communes dans le script racine gradle.build

flavorDimensions "mode" 

    productFlavors { 
     arm { 
     dimension "mode" 
     externalNativeBuild { 
      ndk { abiFilters "armeabi-v7a" } 
     } 
     } 

     x86 { 
     dimension "mode" 
     externalNativeBuild { 
      ndk { abiFilters "x86" } 
     } 
     } 

     full { 
     dimension "mode" 
     externalNativeBuild { 
      ndk { abiFilters "x86", "armeabi-v7a" } 
     } 
     } 
    } 

Ce que je suis en train d'éviter est de dupliquer la configuration ci-dessus dans chaque feuille build.gradle qui représente une sortie APK. Comment est-ce que je peux stocker les saveurs de produit au niveau de racine et d'une manière ou d'une autre avoir ces transitifs aux dossiers de congé de build.gradle donc je n'ai pas besoin de les reproduire?

Répondre

1

La bibliothèque de support fait quelque chose de très similaire, et vous pouvez see their method here (en particulier, the SupportLibraryPlugin). À un niveau élevé, la stratégie consiste à créer un greffon Gradle dans votre répertoire buildSrc que vous appliquez à chacun de vos projets. Ce plugin va appliquer la configuration commune.

Votre lecteur pourrait ressembler à ceci: [projet] /buildSrc/src/main/groovy/com/example/ConfigurationPlugin.groovy

class ConfigurationPlugin implements Plugin<Project> { 

    @Override 
    public void apply(Project project) { 
     LibraryExtension library = project.extensions.findByType(LibraryExtension.class); 

     library.flavorDimensions "mode" 

     library.productFlavors { 
      arm { 
       dimension "mode" 
       externalNativeBuild { 
        ndk { abiFilters "armeabi-v7a" } 
       } 
      } 

      x86 { 
       dimension "mode" 
       externalNativeBuild { 
        ndk { abiFilters "x86" } 
       } 
      } 

      full { 
       dimension "mode" 
       externalNativeBuild { 
        ndk { abiFilters "x86", "armeabi-v7a" } 
       } 
      } 
     } 

    } 
} 

[projet]/builSrc/build. gradle

apply plugin: 'groovy' 

repositories { 
    google() 
} 

dependencies { 
    compile 'com.android.tools.build:gradle:3.0.0-beta7' 
} 

module Bibliothèque build.gradle:

apply plugin: 'com.android.library' 
apply plugin: ConfigurationPlugin 

android { 
    // ... 
} 
+0

Lorsque vous appliquez le 'plugin d'application', comment gradle sait-il que le contenu de 'ConfigurationPlugin' doit être placé sous 'android {...}'? –

+0

Lorsque le plugin est appliqué (dans la méthode 'apply()'), nous obtenons la configuration 'android {}', qui est une classe 'LibraryExtension' pour les bibliothèques Android. That ['LibraryExtension'] (https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.LibraryExtension.html) a toutes les propriétés de la fermeture' android {} '. –

+0

Puis-je aussi structurer ceci pour que mon code groovy ne soit pas à la racine? Par exemple, je voudrais le stocker dans un module frère (également avec son code java) et l'utiliser depuis n'importe quel autre module. Je ne peux pas obtenir la commande apply plugin pour le trouver. N'a-t-il pas besoin d'être 'apply plugin: 'com.example.ConfigurationPlugin''? –

0

Vous pouvez référencer un autre projet Gradle dans votre projet en utilisant ':project-name', par ex. compile ':pluginproject'. Vous devez également mettre à jour settings.gradle pour inclure l'autre projet. Le projet sera construit quand il sera nécessaire d'appliquer le plugin.