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

qfe3c7zg  于 2023-01-24  发布在  Android
关注(0)|答案(1)|浏览(176)

□ □ □我目前所知的
我非常熟悉build.gradle中的常见设置
minSdkVersion 21-表示Android设备至少需要具有Android API级别21或更高才能安装我的应用
(This值应尽可能低,以便达到最大用户数,同时保留所有使命关键型应用程序功能)
targetSdkVersion 26-表示我的应用是为此版本的Android API“设计”的,因此设备知道是否在兼容模式下运行,等等。
(This值应尽可能高,以便开发人员随任何弃用的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.7 vs version 1.8)都不再重要-因为字节码将是相同的且可互操作的。
或者,这会一直持续到最终用户(例如,如果他们的Android手机的JVM不知道如何读取version 1.8字节码,它就会崩溃)

问题3)

如果我将minSdkVersion设置为非常低的值(例如10),同时将sourceCompatibilitytargetCompatibility设置为非常高的值(例如version 1.8),会发生什么情况?
我可以盲目地依赖Android Studio来捕捉所有可能的不兼容吗?比如,如果它成功地构建了一个APK,我就能保证它能工作?
或者它仍然会构建并让使用API >= 10的用户安装它,但如果用户设备JVM不能运行version 1.8,它就会在运行时崩溃?

kmbjn2e3

kmbjn2e31#

Android工具链会在代码在您的设备上运行之前执行一些额外的步骤:
第一个月第一次-〉第一个月第一次-〉第一个月第二次-〉第一个月第三次
具体描述如下: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

(this特定问题来自于使用1.7源代码与okhttp 3 4.0.1的兼容性,使用目标1.8后问题消失)

相关问题