我在sdk.dir
中设置了ndk.dir
和local.properties
。
如何阅读sdk.dir
文件中ndk.dir
和build.gradle
中定义的值?
答案 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.dir
和ndk.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)
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.dir
和ndk.dir
。
您可以重新考虑是否要将local.properties
中的值手动设置为that is already in use by Android Studio (for the root project), and
您不应手动修改此文件或将其签入您的版本控制系统。
但请参阅评论中列出的有关cmake的特定豁免。
答案 7 :(得分:0)
以下Gradle技术向您展示了如何在local.properties文件中存储属性,以便应用可以安全地引用该属性。
local.properties
,然后像下面的示例一样添加属性:sdk.dir=MY_SDK_DIR
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", "")
getString(R.string.sdk_dir);