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

17

У меня есть пользовательская задача в моем файле 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     

задан dskinner 25.11.2013 в 22:33
источник

4 ответа

21

Я не вижу опубликованного API, чтобы выставлять файл sdk.dir в ваш файл сборки, поэтому я просто прошивал код из Ссылка , чтобы прочитать его вручную. Что касается замены 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, чтобы подражать его поведению, пытаясь найти разумное значение по умолчанию.

    
ответ дан Scott Barta 28.11.2013 в 19:05
источник
  • очень ценится, я страдал от выгорания градиента: D IIRC от изучения этой проблемы в прошлом, проблема заключалась в том, что каталог sdk var создается после моего afterEvaluate и, следовательно, почему он недоступен. Таким образом, загрузка вручную, вероятно, является единственным решением в настоящее время, и это работает достаточно хорошо для кросс-платформенного развития. –  dskinner 28.11.2013 в 19:27
  • println "$ {android.getSdkDirectory (). getAbsolutePath ()}" работает на 1.5.0 –  Victor Choy 16.03.2016 в 13:03
15

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

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

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

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

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

println "${android.plugin.getNdkFolder().getAbsolutePath()}"
    
ответ дан David 27.01.2015 в 02:38
источник
  • Работает на 1.3.1. –  Jared Burrows 12.10.2015 в 20:42
  • println "$ {android.getSdkDirectory (). getAbsolutePath ()}" работает на 1.5.0 –  Victor Choy 16.03.2016 в 13:02
4

Как и плагин 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
}
    
ответ дан Peter Tran 14.07.2016 в 06:38
источник
0

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

String androidJar = android.getBootClasspath()[0]

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

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

classpath androidJar
    
ответ дан d4vidi 21.07.2015 в 17:44
источник