Minsdk vs Targetsdk vs CompilesDK
#初学者 #android #gradle

您的构建Gradle脚本中的Minsdk,Targetsdk和CompilesDK有什么区别?

让我们看一下minSdktargetSdkcompileSdk 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,则无法编译。

假设minSdk21,您可能会收到此警告/错误

呼叫需要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