Я поставив 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є змінний, який посилається на поточний проект. Якщо у вас є дивні помилки, задайте нове запитання.
локальні.властивості
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 вручну вище, очевидно, працює, і наступний, який вимагає, щоб ви знали, який застосований плагін також повинен працювати.
Для деяких ці підходи можуть бути трохи кращими, оскільки вони є більш загальними, оскільки вони працюють незалежно від того, використовуєте ви додаток, тест або плагін бібліотеки. Ці фрагменти також дають вам повний програмний доступ до всієї конфігурації плагіна 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).
Я думаю, що це більш елегантний спосіб.
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).