Я сел sdk.dir
и ndk.dir
вошел local.properties
.
Как мне прочитать значения, определенные в файле sdk.dir
и ndk.dir
в нем build.gradle
?
android
android-gradle-plugin
Викрам
источник
источник
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
метод aTask
или размещаете ПОСЛЕ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.
источник
Вы можете пересмотреть, хотите ли вы вручную установить значения,
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).