build.gradleのlocal.propertiesで定義されているプロパティを読み取るにはどうすればよいですか?


89

設定sdk.dirndk.dirましたlocal.properties

ファイル内sdk.dirおよびファイルndk.dir内で定義されている値を読み取るにはどうすればよいbuild.gradleですか?


15
本当の質問は、なぜこれがandroid gradleプラグインに組み込まれていないのですか?!?!?!?!
アルマンド2015年

@Armand:local.propertiesAndroid Studio自体のローカル構成で使用されているためか、同じ名前の別のファイルがあると、少し混乱する可能性があります。参照してくださいstackoverflow.com/a/49306091/1587329以下
SERV-INC

1
@Armandこれが5年前に構築されなかったのは残念ですが、後でこれが追加されました:android.getSdkDirectory()単に機能します。
AlexCohn19年

回答:


139

あなたはこの方法でそれを行うことができます:

Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
def sdkDir = properties.getProperty('sdk.dir')
def ndkDir = properties.getProperty('ndk.dir')

project.rootProjectサブプロジェクトでプロパティファイルを読み取る場合に使用しますbuild.gradle

.
├── app
│   ├── build.gradle <-- You are reading the local.properties in this gradle build file
│   └── src
├── build.gradle
├── gradle
├── gradlew
├── gradlew.bat
├── settings.gradle
└── local.properties

プロパティファイルが同じサブプロジェクトディレクトリにある場合は、を使用できますproject


3
「project.rootProject」とは何ですか?
AlexBalo 2014

1
簡単な説明を追加
rciovati 2014

プロジェクトとはどういう意味ですか?私のアイデアは私にエラーを与えています。プロジェクトパスを取得するにはどうすればよいですか。
AlexBalo 2014

build.gradleファイル内にはproject、現在のプロジェクトを参照する変数があります。奇妙なエラーがある場合は、新しい質問をしてください。
rciovati 2014

app / src / main / java / my_package_name / Utils.javaのユーティリティクラス内にコードをコピーすると、解決できません。Utilityクラスからlocal.propertiesを読み取るにはどうすればよいですか?
AlexBalo 2014

26

local.properties

default.account.iccid=123

build.gradle-

def Properties properties = new Properties()
properties.load(project.rootProject.file("local.properties").newDataInputStream())

defaultConfig {

    resValue "string", "default_account_iccid", properties.getProperty("default.account.iccid", "")
}

コードでは、リソースから他の文字列として取得します-

resources.getString(R.string.default_account_iccid);

2
これが正解です。どうして選ばれないの?選ばれた答えは解決策さえ提供しませんか?
JoshuaPinter19年

10

@rciovatiの答えは確かに正しいですが、sdk.dirとの値を読み取る別の方法もありndk.dirます。

で指摘したよう岳上田ことで、このブログのエントリ(NDKディレクトリを取得する)BasePluginためのクラスが提供するメソッドgetNdkFolder()getSdkFolder()

def ndkDir = project.plugins.findPlugin('com.android.application').getNdkFolder()
def sdkDir = project.plugins.findPlugin('com.android.application').getSdkFolder()

注:ライブラリを構築している場合は、に変更com.android.applicationするcom.android.library必要がある場合があります

これは、フォルダ値を読み取るためのより洗練された方法かもしれません。@rciovatiによって提供される回答は、プロパティファイル内の任意の値を読み取ることができるため、より柔軟であると言わなければなりません。


1
Gradle 1.1.0の場合、次のように使用する必要plugins.getPlugin('com.android.library').sdkHandler.getNdkFolder()があります:stackoverflow.com/questions/28615439/…–
Stephan

1
「実験的」プラグインへの移行で再び壊れた:(
Alex Cohn

8

上記のlocal.propertiesを手動でロードする答えは明らかに機能し、どのプラグインが適用されたかを知る必要がある次の答えも同様に機能するはずです。

これらのアプローチは、アプリケーション、テスト、またはライブラリプラグインのいずれを使用しているかに関係なく機能するため、より一般的であるため、一部の人にとっては少し良いかもしれません。これらのスニペットは、すべてのAndroidプラグイン構成(製品フレーバー、ビルドツールバージョンなど)への完全なプログラムアクセスも提供します。

Android Gradleプラグインを使用しているbuild.gradleファイルにアクセスする必要がある場合は、Android DSLに直接アクセスするだけで、直接利用できるようになります。

project.android.sdkDirectory

これの長い形式(以下)は、カスタムGradle Tasksクラスまたはプラグインを作成している場合、または単に使用可能なプロパティを表示したい場合に便利です。

// def is preferred to prevent having to add a build dependency.
def androidPluginExtension = project.getExtensions().getByName("android");

// List available properties.
androidPluginExtension.properties.each { Object key, Object value ->
    logger.info("Extension prop: ${key} ${value}")
}
String sdkDir = androidPluginExtension.getProperties().get("sdkDirectory");
System.out.println("Using sdk dir: ${sdkDir}");

この投稿の時点で、adbExe間違いなく注目に値する便利なプロパティもあります。

このコードは、AndroidGradleプラグインがGradleライブサイクルごとに構成された後に実行する必要があります。通常、これは、のexecuteメソッドに配置するTaskandroid、Androidアプリ/ライブラリのbuild.gradleファイルのDSL宣言の後に配置することを意味します。

これらのスニペットには、Android Gradleプラグインのバージョンをアップグレードすると、プラグインの開発時にこれらのプロパティが変更される可能性があるという警告もあります。そのため、GradleとAndroid Gradleプラグインのバージョン間、およびAndroid Studio(Androidの新しいバージョンの場合もあります)間を移動するときにテストするだけです。 Studioには新しいバージョンのAndroidGradleプラグインが必要です)。


3

もっとエレガントな方法だと思います。

println "${android.getSdkDirectory().getAbsolutePath()}"

android gradle1.5.0で動作します。


1

設定sdk.dirndk.dirましたlocal.properties

Android Studio(ルートプロジェクト用)ですでに使用さlocal.propertiesいる値を手動で設定するかどうかを再検討する場合があります。

あなたはこのファイルを手動で変更すべきではありませんか、あなたのバージョン管理システムにそれを確認してください。

ただし、コメントに記載されているcmakeに関する特定の免除を参照してください。


まったく逆です。ファイルはAndroidStudioによって管理されており、その内容を読むと便利な場合があります。幸いなことに、これは現在サポートされています:android.getSdkDirectory()
AlexCohn19年

@AlexCohn:確かに、読書はいいですね。答えは、手動で値を設定することだけを扱っています。うまくいけば、今より明確になります。
SERV-INC

の手動操作local.propertiesも合法です。developer.android.com/studio/projects/を参照してくださいcmake.dir="path-to-cmake"デフォルトのルックアップ動作をオーバーライドするために追加することをお勧めします。
AlexCohn19年

@AlexCohn:1つの選択肢として。警告付きIf you set this property, Gradle no longer uses PATH to find CMake.。それで、あなたはそれについてどう思いますか?それを使用することをお勧めしますか、それとも場合によっては変更できると単純に述べていますか?つまり、これはRFC2119のようにすべきではありません:正当な理由がない限り、そのようにしようとしますか?
SERV-INC

1
私はこのフレーズを異なって解釈します。「GradleはCMakeを見つけるためにPATHを使用しなくなりました」は、local.propertiesに追加cmake.dirするという文書化された目的であり、危険なことを行うことによる警告や副作用ではありません。正当な理由がある場合(つまり、GradleがPATHを使用してCMakeを検索することを望まない場合)にそれを使用することを推奨するのは私ではなく、Googleです。
AlexCohn19年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.