compileSdkVersion和targetSdkVersion有什么区别?

我已经看过用Gradle编译的文档 ,但是我仍然不确定compileSdkVersiontargetSdkVersion之间有什么区别。

它所说的是:

compileSdkVersion属性指定编译目标。

那么,“汇编目标”是什么?

我看到两种可能的解释方法:

  1. compileSdkVersion是构build应用程序时使用的编译器的版本,而targetSdkVersion是“应用程序所针对的API级别” 。 (如果是这样的话,我会认为compileSdkVersion必须大于或等于targetSdkVersion
  2. 他们的意思是一样的。 “编译目标”==“应用程序所针对的API级别”
  3. 别的东西?

我看到这个问题之前已经被问过了,但是一个答案只是引用了文档,这是我不清楚的。

compileSdkVersion

compileSdkVersion是应用程序编译的API版本。 这意味着您可以使用该版本的API中包含的Android APIfunction(以及所有以前的版本,显然)。 如果您尝试使用API​​ 16function,但将compileSdkVersion设置为15,则会出现编译错误。 如果将compileSdkVersion设置为16,则只要应用程序的执行path不会尝试调用特定于API 16的任何API,仍然可以在API 15设备上运行该应用程序。

targetSdkVersion

targetSdkVersion与您的应用程序如何编译或可以使用哪些API无关。 targetSdkVersion应该表示您已经testing了您的应用程序(可能包括您所指定的版本)。 这更像是一个authentication或签署你给Android操作系统作为一个提示,它应该如何处理你的应用程序的操作系统function。

例如,正如文档所述:

例如,如果将此值设置为“11”或更高,则允许系统在Android 3.0或更高版本上运行时将新的默认主题(Holo)应用于您的应用程序。

Android OS 在运行时可能会根据此值更改应用程序的风格化或以其他方式在OS上下文中执行。 还有一些其他已知的例子受到这个值的影响,这个列表可能只会随着时间的推移而增加。

实际上,大多数应用程序都希望将targetSdkVersion设置为最新的API版本。 这将确保您的应用在最新的Android设备上看起来尽可能好。 如果您不指定targetSdkVersion ,则默认为minSdkVersion

作为一个在线指南:

 minSdkVersion <= targetSdkVersion <= compileSdkVersion 

理想的情况是:

 minSdkVersion (lowest possible) <= targetSdkVersion == compileSdkVersion (latest SDK) 

伊恩·莱克(Ian Lake)从这篇伟大的文章中了解更多

compileSdkVersion应该是最新的稳定版本。 targetSdkVersion应该被完全testing,并且小于或者等于compileSdkVersion

The CompileSdkVersion是您的应用程序用于编译等的SDK平台的版本。在开发过程中(您应该始终使用最新版本)这是随您使用的API版本

在这里输入图像描述

你会在你的build.gradle文件中看到这个:

在这里输入图像描述

targetSdkVersion:包含您的应用程序在应用程序商店的开发过程之后发布的信息,该信息允许其TARGET the SPECIFIED version of the Android platform 。 根据您的应用程序的function,它可以定位低于当前版本的API版本。例如,即使当前版本是23,也可以定位API 18。

仔细看看这个官方的Google 页面 。

最后,有几个很好的答案 – 基本上, compiledVersion是应用程序编译的API版本,而targetSdkVersion表示应用程序testing的版本。

我想补充以下注意事项的答案:

  1. targetSdkVersion影响请求权限的方式 :

    • 如果设备运行的是Android 6.0(API级别23)或更高版本, 并且该应用的targetSdkVersion为23或更高,则该应用会在运行时向用户请求权限。
    • 如果设备运行的是Android 5.1(API级别22) 更低,或者应用程序的targetSdkVersion是22或更低,则系统要求用户在用户安装应用程序时授予权限。
  2. 如果compiledVersion高于您的应用程序的targetSdkVersion声明的版本,系统可能会启用兼容性行为,以确保您的应用程序继续以您期望的方式工作。 ( ref )

  3. 随着每个新的Android版本…

    • targetSdkVersion应该递增以匹配最新的API级别,然后在相应的平台版本上彻底testing您的应用程序
    • 另一方面, compiledVersion不需要改变,除非你添加新的平台版本独有的function
    • 因此,尽pipetargetSdkVersion通常(最初)小于compiledVersion ,但通过targetSdkVersion > compiledVersion可以看到一个维护良好的/已build立的应用程序并不罕见

在以前的答案中,我看到了许多关于compiledSdkVersion的差异,所以我会在Android的网页上尝试澄清一下。

A – Android说的

根据https://developer.android.com/guide/topics/manifest/uses-sdk-element.html

select平台版本和API级别在开发应用程序时,您需要select要编译应用程序的平台版本。 通常,您应该针对应用程序可以支持的最低版本的平台编译应用程序。

所以,这将是根据Android的正确的顺序:

compiledSdkVersion = minSdkVersion <= targetSdkVersion

B – 别人也说什么

有些人更喜欢总是使用可用的最高编译的SkdVersion。 这是因为他们将依靠代码提示来检查他们是否使用了比minSdkVersion更新的API特性,因此要么将代码更改为不使用它们,要么在运行时检查用户API版本,以有条件地使用旧版API的回退。

代码中还会显示有关不推荐使用的提示,让您知道在较新的API级别中已弃用某些内容,因此,如果您愿意,可以作出相应的反应。

所以,这将是正确的顺序:

minSdkVersion <= targetSdkVersion <= compiledSdkVersion (highest possible)

该怎么办?

这取决于你和你的应用程序。

如果您计划在运行时根据用户的API级别提供不同的APIfunction,请使用选项B.您将获得有关在编码时使用的function的提示。 只要确保从不使用比minSdkVersion更新的APIfunction,而不必在运行时检查用户API级别,否则您的应用程序将崩溃。 这种方法也有利于学习什么是新的,什么是旧的,而编码。

如果您已经知道新旧版本,并且您正在开发一次性应用程序(肯定不会更新),或者您确定不会有条件地提供新的APIfunction,那么请使用选项A.您不会感到困扰不build议使用提示,即使您想要这样做,您也将永远无法使用更新的APIfunction。