web-dev-qa-db-ja.com

Gradleビルドスクリプト(Android)で定数を定義して使用するにはどうすればよいですか?

私は、ビルドシステムとしてGradleを使用したAndroidアプリケーションに取り組んでいます。

私の目的は、値(パッケージ名)をapplicationIdとして使用することです。

productFlavors {
   orange {
      applicationId "com.fruits.Android.orange"
      // ...

しかし、それをBuildConfigを介して公開し、Javaコードがアクセスできるようにします。

このアクセスは、フレーバーの外部から行う必要があります(つまり、無料バージョンのアプリは、ユーザーにPlayストアでのアップグレードを要求できるように、有料バージョンのパッケージ名を知っている必要があります)。

だから私はそのようなことをしたいと思います:

productFlavors {
   orange {
      applicationId orangeProPackage
      // ...


buildConfigField 'String', 'ORANGE_PRO_PACKAGE', "$orangeProPackage" // ?

Build_gradle全体に表示され、スクリプトを壊さないようにorangeProPackageを定義する方法がわかりません。

いくつかの異なるフレーバーがあるので、どうにかしてこれらすべての定数をそのようにグループ化できれば最高でしょう(私は推測しますか?):

def proPackages = [
        orange: "..."
        Apple: "..."
        banana: "..."
]

次に、proPackages.orangeなどのように、わかりやすく説明的な方法でそれらを参照します。

問題は、それを達成する方法ですか?

これは GradleでJavaで使用可能な変数を宣言することは可能ですか? の複製ではありません。

私はその質問を見ました(そして他のいくつか)。私はbuildConfigFieldsを宣言する方法を知っています。すでにたくさんあります。私の質問は、buildConfigFieldおよびapplicationIdと同じ値を再利用することです。

20
Konrad Morawski

Build.gradle全体に表示され、スクリプトを壊さないようにorangeProPackageを定義する方法がわからないだけです。

プロジェクトルートのgradle.propertiesに配置できます。他の.propertiesファイルと同様に、これは単なるKey-Valueストアです。

ORANGE_PRO_PACKAGE=com.morawski.awesomeapp

次に、ORANGE_PRO_PACKAGEで単純なグローバル文字列変数(build.gradle)として参照します。

buildConfigField 'String', 'ORANGE_PRO_PACKAGE', ORANGE_PRO_PACKAGE

これらの定数すべてをどうにかしてグループ化できれば最高です

.propertiesファイルに関係するものは、それを処理しません。そこでは、トップレベルのbuild.gradleファイルで、単純なGroovyコードなどでグローバルを定義している場合があります。

22
CommonsWare