android - 如何在Android中处理不同的JAVA版本?

标签 android android-studio android-gradle-plugin android-studio-3.0

我正在测试 Android Studio 3.0 预览版和一些原生 java 8 功能(例如 lambda)

我有两个模块(app,mylibrary)

在我的应用 build.gradle 文件中,我包含了库模块。

implementation project(':mylibrary')

在 mylibrary build.gradle 文件中,我指定了 java 版本以测试 lambda 表达式。

compileOptions {
    android.compileOptions.sourceCompatibility 1.8
    android.compileOptions.targetCompatibility 1.8
}

在我将 android studio 从 canary 3 升级到 canary 5 之前,它对我来说工作正常,我的方法被打破了。

我收到以下动态错误消息

Information:Gradle tasks [:app:assembleDebug]
/Users/chchi/Documents/PayPal/Android/AS3.0Preview/app/src/main/java/com/example/chchi/myapplication/MainActivity.kt
Error:Error converting bytecode to dex:
Cause: invalid opcode ba (invokedynamic requires --min-sdk-version >= 26)
Error:com.android.dx.cf.code.SimException: invalid opcode ba (invokedynamic requires --min-sdk-version >= 26)
...
...
Error:  ... 5 more
Error:...at bytecode offset 00000016
Error:locals[0000]: Lcom/android/tools/fd/runtime/IncrementalChange;
Error:locals[0001]: <invalid>
Error:...while working on block 0016
Error:...while working on method testJava8feature:()V
Error:...while processing testJava8feature ()V
Error:...while processing com/example/mylibrary/LamdaTest.class
Error:Execution failed for task ':app:transformClassesWithDexBuilderForDebug'.
> com.android.build.api.transform.TransformException: com.android.builder.dexing.DexArchiveBuilderException: com.android.builder.dexing.DexArchiveBuilderException: Unable to convert input to dex archive.
Information:BUILD FAILED in 8s
Information:40 errors
Information:1 warning
Information:See complete output in console

在我按照说明将 minSdkVersion 更改为 26 之后。我收到有关转换为 dex 文件的以下错误。

Information:Gradle tasks [:app:assembleDebug]
Error:Error converting bytecode to dex:
Cause: Shouldn't happen
Error:com.android.dex.util.ExceptionWithContext: Shouldn't happen
Error:  at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
Error:  at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
Error:  at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
Error:  at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
...
Error:Caused by: com.android.dex.util.ExceptionWithContext: Shouldn't happen
Error:  at com.android.dex.util.ExceptionWithContext.withContext(ExceptionWithContext.java:45)
Error:  at com.android.dx.dex.file.MixedItemSection.placeItems(MixedItemSection.java:320)
Error:  at com.android.dx.dex.file.DexFile.toDex0(DexFile.java:611)
Error:  at com.android.dx.dex.file.DexFile.toDex(DexFile.java:242)
Error:  at com.android.builder.dexing.DxDexArchiveBuilder.lambda$processJobChunk$0(DxDexArchiveBuilder.java:118)
Error:  ... 5 more
Error:Caused by: java.lang.RuntimeException: Shouldn't happen
Error:  at com.android.dx.dex.file.ValueEncoder.constantToValueType(ValueEncoder.java:276)
Error:  at com.android.dx.dex.file.ValueEncoder.writeConstant(ValueEncoder.java:137)
Error:  at com.android.dx.dex.file.ValueEncoder.writeArray(ValueEncoder.java:310)
Error:  at com.android.dx.dex.file.CallSiteItem.place0(CallSiteItem.java:63)
Error:  at com.android.dx.dex.file.OffsettedItem.place(OffsettedItem.java:242)
Error:  at com.android.dx.dex.file.MixedItemSection.placeItems(MixedItemSection.java:311)
Error:  ... 8 more
Error:...while placing call site{method-handle{invoke-static,method{java.lang.invoke.LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;}}, string{"adder"}, proto{()Lcom/example/mylibrary/PayPalInterface;}, (II)V, method-handle{invoke-static,method{com.example.mylibrary.LamdaTest.lambda$testJava8feature$0:(II)V}}, (II)V}
Error:...while writing section 12
Error:Execution failed for task ':app:transformClassesWithDexBuilderForDebug'.
> com.android.build.api.transform.TransformException: com.android.builder.dexing.DexArchiveBuilderException: com.android.builder.dexing.DexArchiveBuilderException: Unable to convert input to dex archive.
Information:BUILD FAILED in 1s
Information:38 errors
Information:0 warnings
Information:See complete output in console

最终,我不得不将我所有的模块设置为 1.8(无需将 minSdkVersion 设置为 26),以便让编译器通过。有没有办法让我的库模块只使用 1.8 并且使用我的库的人仍然可以留在他们现在的位置(1.7)?

如果我只使用具有 high backward compatibility 的某些功能,那么我为什么要担心是否有人使用我的库目标为 1.8

最佳答案

这是新的 Android Gradle 插件的错误 - 我的库项目面临同样的问题。似乎 desugar - 将 Java 8 字节码转换为遗留字节码 - 不适用于库项目。

我已将问题报告给谷歌。希望它修复。 https://issuetracker.google.com/issues/63513242

关于android - 如何在Android中处理不同的JAVA版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44975949/

相关文章:

android - 新的gradle插件版本(4.1.0): no longer returning any ressource fields

Android从蓝牙数据中获取byteValue

android - 应为 BEGIN_ARRAY 但在第 1 行第 26 列路径 $.result 中为 STRING

java - Android 导入重叠

android - 无法从 sleep 模式唤醒 Android 模拟器

maven - 如何离线创建android studio项目?

android - 部署 Artifact : Failed to transfer file Return code is: 401 时出错

android - TextView 文本未更新

android-fragments - 将项目从 eclipse 迁移到 studio 时任务 ':app:transformClassesWithDexForDebug' 执行失败

android - 无法确定 com.google.android.gms :play-services-vision:18. 0.0 的 Artifact