Lambda表达式在使用jack时因Android中不兼容的ClassChangeError而崩溃
我在我的Android项目中使用Java8。我已经设置了Jack(在android应用程序模块中)和Retrolambda(在其他模块中) 我遇到的问题是,当我试图使Lambda表达式使用class变量(并且我可以在任何模块中复制它)时,在一个特定场景中,Lambda表达式崩溃,在所有其他情况下,它都能按预期工作。也许这是一种标准的Java行为,但到目前为止我找不到任何解释。有人知道问题出在哪里吗? 我的班级和课程如下:Lambda表达式在使用jack时因Android中不兼容的ClassChangeError而崩溃,android,lambda,java-8,retrolambda,android-jack-and-jill,Android,Lambda,Java 8,Retrolambda,Android Jack And Jill,我在我的Android项目中使用Java8。我已经设置了Jack(在android应用程序模块中)和Retrolambda(在其他模块中) 我遇到的问题是,当我试图使Lambda表达式使用class变量(并且我可以在任何模块中复制它)时,在一个特定场景中,Lambda表达式崩溃,在所有其他情况下,它都能按预期工作。也许这是一种标准的Java行为,但到目前为止我找不到任何解释。有人知道问题出在哪里吗? 我的班级和课程如下: public class LambdaBugTest { pri
public class LambdaBugTest {
private final String parentClassVariableString = "parentClassVariableString";
public void testLambdas() {
// ----------- THESE WORK OK --------------
final Functional simpleLambdaWorks = text -> System.out.print(text);
final Functional methodReferenceWorks = System.out::print;
final Functional interfaceWithClassParamWorks = new Functional() {
@Override
public void doSomething(String text) {
System.out.print(text + " " + parentClassVariableString);
}
};
// -----------------------------------------
// ----------- THIS ONE CRASHES ------------
final Functional lambdaWithClassParamCrashes = text -> System.out.print(text + " " + parentClassVariableString);
// -----------------------------------------
simpleLambdaWorks.doSomething("Text from simpleLambdaWorks");
methodReferenceWorks.doSomething("Text from methodReferenceWorks");
interfaceWithClassParamWorks.doSomething("Text from interfaceWithClassParamWorks");
lambdaWithClassParamCrashes.doSomething("Text from lambdaWithClassParamCrashes");
}
private interface Functional {
void doSomething(String text);
}
}
崩溃日志:
08-21 00:27:41.564 25752-25752/debug E/AndroidRuntime: FATAL EXCEPTION: main
Process: debug, PID: 25752
java.lang.IncompatibleClassChangeError: The method 'void data.api.mapper.LambdaBugTest.data_api_mapper_LambdaBugTest_lambda$testLambdas$1(java.lang.String)' was expected to be of type direct but instead was found to be of type virtual (declaration of 'java.lang.reflect.ArtMethod' appears in /system/framework/core-libart.jar)
at data.api.mapper.LambdaBugTest.access$lambda$1(LambdaBugTest.java)
at data.api.mapper.LambdaBugTest$$Lambda$5.doSomething(Unknown)
at data.api.mapper.LambdaBugTest.testLambdas(LambdaBugTest.java:27)
at home.presentation.HomeActivity.onCreate(HomeActivity.java:47)
at android.app.Activity.performCreate(Activity.java:5990)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
谷歌不再支持安卓杰克 Jack不再受支持,您应该首先禁用Jack以使用默认工具链中内置的Java8支持 Android Studio 3.0及更高版本支持Lambdas表达式。配置build.gradle文件:
android {
...
// Configure only for each module that uses Java 8
// language features (either in its source code or
// through dependencies).
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
注意:如果Android Studio检测到您的项目正在使用Jack、Retrolambda或DexGuard,IDE将使用这些工具提供的Java 8支持。但是,考虑迁移到默认的工具链
您是否将retrolambda与jack编译器结合使用?两者是否应该一起使用?我认为jack编译器确实带来了Java8API支持(lambdas,以及retrolambda所做的一切)。我可能是错的,只是好奇你知道什么,如果这可能会导致你的问题在这里?我与杰克有相同的问题和例外信息,但我没有使用Retrolambda。Jack似乎不喜欢表达式lambdas带有实例变量赋值,比如
()->instanceVariable=localVariable
我也遇到了这个问题-不是使用Retro Lambda,而是使用Jack编译器