在 Android 开发中,compileSdkVersion
、buildToolsVersion
、targetSdkVersion
和 minSdkVersion
是构建配置中非常重要的四个参数,它们分别控制了不同的编译、构建和运行时行为。下面是它们的区别和作用:
1. compileSdkVersion
- 作用:指定你编译应用时使用的 Android API 的版本。
- 解释:
compileSdkVersion
决定了你在开发过程中可以访问的 API 和功能。它是指编译时所使用的 Android SDK 版本。 - 使用场景:你需要在应用开发过程中使用 Android SDK 的特性或类时,确保
compileSdkVersion
与所需功能的 API 版本一致。通常,建议使用最新的compileSdkVersion
,以便使用最新的 Android 功能和改进。 - 示例:如果你的
compileSdkVersion
设置为33
,则你可以使用 Android 13 (API 33) 中的所有新特性和 API。
android {
compileSdkVersion 33 // 使用 Android 13 (API 33) SDK 进行编译
}
2. buildToolsVersion
- 作用:指定 Android 构建工具的版本。
- 解释:
buildToolsVersion
决定了用于构建 APK 的工具版本,如aapt
、dx
、zipalign
等。它控制编译时使用的工具链,负责将 Java 代码和资源打包成 APK 文件。 - 使用场景:在某些情况下,不同版本的构建工具可能会有不同的功能或修复。如果你的项目依赖于特定版本的构建工具,或者你的构建失败时出现构建工具相关的问题,可能需要指定某个版本。
- 注意:从 Android Gradle Plugin 4.0 版本开始,
buildToolsVersion
不再强制设置,Gradle 会自动选择适合的构建工具版本。通常情况下,如果没有特殊需求,你可以省略它。
android {
buildToolsVersion "30.0.3" // 指定构建工具的版本(如果需要)
}
3. targetSdkVersion
- 作用:指定应用的目标 Android 版本。
- 解释:
targetSdkVersion
用来告诉系统你的应用是为哪个 Android 版本优化的。当 Android 系统发布新版本时,系统会引入一些行为变化和特性改进,targetSdkVersion
告诉系统应用的目标版本,这样系统会根据该版本提供合适的兼容性行为。 - 使用场景:你应该将
targetSdkVersion
设置为你希望应用在其上表现最佳的 Android 版本。如果你不设置,系统会默认使用当前的compileSdkVersion
。 - 注意:将
targetSdkVersion
设置为较高版本意味着你的应用已经准备好处理该版本的所有行为变化。如果你的应用没有针对新版本做兼容性测试,可能会遇到一些问题。
android {
targetSdkVersion 33 // 目标 Android 版本
}
4. minSdkVersion
- 作用:指定应用支持的最小 Android 版本。
- 解释:
minSdkVersion
定义了你的应用可以在最低版本的 Android 系统上运行的条件。它决定了你应用所需的最低 Android 版本。如果用户的设备的 Android 版本低于minSdkVersion
,则无法安装你的应用。 - 使用场景:设置
minSdkVersion
时,你需要考虑应用的功能要求和市场上的设备分布。如果你要支持老旧的设备,minSdkVersion
应该设置较低,但这可能会限制你能使用的 API 和特性。 - 注意:如果你将
minSdkVersion
设置为较高版本,应用的受众将会减少,但你可以使用更多新的 Android 特性。
android {
minSdkVersion 21 // 支持最低 Android 5.0(API 21)
}
疑问
1、当 targetSdkVersion > 设备的 SDK 版本时的情况
当设备的 Android 版本低于你的 targetSdkVersion
时,系统会采用设备的 Android 版本行为,而不是强制应用遵循 targetSdkVersion
的新行为。例如,如果你将 targetSdkVersion
设置为 Android 12(API 级别 31),但是设备的 Android 版本是 Android 10(API 级别 29),那么即使 targetSdkVersion
是 31,系统仍然会根据设备的 Android 10 行为来运行应用,而不是 Android 12 的行为。
但是如果 targetSdk 中有一些新特性代码,在低设备手机上运行可能会发生异常,此时需要代码中进行设备 SDK 版本的判断来决定执行哪些代码
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
// 设备运行的是 Android 12(API 级别 31)或更高版本
// 执行适用于 Android 12 或更高版本的代码
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
// 设备运行的是 Android 11(API 级别 30)或更高版本
// 执行适用于 Android 11 或更高版本的代码
} else {
// 设备运行的是低于 Android 11 的版本
// 执行适用于较低版本 Android 的代码
}
2、当 targetSdkVersion < 设备的 SDK 版本时的情况
遵循 targetSdk 版本行为,不会启用 设备 sdk 中的新特性
总结
配置项 | 作用 | 说明 |
---|---|---|
compileSdkVersion | 编译时使用的 Android API 版本。 | 用来编译应用并决定你可以访问的 Android API 级别。 |
buildToolsVersion | 构建工具的版本,决定了使用的编译工具版本。 | 负责 APK 构建过程的工具链,通常可以省略,由 Gradle 自动选择。 |
targetSdkVersion | 应用优化的目标 Android API 版本。 | 告诉系统应用优化的 Android 版本,决定应用如何适应新版本的 Android 行为变化。 |
minSdkVersion | 应用支持的最小 Android API 版本。 | 决定应用可以在哪些版本的 Android 上安装和运行。 |
这些配置项之间的关系:
compileSdkVersion
和targetSdkVersion
通常应该设置为相同或较高的版本。minSdkVersion
决定了应用支持的设备范围,但不能低于compileSdkVersion
。buildToolsVersion
通常不需要显式指定,除非有特殊需求。
通过合理设置这些参数,你可以确保应用在不同设备和不同版本的 Android 系统中运行良好。