2017-10-09 8 views
1

私は自分のアンドロイドアプリケーションとライブラリを構築するために使用する多数のgradleモジュールを用意しています。私のアプリケーションは、複数のJava & C++ライブラリに分解されています。各モジュールはJavaライブラリーまたはAPKプロジェクトである可能性があります。 APKを表す各モジュールについて、build.gradleがあり、それらのビルド方法を制御するさまざまなproductFlavorsセクションを指定しています。例:私はAPK出力を表し、各リーフbuild.gradleに上記の構成を複製している避けるためにしようとしている何root 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" } 
     } 
     } 
    } 

。ルートレベルで製品のフレーバーを保存するにはどうしたらいいですか?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

あなたは「プラグインを適用する」を行うと、どのようにGradleのは 'ConfigurationPlugin'の内容は'アンドロイド{...} 'の下に行く必要があることを知っていますか? –

+0

プラグインが( 'apply()'メソッドで)適用されると、アンドロイドライブラリの 'LibraryExtension'クラスである' android {} '設定が得られます。 ['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を更新して、他のプロジェクトを含めることもできます。プロジェクトは、プラグインを適用する必要があるときに構築されます。

関連する問題