compileSdkVersion 和 targetSdkVersion 有啥区别?

Posted

技术标签:

【中文标题】compileSdkVersion 和 targetSdkVersion 有啥区别?【英文标题】:What is the difference between compileSdkVersion and targetSdkVersion?compileSdkVersion 和 targetSdkVersion 有什么区别? 【发布时间】:2014-12-28 22:05:59 【问题描述】:

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

它只是说:

compileSdkVersion 属性指定编译目标。

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

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

    compileSdkVersion 是用于构建应用程序的编译器版本,而 targetSdkVersion 是 "API level that the application targets"。 (如果是这种情况,我会假设 compileSdkVersion 必须大于或等于 targetSdkVersion? 它们的意思是一样的。 "编译目标" == "应用程序所针对的 API 级别" 还有别的吗?

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

【问题讨论】:

更多详情:Picking your compileSdkVersion, minSdkVersion, and targetSdkVersion targetSdkVersion 是您的设备正在运行的内容。因此,如果您的设备运行速度低于 Oreo,则不要以 27 为目标。 【参考方案1】:

compileSdkVersion

compileSdkVersion 是应用编译时所针对的 API 版本。这意味着您可以使用该 API 版本中包含的 android API 功能(当然,也可以使用所有以前的版本)。如果您尝试使用 API 16 功能但将 compileSdkVersion 设置为 15,您将收到编译错误。如果您将 compileSdkVersion 设置为 16,只要您的应用的执行路径不尝试调用任何特定于 API 16 的 API,您仍然可以在 API 15 设备上运行该应用。

targetSdkVersion

targetSdkVersion 与您的应用程序的编译方式或您可以使用的 API 无关。 targetSdkVersion 应该表明你已经在你指定的版本上测试了你的应用程序(大概直到并包括)。这更像是您向 Android 操作系统提供的认证或签字,作为其应如何处理您的应用在操作系统功能方面的提示。

例如,正如the documentation 所说:

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

Android 操作系统在运行时可能会根据此值更改您的应用在操作系统上下文中的样式化或执行方式。还有一些其他已知示例受此值影响,并且该列表可能只会随着时间的推移而增加。

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

【讨论】:

不,targetSdkVersion 很可能会高于compileSdkVersion,这是理所当然的。这意味着尽管您设计了一个以 API 16 为目标的应用程序,例如,它仍然在 API 21(Lollipop)上运行良好,您应该将您的 targetSdkVersion 提高到 21,以表明 Android 操作系统可以应用任何 Lollipop-您的应用中可能存在的样式。 从根本上说,我不明白您如何针对高于您编译的 SDK 的 SDK。 compileSdkVersion 更改为更高版本意味着您希望使用仅包含在该特定版本中的一些新API。如果你不打算在你的应用程序中使用任何 Lollipop 特定的功能,那么真的(通常)没有理由将compileSdkVersion 设置为 21。但是,你的应用程序可能会在 API 21 上运行良好,因此您更改 targetSdkVersion 以指示您的应用程序 运行 就像您在 API 21 上所期望的(目标),但您没有使用任何特定于 21(编译)的 API,因此您的 compileSdkVersion 可以保留在本例中为 15。 我在 Android Studio 中执行此操作时会报告警告。我有“compileSdkVersion 17”和“targetSdkVersion 22”,它告诉我“targetSdkVersion 不应高于 compileSdkVersion”。哦,刚刚改了,现在它告诉我 targetSdkVersion 不是最新的 22 并且兼容模式可能会启动。叹息。 这个答案与 Android Studio 所说的相矛盾。 targetSdkVersion 很重要,它应该小于或等于 compileSdkVersion【参考方案2】:

作为单行指南:

minSdkVersion <= targetSdkVersion <= compileSdkVersion

理想情况下:

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

Read more from this great post by Ian Lake

【讨论】:

minSdkVersion 是否意味着最低设备 api 级别的应用程序can 运行?大概是因为它使用了从minSdkVersion 开始提供的某些 API? @NitinBansal 是的。例如,如果minSdkVersion 为 15(即 ICS 4.0.3),则具有 API 14(即 ICS 4.0)的设备应该无法安装该应用程序。至少目前,该应用程序将在 15、16、17、18、19、(20 但这是旧版 Wear 操作系统)、21、22、23、24、25、26、27、28 等上运行在未来(可能) compileSdkVersion 可以小于targetSdkVersion @djzhao 详细说明原因? @JimmyKane 不确定你是否已经看过这个,但是这个comment 可以解释为什么你可能想要这样做(不是说我会推荐它,只是传递信息)。【参考方案3】:

游戏迟到了.. 上面有几个很好的答案——本质上,compileSdkVersion 是应用程序编译所针对的 API 版本,而targetSdkVersion 表示应用程序经过测试的版本反对。

我想用以下注释来补充这些答案:

    那个targetSdkVersion impacts the way in which permissions are requested:
如果设备运行 Android 6.0(API 级别 23)或更高版本,并且应用的 targetSdkVersion 为 23 或更高,则应用在运行时向用户请求权限。李> 如果设备运行Android 5.1(API级别22)以下,或应用的targetSdkVersion为22或以下,系统会在用户安装时要求用户授予权限应用程序。

    如果compileSdkVersion 高于您应用的targetSdkVersion 声明的版本,系统可能会启用兼容性行为以确保您的应用继续以您期望的方式运行。 (ref)

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

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

【讨论】:

Re:你的第二点,我不认为参考文档明确说明了这一点。它说“但是,如果平台的 API 级别高于您应用程序的 targetSdkVersion 声明的版本,系统可能会启用兼容性行为,以确保您的应用程序继续按照您期望的方式运行。”我认为这意味着如果您正在运行的设备的 API 级别比您的 targetSdkVersion 更新,您可能会看到兼容性行为。我不相信它与compileSdkVersion 有任何关系。 如果compileSdkVersion为23,targetSdkVersion为22,会在marshmallow及以上设备显示权限对话框吗?【参考方案4】:

compileSdkVersion 应该是最新的稳定版本。 targetSdkVersion 应该经过全面测试并且小于或等于 compileSdkVersion

【讨论】:

说 targetSdkVersion 小于 compileSdkVersion 有什么具体原因吗?我认为这是一个错误的说法 我猜关键是最后一个版本是向后兼容的,所以如果你将targetSdkVersion 设置为较低的,最新的 API 版本可以像旧版本一样“表现”。所以targetSdkVersion 应该是你测试过并且知道确切行为的那个,并且可以是 我认为你的声明'compileSdkVersion应该是最新的稳定版本'应该加上'你使用API​​特性'的后缀。如果您只使用较低的 API 版本功能,那么针对 API 27(当今最新的稳定 API)进行编译是没有意义的。但是,最新的稳定版本可能包含一些自动变得更好的功能,例如增强的安全性或具有向后兼容性的高效编译。因此,建议使用最新的或至少是最近的稳定版本,但它“应该 [不] 是”本身的最新版本。【参考方案5】:

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

您将在您的build.gradle 文件中看到这一点:

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

好好看看这个官方的谷歌page。

【讨论】:

【参考方案6】:

我在之前的答案中看到了很多关于 compiledSdkVersion 的不同之处,所以我将在此处尝试澄清一下,跟随 android 的网页。

A - Android 所说的

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

在开发时选择平台版本和 API 级别 您的应用程序,您将需要选择针对的平台版本 您将编译应用程序。 一般来说,你应该编译 您的应用程序针对可能的最低平台版本 您的应用程序可以支持。

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

compiledSdkVersion = minSdkVersion &lt;= targetSdkVersion

B - 其他人也怎么说

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

关于已弃用用途的提示也会出现在代码中,让您知道某些内容在较新的 API 级别中已被弃用,因此您可以根据需要做出相应的反应。

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

minSdkVersion &lt;= targetSdkVersion &lt;= compiledSdkVersion (highest possible)

怎么办?

这取决于您和您的应用。

如果您计划在运行时根据用户的 API 级别提供不同的 API 功能,请使用选项 B。您将获得有关您在编码时使用的功能的提示。只要确保在运行时不检查用户 API 级别的情况下,您永远不要使用比 minSdkVersion 更新的 API 功能,否则您的应用程序将崩溃。这种方法还具有在编码时了解新内容和旧内容的好处。

如果您已经知道什么是新的或旧的,并且您正在开发一个一次性应用程序,而且您肯定不会更新,或者您确定您不会有条件地提供新的 API 功能,那么请使用选项 A。您不会不要为已弃用的提示所困扰,即使您很想使用更新的 API 功能,也永远无法使用。

【讨论】:

我认为 Android 的建议没有什么不同。 “针对可能的最低版本编译您的应用程序”和使用特定的 SDK 版本编译是有区别的。您通常应该使用最新版本编译(compileSdkVersion),将您的最小值(minSdkVersion)设置为尽可能低,并将您的目标(targetSdkVersion)设置为尽可能高,这取决于测试或其他兼容性问题。 好点@Caltor。我希望他们能更新该文件以澄清差异。 &lt;uses-sdk&gt; 文档非常模糊和模棱两可。 实际上场景A只有在TargetSdkVersion = CompileSdkVersion但不更高时才为真,当您选择更高的值时,Android Studio会将其视为错误并要求您选择一个等于或更低的值比 ComplieSdkVersion【参考方案7】:

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

至于“目标版本”,它只是指您最初计划针对的目标并且可能已经测试过的目标。如果您尚未进行尽职调查,那么这是通知 Android 需要执行一些额外检查的方法,然后才能在“Oreo”上部署您的“Lollipop”目标应用程序。

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

【讨论】:

“目标版本”明显不低于你的“最低SDK版本”【参考方案8】:

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

【讨论】:

【参考方案9】:

compiledSdkVersion==> 哪个版本的 SDK 应该将您的 code 编译为 bytecode(它在开发中使用环境)点:最好使用最新版本的SDK。

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

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

【讨论】:

【参考方案10】:

快速总结:

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

TargetSDKversion:查看推特句柄中的最新条目:https://twitter.com/targtSdkVersion 或使用最新的 API 级别,如 devel https://developer.android.com/guide/topics/manifest/uses-sdk-element.html

编译版本: 使其与 TargetSDKversion 相同

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

【讨论】:

【参考方案11】:

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

【讨论】:

以上是关于compileSdkVersion 和 targetSdkVersion 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

compileSdkVersion 和 targetSdkVersion 有啥区别?

compileSdkVersion, minSdkVersion 和 targetSdkVersion

compileSdkVersion, minSdkVersion 和 targetSdkVersion

compileSdkVersion, minSdkVersion 和 targetSdkVersion

compileSdkVersion, minSdkVersion 和 targetSdkVersion

两个包在颤振中使用两个不同的 compileSdkVersion