我对build.gradle
minSdkVersion 21
-表示Android设备至少需要具有Android API级别21或更高版本才能安装我的应用
(此值应尽可能低,以便在保留所有关键任务应用程序功能的同时达到最大用户数)
targetSdkVersion 26
-表示我的应用是为此版本的Android API设计的,因此设备知道是否以兼容模式运行。
(此值应尽可能高,以便开发人员随任何不赞成使用的API调用一起进行更新)
但是指定要使用的JDK版本的sourceCompatibility
和targetCompatibility
呢?我似乎收到了冲突的消息。
例如,当我查看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
与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
,它将只会在运行时爆炸?
答案 0 :(得分:2)
在您的设备上运行代码之前,android工具链会执行一些额外的步骤:
.java
-> .class
-> .class (desugared)
-> .dex
此处描述:https://developer.android.com/studio/write/java8-support
删除地址的步骤负责将您的现代字节码转换为可在较旧VM上运行的代码。
消除重复性使代码向后兼容的方式取决于minSdkVersion
。如果您的项目无法结合使用sourceCompatibility
/ targetCompatibility
和minSdkVersion
,则编译器会告诉您。
这也适用于来自第三方库的字节码。错误看起来像这样:
Error: Static interface methods are only supported starting with Android N (--min-api 24): okhttp3.Request
(此特定问题来自使用okhttp3 4.0.1的1.7源兼容性,而使用目标1.8消失了)