sourceCompatibility和targetCompatibility如何影响支持的设备数量?

时间:2018-09-25 07:07:14

标签: java android gradle

我所知道的

我对build.gradle

中的常见设置非常熟悉

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

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

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

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

我很困惑

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

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

enter image description here

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

我似乎得到这样的消息: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.7version 1.8)都不再重要-因为字节码将是相同且可互操作的。

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

问题3)

如果我将minSdkVersion10设置得很高(例如sourceCompatibility),而将targetCompatibility设置得很低(例如version 1.8),会发生什么? ?

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

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

1 个答案:

答案 0 :(得分:2)

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

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

此处描述:https://developer.android.com/studio/write/java8-support

删除地址的步骤负责将您的现代字节码转换为可在较旧VM上运行的代码。

消除重复性使代码向后兼容的方式取决于minSdkVersion。如果您的项目无法结合使用sourceCompatibility / targetCompatibilityminSdkVersion,则编译器会告诉您。

这也适用于来自第三方库的字节码。错误看起来像这样:

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

(此特定问题来自使用okhttp3 4.0.1的1.7源兼容性,而使用目标1.8消失了)