compileSdkVersion和targetSdkVersion有什么区别?


525

我看过使用Gradle进行构建的文档,但是我仍然不确定compileSdkVersion和之间的区别targetSdkVersion

它只说:

compileSdkVersion属性指定编译目标。

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

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

  1. compileSdkVersion是用于构建应用程序的编译器版本,targetSdkVersion而是“应用程序定位的API级别”。(如果是这种情况,我认为compileSdkVersion必须大于或等于targetSdkVersion??
  2. 他们是同一回事。“编译目标” ==“应用程序目标的API级别”
  3. 还有吗

我看到这个问题以前曾有人问过,但一个答案只是引用了doc,这对我来说还不清楚。



2
targetSdkVersion是您的设备正在运行的。因此,如果您的设备运行速度低于Oreo,则不要定位
27。– IgorGanapolsky,

Answers:


546

编译器

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

targetSdkVersion

targetSdkVersion没有任何与您如何您的应用程序被编译或什么的API使用。本targetSdkVersion应该表明您已经测试您的应用程序上(大概直至并包括)指定的版本。这更像是认证或注销,您是在向Android操作系统提示如何在操作系统功能方面处理您的应用。

例如,如文档所述:

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

Android OS 在运行时可能会基于此值更改您的应用程式的样式化或在OS的上下文中执行的方式。还有其他一些受此值影响的已知示例,并且该列表可能只会随时间增加。

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


14
不,targetSdkVersion很可能会高于compileSdkVersion合理的水平。举例来说,这意味着尽管您设计了针对API 16的应用,但该应用仍可以在API 21(Lollipop)上正常运行,因此您应将其提高targetSdkVersion到21,以表明Android操作系统可以应用可能存在于您的应用中。
杰夫·米克森

24
从根本上讲,我不知道如何定位比编译时所针对的SDK高的SDK。
coder123 2014年

55
更改compileSdkVersion为更高版本将意味着您希望使用某些仅包含在该特定版本中的新API。如果您不打算在应用程序中使用任何特定于Lollipop的功能,那么实际上(通常)没有必要将其设置compileSdkVersion为21。但是,您的应用程序可能会按原样在API 21上正常运行,因此您可以进行更改targetSdkVersion表示您的应用程序运行在API 21上的预期目标(目标),但您未使用任何特定于21(编译)的API,因此compileSdkVersion在此示例中,您可以停留在15。
杰夫·米克森

19
在Android Studio中执行此操作时会报告警告。我有“ compileSdkVersion 17”和“ targetSdkVersion 22”,它告诉我“ targetSdkVersion不应高于compileSdkVersion”。哦,刚刚更改了它,现在它告诉我targetSdkVersion不是最新的22,并且兼容模式可能会开始生效。
Pelpotronic

18
这个答案与Android Studio所说的相矛盾。targetSdkVersion很重要,它应小于或等于compileSdkVersion
ARK

152

作为单线指南:

minSdkVersion <= targetSdkVersion <= compileSdkVersion

理想情况下:

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

阅读更多来自Ian Lake的精彩文章


是否minSdkVersion 意味着can运行最低的设备api级应用程序?大概是因为它从minSdkVersion开始就使用某些API ?
Nitin Bansal

1
@NitinBansal是的。例如,如果minSdkVersion值为15(即ICS 4.0.3),则具有API 14(即ICS 4.0)的设备应无法安装该应用程序。至少目前,该应用将在15、16、17、18、19(20,但适用于旧操作系统),21、22、23、24、25、26、27、28等上运行在未来(可能)

33

compileSdkVersion应该是最新的稳定版本。的targetSdkVersion应完全测试和小于或等于 compileSdkVersion


14
有什么特定的理由要说targetSdkVersion小于compileSdkVersion?我认为这是一个错误的声明
Sufian 2015年

6
我想指出的是,最后一个版本是向后兼容的,因此,如果将API设置targetSdkVersion为较低版本,则最新API版本可以像旧版本一样“表现” 。因此,targetSdkVersion应该是您已经测试并知道确切行为的那个,并且可以是<=最新的稳定值。
Dielson Sales 2015年

我认为您的陈述“ compileSdkVersion应该是最新的稳定版本”应该以“您使用API​​功能的”作为后缀。如果仅使用较低的API版本功能,则根据API 27(今天最新的稳定API)进行编译是没有意义的。但是,最新的稳定版本可能包含一些自动变得更好的功能,例如,增强的安全性或具有向后兼容性的高效编译。因此,建议使用最新的或至少是最新的稳定版本,但本质上 “不应该”是最新版本。
Erik

27

游戏的后期。.上面有几个很好的答案-本质上,compileSdkVersion是应用程序针对的API版本,而targetSdkVersion指示应用程序针对其进行测试的版本。

我想补充以下注意事项:

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

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

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

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

5
回复:您的第二点,我认为参考文档没有明确说明这一点。它说:“但是,如果平台的API级别高于应用程序的targetSdkVersion声明的版本,则系统可能会启用兼容性行为,以确保您的应用程序继续按您期望的方式工作。” 我认为这意味着,如果您所运行的设备的API级别比您的设备新,您targetSdkVersion可能会看到兼容性行为。我认为这与无关compileSdkVersion
杰里米

20

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

在此处输入图片说明

您将在build.gradle文件中看到以下内容:

在此处输入图片说明

targetSdkVersion: 包含您的应用随开发过程一起发送到应用商店的信息,从而使该应用能够 TARGET the SPECIFIED version of the Android platform。根据您应用的功能,它可以定位低于当前版本的API版本,例如,即使当前版本为23,也可以定位API 18版本。

好好看一下这个Google官方页面


9

compiledSdkVersion在以前的答案中看到了很多不同之处,因此,我将在android的网页之后尝试在此处进行澄清。

A-Android怎么说

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

选择平台版本和API级别开发应用程序时,需要选择编译应用程序所依据的平台版本。通常,应根据应用程序可以支持的平台的最低版本来编译应用程序。

因此,根据Android,这将是正确的顺序:

compiledSdkVersion = minSdkVersion <= targetSdkVersion

B-其他人也说

有些人更喜欢始终使用可用的最高已编译SkdVersion。这是因为它们将依靠代码提示来检查它们是否正在使用比minSdkVersion更高的API功能,因此可以更改代码以使其不使用它们,或者在运行时检查用户API版本以有条件地将它们与回退以用于较旧的API版本。

有关不推荐使用的提示也会出现在代码中,让您知道某些新API级别不推荐使用的东西,因此您可以根据需要做出相应的反应。

因此,这将是其他人的正确命令:

minSdkVersion <= targetSdkVersion <= compiledSdkVersion (highest possible)

该怎么办?

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

如果您打算在运行时根据用户的API级别提供不同的API功能,请使用选项B。您将获得有关在编码时使用的功能的提示。只要确保在运行时不检查用户API级别,就不要使用比minSdkVersion更高的API功能,否则您的应用程序将崩溃。这种方法还具有在编码时学习新功能和旧功能的好处。

如果您已经知道新功能或旧功能,并且正在开发一次肯定不会更新的一次性应用程序,或者您确定不会有条件地提供新的API功能,那么请使用选项A。使用不建议使用的提示,即使您很想这样做,也将永远无法使用较新的API功能。


2
我认为Android的建议没有不同。“ 针对最低版本编译应用程序”与使用特定SDK版本进行编译之间存在区别。您通常应使用最新版本进行编译(compileSdkVersion),将min(minSdkVersion)设置得尽可能低,并将目标(targetSdkVersion)设置得尽可能高,这取决于测试或其他兼容性问题。
卡托

好点@Caltor。我希望他们会更新该文档以澄清差异。该<uses-sdk>文档非常含糊不清。
杰里米(Jeremy),

2

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

至于“目标版本”,它仅指您最初计划目标的目标,并可能经过测试。如果您尚未进行尽职调查,则可以通过这种方式通知Android,在将“ Lollipop”目标应用部署到“ Oreo”上之前,它需要执行一些其他检查。

因此,“目标版本”显然不低于您的“最低SDK版本”,但不能高于您的“编译版本”。


1

由于已经有很多详细的答案,因此无法回答您的直接问题,但是值得一提的是,与Android文档相反,Android Studio建议为compileSDKVersion和使用相同版本targetSDKVersion

在此处输入图片说明


0

createdSdkVersion ==>哪个版本的SDK应该将您的代码编译为字节码(在开发环境中使用):最好使用最新版本的SDK。

minSdkVersion ==>这些项目用于安装APK(在生产环境中使用)。例如:

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

0

快速总结:

对于minSDKversion,请参阅Twitter句柄中的最新条目:https ://twitter.com/minSdkVersion

TargetSDKversion:请参阅Twitter句柄中的最新条目:https ://twitter.com/targtSdkVersion 或使用开发https://developer.android.com/guide/topics/manifest/uses-sdk-element中指示的最新API级别。 html

编译版本:与TargetSDKversion相同

maxSdkVersion:Android的建议是不要设置此设置,因为您不想限制您的应用在未来的android版本上不执行


0

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

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.