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

Vik*_*ram 78 android android-gradle-plugin

我已sdk.dirndk.dirlocal.properties.

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

rci*_*ati 126

你可以这样做:

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

使用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
Run Code Online (Sandbox Code Playgroud)

如果属性文件位于相同的子项目目录中,则可以使用project.

  • 什么是"project.rootProject"? (3认同)

Sat*_*tar 21

现在有了新的谷歌插件就更简单了

1-添加您的财产

sdk_dir="sdk dir"
Run Code Online (Sandbox Code Playgroud)

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

buildscript {
 dependencies {
     classpath "com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:1.3.0"
 }
}
Run Code Online (Sandbox Code Playgroud)

在你的应用程序 Gradle 中

plugins {
    id 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin'
}
Run Code Online (Sandbox Code Playgroud)

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

BuildConfig.sdk_dir
Run Code Online (Sandbox Code Playgroud)

  • 这很简单,不需要 getString() 的上下文 (2认同)

Dmi*_*ijs 17

local.properties

default.account.iccid=123
Run Code Online (Sandbox Code Playgroud)

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", "")
}
Run Code Online (Sandbox Code Playgroud)

在代码中,您从资源中获取其他字符串 -

resources.getString(R.string.default_account_iccid);
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案。如何不选择?选择的答案甚至没有提供解决方案?? (2认同)

sup*_*qua 10

虽然@ rciovati的答案当然是正确的,也有阅读价值的替代方式sdk.dirndk.dir.

正如指出的岳田此博客条目(NDK入门目录)的BasePlugin类提供了方法getNdkFolder()getSdkFolder():

def ndkDir = project.plugins.findPlugin('com.android.application').getNdkFolder()
def sdkDir = project.plugins.findPlugin('com.android.application').getSdkFolder()
Run Code Online (Sandbox Code Playgroud)

注意:如果要构建库com.android.application,com.android.library则可能必须更改为

这可能是一种更优雅的方式来读取文件夹值.虽然必须说@rciovati提供的答案更灵活,因为可以读取属性文件中的任何值.


G. *_*ini 10

添加属性

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

  1. 打开项目级别local.properties目录中的,然后添加您的属性,如下例所示:
sdk.dir=MY_SDK_DIR
Run Code Online (Sandbox Code Playgroud)
  1. 在您的应用程序级build.gradle文件中,将此代码添加到defaultConfig元素中。sdk.dir这允许 Android Studio 在构建时从文件中读取属性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", "")
Run Code Online (Sandbox Code Playgroud)
  1. 保存文件并将您的项目与 Gradle 同步。
  2. 使用以下代码检索您的字符串
getString(R.string.sdk_dir);
Run Code Online (Sandbox Code Playgroud)


Mah*_*zad 9

这是针对Kotlin DSL (build.gradle.kts) 的:

import java.util.*
// ...

val properties = Properties().apply {
    load(rootProject.file("local.properties").reader())
}
val myProp = properties["propName"]
Run Code Online (Sandbox Code Playgroud)

在 Android 项目(已应用该android插件的地方)中,您还可以执行以下操作:

import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties
// ...

val properties = gradleLocalProperties(rootDir)
val myProp = properties["propName"]
Run Code Online (Sandbox Code Playgroud)


Pau*_*ulR 7

上面手动加载local.properties的答案显然有效,下一个要求你知道应用了哪个插件的应该也可以.

对于某些人来说,这些方法可能会更好一点,因为它们更通用,因为无论您使用的是Application,Test还是Library插件,它们都能正常工作.这些片段还为您提供了对所有Android插件配置(产品风味,构建工具版本等)的完全编程访问:

如果您需要访问使用Android Gradle插件的build.gradle文件,只需直接访问Android DSL,因为它现在可直接使用:

project.android.sdkDirectory
Run Code Online (Sandbox Code Playgroud)

如果您正在创建自定义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}");
Run Code Online (Sandbox Code Playgroud)

在这个帖子发布时,还有一个方便的adbExe财产,绝对值得注意.

此代码必须在根据Gradle生命周期配置Android Gradle插件后执行.通常这意味着您将它放在a的execute方法中,Task或者将它android放在Android app/libraries的build.gradle文件中的DSL声明之后).

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


归档时间:

查看次数:

43677 次

最近记录:

6 年,10 月 前