□ □ □我目前所知的
我非常熟悉build.gradle
中的常见设置minSdkVersion 21
-表示Android设备至少需要具有Android API级别21或更高才能安装我的应用
(This值应尽可能低,以便达到最大用户数,同时保留所有使命关键型应用程序功能)targetSdkVersion 26
-表示我的应用是为此版本的Android API“设计”的,因此设备知道是否在兼容模式下运行,等等。
(This值应尽可能高,以便开发人员随任何弃用的API调用沿着更新)
∮ ∮我困惑的是
但是sourceCompatibility
和targetCompatibility
指定了要使用的JDK版本,我似乎收到了相互冲突的消息。
例如,当我查看Android Studio中的项目结构设置时,似乎得到了使用Android Studio附带的默认JDK-version 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主要运行在version 1.7
上,只支持version 1.8
的一小部分-这表明version 1.7
是合乎逻辑的选择。
我的疑问
问题1)
我应该使用哪个版本来最大限度地兼容新老Android设备?version 1.7
还是version 1.8
?(这有关系吗?请参考问题2)
问题2)
sourceCompatibility
和targetCompatibility
(以及JDK版本)是否仅在从.java
文件编译为.class
文件时使用?因此,在生成java字节码后,无论版本如何(version 1.7
vs version 1.8
)都不再重要-因为字节码将是相同的且可互操作的。
或者,这会一直持续到最终用户(例如,如果他们的Android手机的JVM不知道如何读取version 1.8
字节码,它就会崩溃)
问题3)
如果我将minSdkVersion
设置为非常低的值(例如10
),同时将sourceCompatibility
和targetCompatibility
设置为非常高的值(例如version 1.8
),会发生什么情况?
我可以盲目地依赖Android Studio来捕捉所有可能的不兼容吗?比如,如果它成功地构建了一个APK,我就能保证它能工作?
或者它仍然会构建并让使用API >= 10
的用户安装它,但如果用户设备JVM不能运行version 1.8
,它就会在运行时崩溃?
1条答案
按热度按时间kmbjn2e31#
Android工具链会在代码在您的设备上运行之前执行一些额外的步骤:
第一个月第一次-〉第一个月第一次-〉第一个月第二次-〉第一个月第三次
具体描述如下:https://developer.android.com/studio/write/java8-support
去糖步骤负责将您的现代字节码转换为在旧VM上工作的内容。
反糖使你的代码向后兼容的程度取决于
minSdkVersion
。如果你的项目不可能组合sourceCompatibility
/targetCompatibility
和minSdkVersion
,编译器会告诉你。这也适用于来自第三方库的字节码。错误如下所示:
(this特定问题来自于使用1.7源代码与okhttp 3 4.0.1的兼容性,使用目标1.8后问题消失)