- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我对 build.gradle
中的常见设置非常熟悉
minSdkVersion 21
- 意味着 Android 设备至少需要 Android API 级别 21 或更高级别才能安装我的应用
(这应该尽可能低,以便在保留所有关键任务应用程序功能的同时达到最大数量的用户)
targetSdkVersion 26
- 表示我的应用程序是为这个版本的 Android API “设计”的,因此设备知道是否以兼容模式等运行。
(这应该尽可能高,并且开发人员可以随任何已弃用的 API 调用一起更新)
但是指定要使用的 JDK 版本的 sourceCompatibility
和 targetCompatibility
呢?我似乎收到相互矛盾的消息。
例如,当我查看 Android Studio 中的项目结构设置时,我似乎得到了使用 Android Studio 附带的默认 JDK - 1.8 版
的建议。
但是,当我阅读其他在线资源时,例如:
https://www.christopherprice.net/which-jdk-do-i-use-with-android-studio-3686.html
Which JDK version (Language Level) is required for Android Studio?
我似乎得到这样的消息:Android 主要运行在 1.7 版
上并且只支持 1.8 版
的一小部分 - 建议 1.7 版
才是合乎逻辑的选择。
问题 1)
我应该使用哪个版本才能最大程度地兼容新旧 Android 设备? 1.7 版
还是 1.8 版
? (这有关系吗?请参阅问题 #2)
问题 2)
是 sourceCompatibility
和 targetCompatibility
(和 JDK 版本)仅在从 .java
文件编译到 .class 期间使用的东西
文件?因此,在生成 java 字节码之后,无论版本是什么(version 1.7
vs version 1.8
)都不再重要了——因为字节码将是相同的并且可以互操作。
或者这是否会一直持续到最终用户(例如,如果他们的 Android 手机的 JVM 不知道如何读取 version 1.8
字节码,它就会崩溃)
问题 3)
如果我在设置 sourceCompatibility
和 targetCompatibility
时将 minSdkVersion
设置为非常低的值(例如 10
)会发生什么到非常高的东西(例如 version 1.8
)?
我可以盲目地依赖 Android Studio 来捕获所有可能的不兼容性吗?比如,如果它成功构建了一个 APK,我保证它会工作?
或者它仍然会构建并让 API >= 10
的用户安装它,但如果用户设备 JVM 无法运行 1.8 版
,它只会在运行时崩溃>?
最佳答案
在您的设备上运行代码之前,android 工具链会执行一些额外的步骤:
.java
-> .class
-> .class(脱糖)
-> .dex
这在此处描述:https://developer.android.com/studio/write/java8-support
脱糖步骤负责将您的现代字节码转换为适用于旧 VM 的代码。
脱糖使您的代码向后兼容的程度取决于 minSdkVersion
。如果您的项目组合了 sourceCompatibility
/targetCompatibility
和 minSdkVersion
是不可能的,编译器会告诉您。
这也适用于来自第 3 方库的字节码。错误看起来像这样:
Error: Static interface methods are only supported starting with Android N (--min-api 24): okhttp3.Request
(此特定问题来自使用 1.7 源代码与 okhttp3 4.0.1 的兼容性,并通过使用目标 1.8 消失)
关于java - sourceCompatibility 和 targetCompatibility 如何影响受支持设备的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52492459/
我想为 Java library 定义源 和目标兼容性这是用 Gradle 构建的。因此,我添加了以下 block as documented for the Java plugin . apply
我的机器上安装了 Java 6 和 7。 Gradle 使用 1.7(使用 gradle -v 检查)。但我需要编译我的代码以与 Java 1.6 兼容。据我了解的文档,我可以使用 sourceCom
sourceCompatibility 和 targetCompatibility 之间有什么关系/区别?当它们被设置为不同的值时会发生什么? 根据Gradle documentation : sou
我所知道的 我对 build.gradle 中的常见设置非常熟悉 minSdkVersion 21 - 意味着 Android 设备至少需要 Android API 级别 21 或更高级别才能安装我的
我安装了jdk1.8.0_112,在build.gradle中写了下面的代码 compileOptions { sourceCompatibility JavaVersion.VER
这个问题在这里已经有了答案: Java type inference: reference is ambiguous in Java 8, but not Java 7 (2 个答案) 关闭 7 年
我正在为具有的 android aar 库进行绑定(bind) compileOptions { sourceCompatibility JavaVersion.VERSION_1_8
我在 Android 应用上收到 java.lang.NoClassDefFoundError 错误。我设法将问题隔离到对 List::replaceAll 的调用。问题是该方法适用于 Java 8,
我正在尝试在 android 应用程序中使用 Java11 API,但未能使其编译。 失败的步骤: 使用当前版本的 Android Studio 4.1.2 - 生成虚拟项目“基本 Activity
我需要知道我在 gradle 项目中使用的所有依赖项的 Java 运行时兼容性(可以这么说,就好像它正在检查每个项目的“sourceCompatibility”设置),最好不要仔细阅读每个依赖项的文档
我找不到任何有关 Java 版本的信息可用于 Android Gradle 'sourceCompatibility' 的选择和“目标兼容性”。 我可以获得当前的Java JDK路径,例如:'C:/P
设置 sourceCompatibility和 targetCompatibility至 JavaVersion.VERSION_11在我的 IntelliJ/Grade/Java 项目中没有预期的效
我在gradle.properties中使用sourceCompatibility = 1.7,Gradle JVM(设置,Gradle,Intellij IDEA)是1.8.0_171并且 wrap
我们可以使用JDK 1.8编译器来编译sourceCompatibility选项设置为1.7的源代码吗? ModuleA 将此设置为 1.7,ModuleB 和 ModuleC 将此设置为 1.8。我
我想在控制台中看到 lint 错误,我想配置为只使用 java 7 而不是每个模块(我们有 12 个模块)。 我把它放到我的根 build.gradle 中: allprojects { ta
我正在尝试使用 gradle 为多模块 springBoot 应用程序设置一个新的存储库(用于构建脚本的 Kotlin DSL) 作为其中的一部分,我试图声明所有子项目所需的通用配置和依赖项。在这样做
按照 Cannot inline bytecode built with JVM target 1.8 into bytecode that is being built with JVM targe
我正尝试按照本教程为 Android 编译 Clojure:https://github.com/clojure-android/lein-droid/wiki/Tutorial 但是,我正在打一个
如 developer.android 网站所述 "The Jack toolchain is deprecated, as per this announcement. If your projec
我是一名优秀的程序员,十分优秀!