Я поставив 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).