您的构建Gradle脚本中的Minsdk,Targetsdk和CompilesDK有什么区别?
让我们看一下minSdk
,targetSdk
和compileSdk
在 build.gradle.gradle 脚本中的真正含义。
android {
compileSdk 32
defaultConfig {
/*...*/
minSdk 21
targetSdk 32
/*...*/
}
}
-
minsdk - 应用程序运行所需的最小API级别是多少?
-
targetsdk - 该应用程序在哪个API级别设计和测试?
-
compilesdk - Gradle使用哪个API级别编译您的应用?
Minsdk
如果您的minSdk
设置为21
,则无法在API级别21的任何Android版本上运行您的应用程序。如果Android版本(API级别20)尝试安装您的应用程序,则会遇到此错误。
安装没有成功。无法安装该应用程序:install_failed_older_sdk
如果手机的Android版本不符合应用程序的minSdk
要求,则Google Play商店也可以防止用户安装应用程序。
Targetsdk
应用程序在API级别> TargetsDK上运行
如果该应用程序是在高于targetSdk
的Android版本(API级别)上运行的,则Android操作系统将尝试向后兼容行为,以匹配 targetSdk
api级别中的行为。
例如,在API级别23中介绍了运行时应用权限。在API级别23之前,不需要运行时应用程序权限。
如果您的targetSdk
设置为22
,并且您的应用程序在Android版本(API级别23)上运行,则Android OS将尝试像API级别22中的行为相匹配。因此,不请求运行时许可。
如果您的targetSdk
设置为23
,并且您的应用程序在Android版本(API级别23或更高)上运行,则请求运行时许可。
应用在API级别
在<targetSdk
的Android版本(API级别)上运行的应用程序呢?该应用基于该Android版本(API级别)的行为。
如果您的targetSdk
设置为23
,并且您的应用程序在Android版本(API级别22)上运行,则不要求运行时许可。
您可以尝试使用此演示应用程序,该应用程序请求运行时许可:
compilesdk
如果您的应用使用API级别26中引入的API,则必须将compileSdk
设置为最小26
。如果将其设置为25
,则无法编译。
假设minSdk
是21
,您可能会收到此警告/错误
呼叫需要API级别26(当前最小值为21):android.app.NotificationChannel()
根据Android Studio IDE的建议,您可以通过用
注释函数来修复警告/错误
@RequiresApi(Build.VERSION_CODES.O)
private fun yourFunction() {
/*...*/
}
但是,如果您在Android版本上运行应用程序(添加 @RequiresApi()
是一种不好的做法。
您应该做的是处理API级别下方的应用程序上方的代码。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
/* Code for API level >= 26 */
} else {
/* code for API level >= 23 and < 26) */
}
一个示例是通知频道仅需要 /可用于API级别26。然后,我们应该用Build.VERSION_CODES.O
包装。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val notificationChannel = NotificationChannel(
notificationChannelId,
"DemoWorker",
NotificationManager.IMPORTANCE_DEFAULT,
)
val notificationManager: NotificationManager? =
getSystemService(applicationContext, NotificationManager::class.java)
notificationManager?.createNotificationChannel(notificationChannel)
}
此代码来自下面的工作经理演示应用程序:
[更新 - 2022年9月16日]:我发现使用Build.VERSION_CODES.O
根本不可读取。它没有带来任何含义,因为其他任何地方(例如来自Android Studio,build.gradle
的警告消息)都使用该数字(即26)。我不知道O
代表26
,我无法记住它。相反,我更喜欢使用硬编码的值26
!
if (Build.VERSION.SDK_INT >= 26) {
/* Code for API level >= 26 */
} else {
/* code for API level >= 23 and < 26) */
}
[更新 - 2023年1月20日]:我仍然发现硬编码值26不是很可读。因此,我最近创建了这个 buildutils android库,以使其更可读。
if (BuildExt.VERSION.isNotificationChannelSupported()) {
// Create notification channel here
}
结论
通常,
minSdk
<targetSdk
<= compileSdk
,但理想情况下,
minSdk
<targetSdk
== compileSdk
==最新的SDK版本
不要使用@RequiresApi()
并在代码中处理不同的API版本的行为。
最初出版于https://vtsen.hashnode.dev 。
在<targetSdk
的Android版本(API级别)上运行的应用程序呢?该应用基于该Android版本(API级别)的行为。
如果您的targetSdk
设置为23
,并且您的应用程序在Android版本(API级别22)上运行,则不要求运行时许可。
您可以尝试使用此演示应用程序,该应用程序请求运行时许可:
compilesdk
如果您的应用使用API级别26中引入的API,则必须将compileSdk
设置为最小26
。如果将其设置为25
,则无法编译。
假设minSdk
是21
,您可能会收到此警告/错误
呼叫需要API级别26(当前最小值为21):
android.app.NotificationChannel()
根据Android Studio IDE的建议,您可以通过用
注释函数来修复警告/错误
@RequiresApi(Build.VERSION_CODES.O)
private fun yourFunction() {
/*...*/
}
但是,如果您在Android版本上运行应用程序(@RequiresApi()
是一种不好的做法。
您应该做的是处理API级别下方的应用程序上方的代码。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
/* Code for API level >= 26 */
} else {
/* code for API level >= 23 and < 26) */
}
一个示例是通知频道仅需要 /可用于API级别26。然后,我们应该用Build.VERSION_CODES.O
包装。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val notificationChannel = NotificationChannel(
notificationChannelId,
"DemoWorker",
NotificationManager.IMPORTANCE_DEFAULT,
)
val notificationManager: NotificationManager? =
getSystemService(applicationContext, NotificationManager::class.java)
notificationManager?.createNotificationChannel(notificationChannel)
}
此代码来自下面的工作经理演示应用程序:
[更新 - 2022年9月16日]:我发现使用
Build.VERSION_CODES.O
根本不可读取。它没有带来任何含义,因为其他任何地方(例如来自Android Studio,build.gradle
的警告消息)都使用该数字(即26)。我不知道O
代表26
,我无法记住它。相反,我更喜欢使用硬编码的值26
!
if (Build.VERSION.SDK_INT >= 26) {
/* Code for API level >= 26 */
} else {
/* code for API level >= 23 and < 26) */
}
[更新 - 2023年1月20日]:我仍然发现硬编码值26不是很可读。因此,我最近创建了这个 buildutils android库,以使其更可读。
if (BuildExt.VERSION.isNotificationChannelSupported()) {
// Create notification channel here
}
结论
通常,
minSdk
<targetSdk
<=compileSdk
,但理想情况下,
minSdk
<targetSdk
==compileSdk
==最新的SDK版本
不要使用@RequiresApi()
并在代码中处理不同的API版本的行为。
最初出版于https://vtsen.hashnode.dev 。