Я установил sdk.dir
и ndk.dir
в local.properties
.
Как мне прочитать значения, определенные в sdk.dir
и ndk.dir
в файле build.gradle
?
Я установил sdk.dir
и ndk.dir
в local.properties
.
Как мне прочитать значения, определенные в sdk.dir
и ndk.dir
в файле build.gradle
?
Вы можете сделать это следующим образом:
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
.
Хотя ответ @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, более гибкий, поскольку можно прочитать любое значение в файле свойств.
Ответ, который загружает 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).
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);
Я думаю, что это более элегантный способ.
println "${android.getSdkDirectory().getAbsolutePath()}"
он работает на android gradle 1.5.0.
Я установил
sdk.dir
иndk.dir
вlocal.properties
.
Вы можете пересмотреть, если вы хотите вручную установить значения в local.properties
как они уже используются Android Studio (для корневого проекта), и
Вы не должны изменять этот файл вручную или регистрировать его в своей системе контроля версий.
но посмотрите конкретное исключение о cmake, указанное в комментариях.