如何读取build.gradle中local.properties中定义的属性

时间:2014-02-24 21:52:19

标签: android android-gradle

我在sdk.dir中设置了ndk.dirlocal.properties

如何阅读sdk.dir文件中ndk.dirbuild.gradle中定义的值?

8 个答案:

答案 0 :(得分:119)

你可以这样做:

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

答案 1 :(得分:10)

尽管@ rciovati的答案肯定是正确的,但还有另一种方法可以阅读sdk.dirndk.dir的值。

正如this blog entry by Gaku Ueda(获取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提供的答案更灵活,因为可以读取属性文件中的任何值。

答案 2 :(得分:10)

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 -

中获取其他字符串
resources.getString(R.string.default_account_iccid);

答案 3 :(得分:7)

上面手动加载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属性,绝对值得注意。

此代码必须在根据Gradle生命周期配置Android Gradle插件后执行。通常,这意味着您将其置于execute的{​​{1}}方法中,或者将其放置在Android应用/库中的Task DSL声明之后。 android文件)。

这些片段还附带警告,当您升级Android Gradle Plugin版本时,这些属性可以随着插件的开发而改变,因此只需在Gradle和Android Gradle插件以及Android Studio(有时是新版本)之间移动时进行测试Android Studio版本需要新版本的Android Gradle插件。

答案 4 :(得分:3)

我认为这是更优雅的方式。

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

适用于android gradle 1.5.0。

答案 5 :(得分:1)

现在使用 the new google plugin

更简单

1- 添加您的财产

sdk_dir="sdk dir"

2- 添加插件 (Groovy) 这在顶级(项目级别)

buildscript {
 dependencies {
     classpath "com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:1.3.0"
 }
}

并在您的应用 Gradle 中

plugins {
    id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
}

3- 构建你的项目 4- 像这样访问它

BuildConfig.sdk_dir

答案 6 :(得分:0)

  

我在private static DateTime CustomParseDayOfYear(string input) { if (input == null) throw new ArgumentNullException(nameof(input)); var parts = input.Split('-', 'T'); if (parts.Length != 3) throw new FormatException(nameof(input)); var timeParts = parts[2].Trim('Z').Split(':'); if (timeParts.Length != 3) throw new FormatException(nameof(input)); int hour, minute, second, year, dayOfYear; if (!int.TryParse(parts[0], out year)) throw new FormatException("Year must be an integer"); if (!int.TryParse(parts[1], out dayOfYear)) throw new FormatException("DayOfYear must be an integer"); if (!int.TryParse(timeParts[0], out hour)) throw new FormatException("Hour must be an integer"); if (!int.TryParse(timeParts[1], out minute)) throw new FormatException("Minute must be an integer"); if (!int.TryParse(timeParts[2], out second)) throw new FormatException("Second must be an integer"); var maxDayOfYear = new DateTime(year, 12, 31).DayOfYear; if (year < 1 || year > 9999) throw new ArgumentOutOfRangeException( "Year must be greater than zero and less than 10000"); if (dayOfYear < 1 || dayOfYear > maxDayOfYear) throw new ArgumentOutOfRangeException( $"DayOfYear must be greater than zero and less than {maxDayOfYear + 1}"); if (hour > 23) throw new ArgumentOutOfRangeException($"Hour must be less than 24"); if (minute > 59) throw new ArgumentOutOfRangeException($"Minute must less than 60"); if (second > 59) throw new ArgumentOutOfRangeException($"Second must less than 60"); return new DateTime(year, 1, 1, hour, minute, second).AddDays(dayOfYear - 1); } 中设置了sdk.dirndk.dir

您可以重新考虑是否要将local.properties中的值手动设置为that is already in use by Android Studio (for the root project), and

  

不应手动修改此文件或将其签入您的版本控制系统。

但请参阅评论中列出的有关cmake的特定豁免。

答案 7 :(得分:0)

添加属性

以下Gradle技术向您展示了如何在local.properties文件中存储属性,以便应用可以安全地引用该属性。

  1. project level目录中打开local.properties,然后像下面的示例一样添加属性:
sdk.dir=MY_SDK_DIR
  1. 在应用级build.gradle文件中,将此代码添加到defaultConfig元素中。这样,Android Studio可以在构建时从sdk.dir文件中读取local.properties属性,然后将构建变量注入到res/gradleResVlues.xml中。
Properties properties = new Properties()
if (rootProject.file("local.properties").exists()) {
    properties.load(rootProject.file("local.properties").newDataInputStream())
}

resValue "string", "sdk_dir", properties.getProperty("sdk.dir", "")
  1. 保存文件并将您的项目与Gradle同步。
  2. 使用以下代码检索字符串
getString(R.string.sdk_dir);