源兼容性和目标兼容性如何影响受支持设备的数量?我所知道的我感到困惑的是总结

2022-09-01 13:26:16

我所知道的

我非常熟悉在build.gradle

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

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

targetSdkVersion 26- 意味着我的应用程序是针对此版本的Android API“设计”的,以便设备知道是否在兼容模式下运行等。

(这应该尽可能高,并且开发人员可以与任何已弃用的API调用一起更新)

我感到困惑的是

但是,指定要使用的JDK版本呢?我似乎收到了相互矛盾的信息。sourceCompatibilitytargetCompatibility

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

enter image description here

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

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

总结

问题 1)

我应该使用哪个版本才能与新旧Android设备的最大兼容性? 或?(这重要吗?请参阅问题 #2)version 1.7version 1.8

问题 2)

和(和 JDK 版本)是否仅在从文件到文件的编译过程中使用?因此,在生成java字节代码之后,无论版本(vs)都不再重要 - 因为字节代码将是相同的并且无论如何都可以互操作。sourceCompatibilitytargetCompatibility.java.classversion 1.7version 1.8

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

问题 3)

如果我在设置时设置为非常低(例如)的东西和非常高的东西(例如)会发生什么?minSdkVersion10sourceCompatibilitytargetCompatibilityversion 1.8

我可以盲目地依靠Android Studio来捕捉所有可能的不兼容性吗?例如,如果它成功构建了APK,我可以保证它会起作用吗?

或者它仍然会构建并让用户安装它,但如果用户设备JVM无法运行,它将在运行时爆炸?API >= 10version 1.8


答案 1

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

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

如下所述:https://developer.android.com/studio/write/java8-support

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

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

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

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

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


答案 2

推荐