Intereting Posts
После обновления службы Google Play до версии 13 я получил сообщение об ошибке Преобразование целого числа в строку без выделения памяти Как я могу создать многоязычное приложение для Android? Существуют ли какие-либо виджеты таблиц для Android? Воспроизведение локального видео в webview Как сделать форму шестиугольника ImageView ClassNotFoundException для пользовательского ImageView в приложении для Android Android: настройка onClickListener на часть текста в TextView – проблема Есть ли способ добавить значок к значку приложения в Android? QGuiApplication останавливает цикл события, когда телефон блокируется при компиляции с Qt 5.3 или Qt 5.4 (но не с Qt 5.2) Галерея с фильтром папок Позиционирование матричного изображения в центре изображения Как подключить файл изображения по электронной почте? Создание кликабельного изображения в GridView на Android Получить координаты центра веб-страницы на планшетных устройствах с использованием JavaScript

Доступ к значению sdk.dir в build.gradle после оценки проекта

У меня есть пользовательская задача в моем файле build.gradle, который преобразует байт-код в файлы классов, прежде чем получить dex'd, который выглядит так:

task droidcook(type: JavaExec) { main 'org.tsg.android.asm.Main' } afterEvaluate { project -> android.applicationVariants.each { variant -> variant.javaCompile.doLast { project.tasks.droidcook.configure { classpath variant.javaCompile.classpath classpath "build/classes/" + variant.dirName classpath sdk.dir + "/platforms/android-19/android.jar" classpath "compile-libs/droidcook.jar" args "build/classes/" + variant.dirName args "com.example" // args "-debug" // args "-asmifier" } project.tasks.droidcook.execute() } } } 

Проблема с вышесказанным – это classpath sdk.dir + ... где sdk.dir не оценивается соответствующим образом. Чтобы получить эту работу, мне в настоящее время приходится жестко кодировать путь к android.jar .

Бонусные очки, если вы можете ответить с соответствующим значением для замены android-19 для доступа к определенному платформе android.jar на основе конфигурации проекта. : D

Solutions Collecting From Web of "Доступ к значению sdk.dir в build.gradle после оценки проекта"

Я не вижу опубликованного API, чтобы выставлять файл sdk.dir в ваш файл сборки, поэтому я просто скрепил код с https://android.googlesource.com/platform/tools/build/+/d69964104aed4cfae5052028b5c5e57580441ae8/gradle/src/main /groovy/com/android/build/gradle/internal/Sdk.groovy, чтобы прочитать его вручную. Что касается замены android-19, если я читаю android.compileSdkVersion, я получаю эту точную строку. Я не уверен, что это тоже опубликованный API, поэтому он может быть изменен и поврежден в будущих версиях плагина Android Gradle.

С учетом сказанного это работает для меня:

 afterEvaluate { def rootDir = project.rootDir def localProperties = new File(rootDir, "local.properties") if (localProperties.exists()) { Properties properties = new Properties() localProperties.withInputStream { instr -> properties.load(instr) } def sdkDir = properties.getProperty('sdk.dir') def androidJarPath = sdkDir + "/platforms/" + android.compileSdkVersion + "/android.jar" print androidJarPath + "\n" } } 

Если нет local.properties, этот код будет терпеть неудачу. Если вас это волнует, вы можете скопировать больше кода из Sdk.groovy, чтобы имитировать его поведение, пытаясь найти разумное значение по умолчанию.

Существует гораздо более простой способ, хотя он не документирован, поэтому он, вероятно, официально не поддерживается.

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

Как ни странно, этот метод, по-видимому, доступен для некоторых версий плагина gradle. Он не доступен в фиксации, связанной выше Скоттом. Если приведенный выше код не работает, попробуйте следующее:

 println "${android.plugin.getSdkFolder().getAbsolutePath()}" 

Для полноты, вот как получить переменную ndk.dir , тоже:

 println "${android.plugin.getNdkFolder().getAbsolutePath()}" 

Начиная с плагина android gradle v2.1.2, это то, что я использую в моем сценарии градиента:

 android.ndkDirectory.path android.sdkDirectory.path 

Например, чтобы явно запустить ndk-build :

 task ndkBuild(type: Exec) { commandLine android.ndkDirectory.path+'/ndk-build', '-C', file('src/main').absolutePath } 

Использование:

 String androidJar = android.getBootClasspath()[0] 

Предполагая, что вы используете SDK 21, это установит '<путь к SDK> /platforms/android-21/android.jar' в переменную androidJar (выбор версии SDK выполняется автоматически).

Следующим шагом, очевидно, будет замена «classpath sdk.dir …» и т. Д. С:

 classpath androidJar