Есть ли способ использовать функции Java 8 с проектом библиотеки Android?

Я следил за Руководством по функциям Android Java 8. Он хорошо работает для Android-приложения. Но когда я пытаюсь использовать его в проекте библиотеки Android, я получаю

Error:Library projects cannot enable Jack. Jack is enabled in default config.

Частичное решение: Я включил выражение lamdba с Gradle Плагин Retrolambda.

Ответ 1

У меня была одна и та же проблема, и я пробовал разные подходы. Теперь он работает для меня без использования retrolambda (что вызвало некоторые странные ошибки во время выполнения). Также Джек не работает по той же причине, о которой вы уже говорили. На google.com есть интересная статья об ошибке: https://code.google.com/p/android/issues/detail?id=211386

Вот мой build.gradle script, я использовал обходной путь из сообщения об ошибке, чтобы исправить исключение "MethodType not found" во время компиляции.

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
    }
}
apply plugin: 'com.android.library'

repositories {
    mavenCentral()
}

// Java8 not fully supported in library projects yet, https://code.google.com/p/android/issues/detail?id=211386
// this is a temporary workaround to get at least lambdas compiling
gradle.projectsEvaluated {
    tasks.withType(JavaCompile) {
        options.compilerArgs << "-Xbootclasspath/a:" + System.properties.get("java.home") + "/lib/rt.jar"
    }
}

android {
    compileSdkVersion 24
    buildToolsVersion "24"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 24
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

Ответ 2

Конечно, это была долгая поездка. Я пробовал все возможные комбинации плагина gradle, экспериментальный плагин gradle + retrolambda + Jack и т.д., Но не повезло. До сих пор. Из Android Studio 3.0 Preview 1 или более поздней версии (и, следовательно, плагина Android gradle 3.0.0-alpha1 или более поздней версии) инструментальная цепочка Jack устарела и заменена некоторым новым преобразованием байт-кода - сахарированием, используемым в сочетании со стандартным javac.

С помощью этой настройки я лично (наконец!!!) успешно использовал функции Java 8, такие как lambdas в проекте библиотеки.

Эта страница содержит всю техническую информацию, а также помощь по миграции и т.д.: https://developer.android.com/studio/write/java8-support.html