Я сел sdk.dirи ndk.dirвошел local.properties.
Как мне прочитать значения, определенные в файле sdk.dirи ndk.dirв нем build.gradle?
Я сел sdk.dirи ndk.dirвошел local.properties.
Как мне прочитать значения, определенные в файле sdk.dirи ndk.dirв нем build.gradle?
local.propertiesон используется для собственной локальной конфигурации Android Studio, и наличие другого файла с тем же именем может создать небольшую путаницу. См. Stackoverflow.com/a/49306091/1587329 ниже
android.getSdkDirectory()просто работает.
Ответы:
Вы можете сделать это следующим образом:
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.
build.gradleфайла projectнаходится переменная, которая относится к текущему проекту. Если у вас есть странные ошибки, задайте новый вопрос.
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);
Хотя ответ @rciovati, безусловно, правильный, существует также альтернативный способ чтения значений для sdk.dirи ndk.dir.
Как указано в этой записи блога Гаку Уэда (Получение каталога 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, более гибкий, так как можно прочитать любое значение в файле свойств.
plugins.getPlugin('com.android.library').sdkHandler.getNdkFolder()как показано здесь: stackoverflow.com/questions/28615439/…
Ответ, который загружает local.properties вручную выше, очевидно, работает, и следующий, который требует, чтобы вы знали, какой плагин был применен, также должен работать.
Эти подходы могут быть немного лучше для некоторых, поскольку они более общие, поскольку работают независимо от того, используете ли вы плагин Application, Test или Library. Эти фрагменты также предоставляют вам полный программный доступ ко всей конфигурации плагина Android (варианты продукта, версия инструментов сборки и многое другое):
Если вам нужен доступ к файлу build.gradle, который использует подключаемый модуль Android 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свойство, которое определенно стоит отметить.
Этот код должен выполняться ПОСЛЕ того, как подключаемый модуль Android Gradle настроен в соответствии с жизненным циклом Gradle. Обычно это означает, что вы помещаете его в executeметод a Taskили размещаете ПОСЛЕ androidобъявления DSL в build.gradleфайле приложения / библиотеки Android ).
Эти фрагменты также содержат предупреждение о том, что по мере обновления версий плагина Android Gradle эти свойства могут изменяться по мере разработки плагина, поэтому просто проверьте при переходе между версиями плагина Gradle и Android Gradle, а также Android Studio (иногда новая версия Android Studio требуется новая версия подключаемого модуля Android Gradle).
Думаю, это более изящный способ.
println "${android.getSdkDirectory().getAbsolutePath()}"
он работает на Android Gradle 1.5.0.
Я сел
sdk.dirиndk.dirвошелlocal.properties.
Вы можете пересмотреть, хотите ли вы вручную установить значения, local.propertiesпоскольку они уже используются Android Studio (для корневого проекта), и
вам не следует изменять этот файл вручную или регистрировать его в своей системе контроля версий.
но см. конкретное исключение для cmake, указанное в комментариях.
android.getSdkDirectory()
local.propertiesправомерно. См. Developer.android.com/studio/projects/… : Google рекомендует добавить, cmake.dir="path-to-cmake"чтобы переопределить поведение поиска по умолчанию.
If you set this property, Gradle no longer uses PATH to find CMake.. Так что ты думаешь об этом? Вы рекомендуете его использовать или просто упоминаете, что в некоторых случаях его можно изменить? То есть: это НЕ ДОЛЖНО быть таким, как в RFC2119 : попытаться сделать это таким образом, если нет веских причин?
cmake.dirв local.properties , а не какое-то предостережение или побочный эффект выполнения чего-то опасного. Это не я, это Google рекомендует использовать его, когда есть веская причина (например, если вы не хотите, чтобы Gradle использовал PATH для поиска CMake).