Доступ к значению 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