有没有办法在Android库项目中使用Java8特性?

有没有办法在Android库项目中使用Java8特性?,android,java-8,Android,Java 8,我跟着火车走。它适用于Android应用程序项目。但当我尝试将它用于Android库项目时,我得到了 Error:Library projects cannot enable Jack. Jack is enabled in default config. 部分解决方案: 我使用启用了lamdba表达式。我遇到了相同的问题,并尝试了不同的方法。它现在可以在不使用retrolambda的情况下工作(这在运行时产生了一些奇怪的错误)。另外,杰克不活跃的原因与你刚才提到的相同。 google.com

我跟着火车走。它适用于Android应用程序项目。但当我尝试将它用于Android库项目时,我得到了

Error:Library projects cannot enable Jack. Jack is enabled in default config.
部分解决方案:
我使用启用了lamdba表达式。

我遇到了相同的问题,并尝试了不同的方法。它现在可以在不使用retrolambda的情况下工作(这在运行时产生了一些奇怪的错误)。另外,杰克不活跃的原因与你刚才提到的相同。 google.com上有一篇关于这个话题的有趣的bug帖子:

这是我的build.gradle脚本,我使用了bug帖子中的解决方法来修复编译期间的“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
    }
}
buildscript{
存储库{
mavenCentral()
}
依赖关系{
classpath'com.android.tools.build:gradle:2.1.2'
}
}
应用插件:“com.android.library”
存储库{
mavenCentral()
}
//Java8尚未在库项目中得到完全支持,https://code.google.com/p/android/issues/detail?id=211386
//这是一个临时解决方案,至少可以让lambdas编译
gradle.项目评估{
tasks.withType(JavaCompile){

options.compilerArgs这肯定是一段漫长的旅程。我尝试了gradle插件、实验性gradle插件+
retrolambda
++
Jack
等的所有可能组合,但运气不佳。直到现在。从Android Studio 3.0预览版1或更高版本(因此,Android gradle插件
3.0.0-alpha1
或更高版本),Jack工具链被弃用,并被一些新的字节码转换-糖化所取代,与标准的
javac
编译器一起使用

通过这个设置,我个人(终于!!!)在一个库项目中成功地使用了Java8特性,比如lambdas


此页面包含所有技术信息以及迁移帮助等:

AFAIK,不,从今天起,as 2.1.2告诉您,它已经在默认配置中启用。您应该能够使用它。@DanielHolst否,默认配置下,这意味着它是由@sasha_tm在其
defaultConfig
gradle脚本中启用的节,并不表示默认情况下已启用。谢谢。我会尝试。我还遇到了一个问题,即当为主应用程序项目启用Jack时,我无法调试库项目。它不适用于最新的构建工具,即25。错误:LibClass.java:18-19:来自jar文件的Lambda需要修改类路径上的接口编译后的未知接口是java.lang.Runnableal,因此现在使用Jack编译时出现“Lambda来自jar文件,需要在类路径上编译它们的接口,未知接口是java.lang.Runnable”错误。在花了几个小时搜索新解决方案后,使用Retro Lambda:(还要确保在环境变量中设置了JAVA_HOME。从3月14日开始,jack/jill工具链已被弃用:我建议使用retrolambda,直到上一个工具链提供JAVA 8支持。我将从Android Studio 3.0开始获得支持。以下是关于未来支持的更多信息。)端口和迁移说明:将库迁移到Java 8是否也会迫使消费应用程序使用Java 8支持进行编译?我没有尝试过,但我希望在库中使用lambdas等功能不会强制客户端应用程序与Java 8兼容,因为这些功能是通过糖化实现的。使用Java 8 API,如streams当然是另一回事,因为它可能会影响库的Minsdk版本,进而影响app.Hi@PseudoPsyche,很抱歉这么长时间的延迟。是的,确实如此。没有Java 8兼容性,我实际上遇到了一个奇怪的dex错误,并且花了一段时间才意识到它是什么。我想这可能是不幸的。我的意思是关于l仅限于library,因为它增加了消费应用程序的另一个要求。从长远来看,这不是什么大问题,但当消费者要求进行他们可能还没有计划好的更改时,他们通常会有所抵触。/仅仅迁移到Java 8并没有强制应用程序使用Java 8进行编译,但在库中使用lambda实际上导致了Dex错误……我也认为这是不幸的,因为我的图书馆的许多消费者仍然使用java 7来编译他们的应用程序。。