1. SDK 配置
Android 配置时有3个SDK 版本需要指定:
-
compileSdk 指定编译apk时使用的sdk,决定了开发时所能调用的API特性
-
minSdk 指定向下兼容的最小sdk版本。低于此版本的安卓设备尝试安装你的软件时将会失败,显示不兼容或无法安装
-
targetSdk a. 声明开发者测试过的目标设备sdk。b. 软件运行时的行为保持一致。当软件运行在比targetSdk版本更新的设备上时系统会尽量提供兼容一致的用户体验
(1)强制性规则
minSdk <= 开发者能使用的API <= compileSdk
试图使用大于compileSdk版本的API将会导致编译报错
(2)推荐配置
- compileSdk 选择最新,targetSdk选择开发者仔细测试过的最高sdk。一般来说,当Google发布新的sdk时,项目可以更新compileSdk, 在测试过新sdk后再提高targetSdk。官方文档中提出targetSdk 必须 <= compileSdk。显然如果targetSdk > compileSdk的话,意味着开发者声明软件的目标是高版本sdk设备,但却是用低版本sdk编译的,不合理。(但是即使这么写,编译一般还是能通过的)
2. Gradle JDK 配置
当SDK配置好后,能使用的Java API 便被限制性确定了。开发者需要做的是尽可能增强向下兼容性。此处配置默认Android Studio 和Gradle是目前新版,JDK讨论长期支持版(8,11,17,21)。
(1)JDK的选择
截至目前,Android 14(API34) 及以上支持Java 17 的一些API
此外,最新版AGP(Android Gradle Plugin) 8.x 要求JDK>=17 因此新项目一般JDK 至少17
具体可用JDK 版本可对照Gradle Java Support Table 以及 AGP 和Gradle版本关系表AGP Gradle Support Table 查看。若您使用最新版AGP,则可选择JDK17 或21
(2)兼容性
sourceCompatibility 限定源码最高可使用的Java语言特性,例如lambda, var等。例如设定了Java8语法,则源码中无法使用更新的语法。主要影响开发效率。
targetCompatibility 则指定生成的.class字节码文件的版本。安卓R8 D8 编译器会对.class 优化生成.dex
新版8.x AGP 默认支持Java 8 的lambda 等语言特性,即使老版本安卓设备内的ART(Android Runtime)不支持,AGP也会自动Desugar,在编译时将语法糖改写为所有设备兼容的字节码。因此,最低兼容性配置为 Java 8,没有必要设置更低。
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
此外,Android 还有Java 8 , 11 的API 的额外支持,详见 Java 8, 11 Desugar
通过添加额外的库,可以使用Java 8 的Stream以及Java 11 的一些API 而无需担心向下兼容。编译时会自动添加额外的Java库到apk中,通过给软件打补丁,使其与旧设备兼容。
android {
defaultConfig {
// Required when setting minSdkVersion to 20 or lower
multiDexEnabled = true
}
compileOptions {
// Flag to enable support for the new language APIs
// For AGP 4.1+
isCoreLibraryDesugaringEnabled = true
// For AGP 4.0
// coreLibraryDesugaringEnabled = true
// Sets Java compatibility to Java 8
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
}
dependencies {
// For AGP 7.4+
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.5")
// For AGP 7.3
// coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.2.3")
// For AGP 4.0 to 7.2
// coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.1.9")
}
JDK配置总结:
- 最保守的写法是兼容Java 8, (如果要用stream等额外的API,添加desugar 库)。
- 在添加了desugar 库的前提下,兼容Java 11 比较稳定。
- 如果想要利用新版安卓的Java 17 API支持,选择兼容 Java 17, 则需要格外注意minSdk不兼容的Java 17 API,因为desugar 库目前似乎并不支持Java 17。
具体情况请详细参考资料中引用的官方文档,最好利用Android Studio虚拟机全面测试。安卓兼容性问题比较复杂,开发效率和适配性的平衡是关键。
参考资料
Use Java 8 language features and APIs | Android Studio | Android Developers
Java 11+ APIs available through desugaring | Android Studio | Android Developers
Which Java APIs can I use in my Java or Kotlin source code? | Android Developers