2017-10-09 28 views
1

我有大量gradle模塊用於構建android應用程序和庫。我的應用程序被分解成多個java庫。每個模塊可能是一個Java庫或一個APK項目。對於代表APK的每個模塊,我有一個build.gradle,它指定了各種控制如何構建它們的productFlavors部分。例如:如何在根gradle.build腳本中指定通用gradle屬性

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" } 
     } 
     } 
    } 

我試圖避免的是在表示APK輸出的每個葉build.gradle中重複上述配置。我該如何將產品口味存儲在根級別,並以某種方式將這些產品傳遞給離職文件build.gradle,所以我不需要重複它們?

回答

1

支持庫的功能非常類似,您可以使用see their method here(特別是the SupportLibraryPlugin)。

在高層次上,策略是在您的buildSrc目錄中創建一個適用於每個項目的Gradle插件。這個插件將應用通用配置。

你的插件可能會是這個樣子: [項目] /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" } 
       } 
      } 
     } 

    } 
} 

[項目]/builSrc /編譯。 gradle這個

apply plugin: 'groovy' 

repositories { 
    google() 
} 

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

庫模塊的build.gradle

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

android { 
    // ... 
} 
+0

當您執行'apply plugin'時,Gradle如何知道'ConfigurationPlugin'內容需要在android {...}'下進行? –

+0

當插件被應用時(在apply()方法中),我們得到了'android {}'配置,這是Android庫的'LibraryExtension'類。 ['LibraryExtension'](https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.LibraryExtension.html)具有'android {}'閉包的所有屬性。 –

+0

也可以這樣構造,以便我的groovy代碼不在根?例如,我想將它存儲在兄弟模塊(也包含其Java代碼)中,並使用其他模塊中的模塊。我無法使用apply plugin命令來查找它。是否需要'apply plugin:'com.example.ConfigurationPlugin''? –

0

您可以在項目中使用':project-name'引用另一個Gradle項目,例如, compile ':pluginproject'。您還需要更新settings.gradle以包含其他項目。該項目將在需要應用該插件時構建。

相關問題