compileSdkVersion和targetSdkVersion的区别是什么?

我已经看了文档用Gradle构建,但我仍然不确定compileSdkVersiontargetSdkVersion之间的区别是什么。

它只是说:

The `compileSdkVersion` property specifies the compilation target.

那么,“编译目标”是什么呢?

我认为有两种可能的解释:

  1. compileSdkVersion是构建应用程序时使用的编译器版本,而targetSdkVersion应用程序目标的API级别;。(如果是这种情况,我会假设compileSdkVersion必须大于或等于targetSdkVersion?
  2. 它们是同一个意思。“编译target"==“应用程序目标的API级别”;
  3. 别的吗?

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

284045 次浏览

compileSdkVersion

compileSdkVersion是编译应用程序的API版本。这意味着你可以使用该版本的API中包含的Android API特性(当然也包括之前的所有版本)。如果您尝试使用API 16特性,但将compileSdkVersion设置为15,则会得到编译错误。如果你将compileSdkVersion设置为16,你仍然可以在API 15设备上运行应用程序,只要你的应用程序的执行路径不试图调用任何特定于API 16的API。

targetSdkVersion

targetSdkVersion与你的应用程序如何编译或你可以利用什么api无关。targetSdkVersion应该表明你已经在你指定的版本上测试了你的应用程序。这更像是你给Android操作系统的一个认证或签名,提示它应该如何根据操作系统的功能来处理你的应用。

例如,的文档声明:

例如,将这个值设置为“11”或更高,允许系统在Android 3.0或更高版本上运行时应用一个新的默认主题(Holo)…

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

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

compileSdkVersion应该是最新的稳定版本。 targetSdkVersion应该经过充分测试,小于或等于compileSdkVersion.

The CompileSdkVersion是你的应用程序在开发过程中用于编译等的SDK平台的版本(你应该总是使用最新的),这是与你正在使用的API版本一起提供的

enter image description here

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

enter image description here

targetSdkVersion:包含了你的应用程序在开发过程到应用商店后的信息,允许它TARGET the SPECIFIED version of the Android platform。根据应用程序的功能,它可以针对低于当前的API版本。例如,即使当前版本是23,您也可以以API 18为目标。

好好看看这个官方谷歌# EYZ0。

# EYZ0

minSdkVersion <= targetSdkVersion <= compileSdkVersion

# EYZ0

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

# EYZ0

姗姗来迟。上面有几个很好的答案——本质上,compileSdkVersion是应用程序编译API的版本,而targetSdkVersion表示应用程序测试的版本。

我想补充以下几点:

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

  2. 随着每一个新的Android版本…

  • targetSdkVersion应该增加以匹配最新的API级别,然后在相应的平台版本上彻底测试应用程序
  • 另一方面,compileSdkVersion不需要更改,除非您要添加新平台版本特有的特性
  • 因此,虽然targetSdkVersion通常(最初)小于compileSdkVersion,但使用targetSdkVersion > compileSdkVersion维护良好/建立良好的应用程序并不罕见

我在之前的回答中看到了很多关于compiledSdkVersion的差异,所以我将在这里尝试澄清一点,跟随android的网页。

A - Android说什么

根据# EYZ0:

选择平台版本和API级别当你在开发 您的应用程序,您将需要选择平台版本 您将编译应用程序。一般情况下,您应该编译 您的应用程序针对平台的最低版本

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

# EYZ0

B -别人也这么说

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

代码中还会出现关于已弃用的用法的提示,让您知道在较新的API级别中某些东西已弃用,因此如果您愿意,可以做出相应的反应。

所以,根据其他人的说法,这是正确的顺序:

# EYZ0

怎么办呢?

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

如果您计划在运行时根据用户的API级别提供不同的API特性,请使用选项b。您将在编码时获得有关您使用的特性的提示。只要确保你没有在运行时检查用户API级别就不使用比minSdkVersion更新的API特性,否则你的应用程序会崩溃。这种方法还有一个好处,就是在编写代码的过程中学习新旧事物。

如果你已经知道什么是新的,什么是旧的,你正在开发一个一次性的应用程序,肯定永远不会更新,或者你确定你不会有条件地提供新的API功能,那么使用选项a。你不会被废弃的提示所困扰,你永远不能使用更新的API功能,即使你想这么做。

我的意见:针对任何版本的SDK进行编译,但要注意不要调用任何“最低SDK版本”不支持的api。这意味着您“可以”根据最新版本的SDK进行编译。

至于“目标版本”,它只是指你最初计划的目标版本,以及可能针对的测试版本。如果你还没有做尽职调查,那么这是一种通知Android在将你的“棒棒糖”目标应用部署到“奥利奥”之前需要执行一些额外检查的方法。

所以“目标版本”显然不能低于你的“最低SDK版本”,但不能高于你的“编译版本”。

不回答你的直接问题,因为已经有很多详细的答案,但值得一提的是,与Android文档相反,Android Studio建议使用相同版本的compileSDKVersiontargetSDKVersion

enter image description here

在Visual Studio 2017(15.8.5)中,Android项目属性的应用程序设置将它们组合在一起:

enter image description here

< em > compiledSdkVersion < / em >==>哪个版本的SDK应该编译你的代码字节码(它在开发环境中使用)要点:最好使用上一个版本的SDK。

< em > minSdkVersion < / em >==>这些项目用于APK的安装(它用于生产环境)。例如:

if(client-sdk-version   <   min-sdk-versoin )
client-can-not-install-apk;
else
client-can-install-apk;

快速总结:

对于minSDKversion,请参阅twitter handle: https://twitter.com/minSdkVersion的最新条目

TargetSDKversion:见最新的条目在twitter处理:https://twitter.com/targtSdkVersion 或者使用最新的API级别,如devel https://developer.android.com/guide/topics/manifest/uses-sdk-element.html

所示 < p >编译的版本: 使它与TargetSDKversion

相同 < p > maxSdkVersion: 来自Android的建议是不要设置这个,因为你不想限制你的应用不能在未来的Android版本上执行

targetSdkVersion和compileSdkVersion

targetSdkVersion是一个用来切换操作系统某些特定变化的版本。这意味着你知道你在做什么,并且经过了测试

compileSdkVersion -这是SDK平台版本,说明使用哪个Android SDK进行编译。这就是为什么在调试过程中你会看到这个版本的系统库版本

[阅读更多] .