Как мне прочитать свойства, определенные в local.properties в build.gradle

Я установил sdk.dir и ndk.dir в local.properties.

Как мне прочитать значения, определенные в sdk.dir и ndk.dir в файле build.gradle?

Ответ 1

Вы можете сделать это следующим образом:

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.

Ответ 2

Хотя ответ @rciovati, безусловно, правильный, есть и альтернативный способ чтения значений для sdk.dir и ndk.dir.

Как указано в этой записи в блоге от 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, более гибкий, поскольку можно прочитать любое значение в файле свойств.

Ответ 3

Ответ, который загружает local.properties вручную, очевидно, работает, и следующий, который требует, чтобы вы знали, какой плагин был применен, должен работать.

Эти подходы могут быть немного лучше для некоторых, поскольку они более универсальны, потому что они работают независимо от того, используете ли вы плагин Application, Test или Library. Эти фрагменты также дают вам полный программный доступ ко всей конфигурации Android-плагина (Product Flavors, Build Tools version и многое другое):

Если вам нужен доступ в файле build.gradle, который использует плагин Android Gradle, просто подключитесь к Android DSL напрямую, как теперь прямо сейчас:

project.android.sdkDirectory

Более длинная форма (ниже) этого удобна, если вы создаете пользовательские классы Gradle Задачи или плагины или просто хотите просмотреть, какие свойства доступны.

// 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, которое, безусловно, стоит отметить.

Этот код должен выполняться ПОСЛЕ того, как плагин Android Gradle настроен на жизненный цикл Gradle. Обычно это означает, что вы поместите его в метод execute для Task или поместите его ПОСЛЕ объявления android DSL в файле приложения/библиотеки Android build.gradle).

В этих фрагментах также содержится предостережение о том, что при обновлении версий плагинов Android Gradle эти свойства могут изменяться по мере разработки плагина, поэтому просто проверяйте при переходе между версиями плагина Gradle и Android Gradle, а также Android Studio (иногда для новой версии Android Studio требуется новая версия плагина Android Gradle).

Ответ 4

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);

Ответ 5

Я думаю, что это более элегантный способ.

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

он работает на android gradle 1.5.0.

Ответ 6

Я установил sdk.dir и ndk.dir в local.properties.

Вы можете пересмотреть, если вы хотите вручную установить значения в local.properties как они уже используются Android Studio (для корневого проекта), и

Вы не должны изменять этот файл вручную или регистрировать его в своей системе контроля версий.

но посмотрите конкретное исключение о cmake, указанное в комментариях.