【问题标题】:How does sourceCompatibility and targetCompatibility impact number of supported devices?sourceCompatibility 和 targetCompatibility 如何影响受支持设备的数量?
【发布时间】:2019-02-28 17:45:49
【问题描述】:

我知道的

我对@9​​87654326@中的常见设置非常熟悉

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

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

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

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

我对什么感到困惑

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

例如,当我在 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.7version 1.8)都不再重要——因为无论如何字节码都是相同的且可互操作的。

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

问题 3)

如果我将minSdkVersion 设置为非常低的值(例如10),同时将sourceCompatibilitytargetCompatibility 设置为非常高的值(例如version 1.8),会发生什么?

我可以盲目地依赖 Android Studio 来捕获所有可能的不兼容问题吗?比如,如果它成功构建了一个 APK,我保证它会工作吗?

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

【问题讨论】:

标签: java android gradle


【解决方案1】:

在代码在您的设备上运行之前,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

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

【讨论】:

    猜你喜欢
    • 2013-05-15
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 2017-04-01
    相关资源
    最近更新 更多