Як прочитати властивості, визначені у local.properties у build.gradle


88

Я поставив sdk.dirі ndk.dirв local.properties.

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


15
справжнє питання: чому це не вбудовано в плагін android gradle?!?!?!?!
Арманд

@Armand: можливо тому local.properties, що використовується для власної локальної конфігурації Android Studio, і наявність іншого файлу з такою ж назвою може створити трохи плутанини. Дивіться stackoverflow.com/a/49306091/1587329 нижче
serv-inc

1
@Armand шкода, що це не було побудовано 5 років тому, але згодом це було додано: android.getSdkDirectory()просто працює.
Alex Cohn

Відповіді:


137

Ви можете зробити це таким чином:

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.


3
Що це таке "project.rootProject"?
AlexBalo

1
Додано коротке пояснення
rciovati

Що ви маєте на увазі під проектом? Мій ІД видає мені помилку. Як отримати шлях до проекту.
AlexBalo

Усередині build.gradleфайлу projectє змінний, який посилається на поточний проект. Якщо у вас є дивні помилки, задайте нове запитання.
rciovati

Якщо я скопіюю ваш код у клас утиліти в app / src / main / java / my_package_name / Utils.java, його не вдасться вирішити. Як я можу прочитати local.properties з класу Utility?
AlexBalo

26

локальні.властивості

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

2
Це правильна відповідь. Як це не обрано? Обрана відповідь навіть не пропонує рішення ??
Джошуа Пінтер

10

Хоча відповідь @ 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, є більш гнучкою, оскільки можна прочитати будь-яке значення у файлі властивостей.


1
Для Gradle 1.1.0 вам потрібно користуватися, plugins.getPlugin('com.android.library').sdkHandler.getNdkFolder()як видно тут: stackoverflow.com/questions/28615439/…
Стефан,

1
Знову зламаний із переходом на "експериментальний" плагін :(
Алекс Кон,

8

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

Для деяких ці підходи можуть бути трохи кращими, оскільки вони є більш загальними, оскільки вони працюють незалежно від того, використовуєте ви додаток, тест або плагін бібліотеки. Ці фрагменти також дають вам повний програмний доступ до всієї конфігурації плагіна Android (Product Flavors, версія інструментів побудови та багато іншого):

Якщо вам потрібен доступ до файлу build.gradle, який використовує плагін Android Gradle, просто перейдіть безпосередньо до DSL для Android, оскільки він тепер доступний безпосередньо:

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


3

Я думаю, що це більш елегантний спосіб.

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

він працює на android gradle 1.5.0.


1

Я поставив sdk.dirі ndk.dirв local.properties.

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

не слід змінювати цей файл вручну або перевіряти його у своїй системі контролю версій.

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


Зовсім навпаки: файл підтримується Android Studio, і іноді приємно читати його вміст. На щастя, це зараз підтримується:android.getSdkDirectory()
Алекс Кон,

@AlexCohn: звичайно, читання звучить добре. Відповідь стосується лише ручного встановлення значень. Сподіваємось, зараз зрозуміліше.
serv-inc

Ручне маніпулювання також local.propertiesє законним. Див. Developer.android.com/studio/projects/… : Google рекомендує додати, cmake.dir="path-to-cmake"щоб замінити поведінку пошуку за замовчуванням.
Alex Cohn

@AlexCohn: як один вибір. З застереженням If you set this property, Gradle no longer uses PATH to find CMake.. Отже, що ви думаєте про це? Чи рекомендуєте ви використовувати його, чи просто згадуєте, що в деяких випадках він може бути змінений? Тобто: це НЕ ПОВИННО бути таким, як у RFC2119 : спробуйте зробити це так, якщо немає поважних причин?
serv-inc

1
Я трактую цю фразу по-різному. "Gradle більше не використовує PATH для пошуку CMake" - це задокументована мета додавання cmake.dirдо local.properties , а не якесь застереження чи побічний ефект від вчинення чогось небезпечного. Це не я, а Google рекомендує використовувати його, коли є поважна причина (тобто, якщо ви не хочете, щоб Gradle використовував PATH для пошуку CMake).
Alex Cohn
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.