sourceCompatibility和targetCompatibility对受支持设备的数量有何影响?

Ala*_*ACK 7 java android gradle

我知道的

我对常见的设置非常熟悉 build.gradle

minSdkVersion 21 -表示Android设备至少需要具有Android API级别21或更高级别才能安装我的应用

(此值应尽可能低,以便在保留所有关键任务应用功能的同时达到最大用户数)

targetSdkVersion 26 -表示我的应用是为此版本的Android API“设计”的,因此设备知道是否以兼容模式运行,等等。

(此值应尽可能高,以便开发人员随任何不赞成使用的API调用一起进行更新)

我很困惑

但是sourceCompatibilitytargetCompatibility那又指定了要使用的JDK版本呢?我似乎收到冲突的消息。

例如,当我查看Android Studio中的项目结构设置时,似乎正在获得使用Android Studio-附带的默认JDK的建议version 1.8

在此处输入图片说明

但是,当我阅读其他在线资源时,例如:

我似乎得到了这样的消息,即Android主要在其上运行,version 1.7并且仅支持其中的一小部分version 1.8-这表明这version 1.7是合乎逻辑的选择。

摘要

问题1)

我应该使用哪个版本与新旧Android设备最大程度地兼容?version 1.7还是version 1.8?(这有关系吗?请参阅问题2)

问题2)

sourceCompatibilitytargetCompatibility(和JDK版本)的东西,在编译期间仅用于从.java文件到.class文件?因此,在生成Java字节码之后,无论哪个版本(version 1.7vs version 1.8)都不再重要-因为字节码将是相同且可互操作的。

还是这将一直持续到最终用户(例如,如果他们的Android手机的JVM不知道如何读取version 1.8字节码,它将被炸毁)

问题3)

如果我设置会发生什么minSdkVersion的东西非常低(例如10)在设置sourceCompatibilitytargetCompatibility为非常高(例如version 1.8)?

我可以盲目依赖Android Studio来捕获所有可能的不兼容性吗?在这种情况下,如果它成功构建了APK,我保证它会工作吗?

还是会继续构建并让用户API >= 10安装它,但是如果用户设备JVM无法运行,它将在运行时爆炸version 1.8

Mar*_*ten 6

在代码在您的设备上运行之前,android 工具链会执行一些额外的步骤:

.java-> .class-> .class (desugared)->.dex

这在这里描述:https : //developer.android.com/studio/write/java8-support

脱糖步骤负责将您的现代字节码转换为适用于旧 VM 的内容。

脱糖使您的代码向后兼容的程度取决于minSdkVersion. 如果您的项目组合了sourceCompatibility/targetCompatibilityminSdkVersion这是不可能的,编译器会告诉您。

这也适用于来自 3rd 方库的字节码。错误如下所示:

Error: Static interface methods are only supported starting with Android N (--min-api 24): okhttp3.Request
Run Code Online (Sandbox Code Playgroud)

(这个特定问题来自使用 1.7 源代码与 okhttp3 4.0.1 的兼容性,并通过使用目标 1.8 消失)