compileSdkVersion 和 targetSdkVersion 有什么区别?

What is the difference between compileSdkVersion and targetSdkVersion?

提问人:coder123 提问时间:11/2/2014 最后编辑:Ramesh Rcoder123 更新时间:8/23/2023 访问量:319494

问:

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

它说的是:

The `compileSdkVersion` property specifies the compilation target.

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

我认为有两种可能的方式来解释这一点:

  1. compileSdkVersion是用于构建应用的编译器版本,而是“应用程序面向的 API 级别”。(如果是这种情况,我认为必须大于或等于 ?targetSdkVersioncompileSdkVersiontargetSdkVersion
  2. 他们的意思是一样的。“compilation target” == “应用程序目标的 API 级别”
  3. 别的?

我看到这个问题以前有人问过,但一个答案只是引用了文档,这是我不清楚的。

Android SDK android-gradle-plugin android-build

评论

7赞 Ivan Chau 1/23/2016
有关以下内容的更多详细信息:选择 compileSdkVersion、minSdkVersion 和 targetSdkVersion
2赞 IgorGanapolsky 1/25/2018
targetSdkVersion 是设备正在运行的内容。因此,如果您的设备运行速度低于奥利奥,则不要以 27 为目标。
0赞 Just The Highlights 10/31/2022
这回答了你的问题吗?最低 SDK 版本/目标 SDK 版本与编译 SDK 版本有什么区别?

答:

726赞 Jeffrey Mixon 11/2/2014 #1

compileSdkVersion

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

targetSdkVersion

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

例如,如文档所述

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

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

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

评论

28赞 Jeffrey Mixon 11/2/2014
不,很可能会高于而且理所当然。这意味着,例如,尽管你设计了一个面向 API 16 的应用,但它在 API 21 (Lollipop) 上仍然可以正常运行,你应该将你的应用提升到 21,以表明 Android 操作系统可以将可能存在的任何 Lollipop 样式应用于你的应用。targetSdkVersioncompileSdkVersiontargetSdkVersion
58赞 coder123 11/2/2014
从根本上说,我不明白你怎么能把一个SDK定位到比你编译的SDK更高的SDK。
75赞 Jeffrey Mixon 11/2/2014
更改为更高版本意味着您希望使用一些仅包含在该特定版本中的新 API。如果您不打算在应用程序中使用任何特定于 Lollipop 的功能,那么真的(通常)没有理由设置为 21。但是,你的应用可能会在 API 21 上按原样运行良好,因此你更改为指示你的应用在 API 21 上按预期(目标)运行,但你没有使用任何特定于 21(编译)的 API,因此在此示例中可以保持在 15。compileSdkVersioncompileSdkVersiontargetSdkVersioncompileSdkVersion
32赞 Pelpotronic 8/7/2015
当我在 Android Studio 中执行此操作时,会报告警告。我有“compileSdkVersion 17”和“targetSdkVersion 22”,它告诉我“targetSdkVersion不应高于compileSdkVersion”。哦,刚刚更改了它,现在它告诉我 targetSdkVersion 不是最新的 22,并且可能会启动兼容模式。叹息。
26赞 ARK 1/29/2016
这个答案与Android Studio所说的相矛盾。targetSdkVersion 很重要,它应该小于或等于 compileSdkVersion
39赞 androidwifi 10/8/2015 #2

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

评论

20赞 Sufian 11/10/2015
说 targetSdkVersion 小于 compileSdkVersion 有什么具体原因吗?我认为这是一个错误的说法
7赞 Dielson Sales 12/1/2015
我想关键是最后一个版本是向后兼容的,所以最新的 API 版本可以像旧版本一样“表现”,如果你将 设置为较低的版本。因此,它应该是您测试过并知道确切行为的那个,并且可以是 <= 最新的稳定版本。targetSdkVersiontargetSdkVersion
1赞 Erik 4/11/2018
我认为您的声明“应该是最新的稳定版本”应该以“您使用 API 功能的”为后缀。如果您只使用较低的 API 版本功能,那么针对 API 27(当今最新的稳定 API)进行编译是没有意义的。但是,最新的稳定版本可能包括一些自动变得更好的功能,例如增强的安全性或具有向后兼容性的高效编译。因此,建议使用最新的或至少是最近的稳定版本,但它本身“不应该是”最新版本。compileSdkVersion
24赞 Ojonugwa Jude Ochalifu 4/19/2016 #3

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

在此处输入图像描述

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

enter image description here

targetSdkVersion:包含您的应用在开发过程后附带的信息,以允许它 .根据应用的功能,它可以定位低于当前版本的 API。例如,即使当前版本为 23,也可以以 API 18 为目标。TARGET the SPECIFIED version of the Android platform

好好看看这个官方的谷歌页面

评论

0赞 Tom Rutchik 8/30/2023
我认为这个答案具有误导性。BuildToolsVersion 指定用于编译的编译器和其他生成工具的版本。CompileSdkVersion 指定应用使用的 sdk 功能版本(即应用是使用 CompileSdkVersion 以外的 SDK 功能构建的),targetSdkVersion 指定测试应用所针对的版本。MinSdkversion 指定允许安装此应用的最低版本 sdk。您通常希望 buildToolsVersion 是最新的,而不是 compileSdkVersion。
237赞 Jimmy Kane 6/16/2016 #4

作为单行指南:

minSdkVersion <= targetSdkVersion <= compileSdkVersion

理想:

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

从伊恩·莱克(Ian Lake)的这篇精彩文章中阅读更多内容

P.S. 正如@sshturma在下面的回答中剪辑的那样:

评论

0赞 Nitin Bansal 8/7/2018
是否意味着最低的设备 api 级别的应用程序运行?大概是因为它使用了从现在开始可用的某些 API?minSdkVersion canminSdkVersion
2赞 Louis Tsai 10/9/2018
@NitinBansal是的。例如,如果为 15(即 ICS 4.0.3),则具有 API 14(即 ICS 4.0)的设备应无法安装该应用。至少就目前而言,该应用程序将在 15、16、17、18、19(20 但那是针对旧的 wear os)、21、22、23、24、25、26、27、28 等(可能)上运行minSdkVersion
1赞 djzhao 7/2/2021
compileSdkVersion可以小于targetSdkVersion
2赞 Jimmy Kane 7/3/2021
@djzhao愿意详细说明为什么?
1赞 jaquinocode 1/26/2022
@JimmyKane 不确定你是否已经看到了这个,但这个评论有点解释了为什么你可能想这样做(不是说我会推荐它,只是传递信息)。
60赞 Austin 1/7/2017 #5

迟到了..上面有几个很好的答案 - 本质上,是编译应用程序所针对的 API 版本,而 表示测试应用程序的版本。compileSdkVersiontargetSdkVersion

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

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

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

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

评论

8赞 Jeremy 8/22/2017
回复:你的第二点,我认为参考文献文档没有明确说明这一点。它说:“但是,如果平台的 API 级别高于应用的 targetSdkVersion 声明的版本,系统可能会启用兼容性行为,以确保您的应用继续按照您预期的方式运行。我认为这意味着,如果您运行的设备的 API 级别比您的设备更新,您可能会看到兼容性行为。我不相信它与.targetSdkVersioncompileSdkVersion
3赞 Suraj Vaishnav 11/14/2020
如果 compileSdkVersion 为 23 且 targetSdkVersion 为 22,它会在棉花糖及以上设备中显示权限对话框吗?
14赞 CGodo 4/12/2017 #6

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

A - Android 怎么说

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

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

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

compiledSdkVersion = minSdkVersion <= targetSdkVersion

B - 别人怎么说

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

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

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

minSdkVersion <= targetSdkVersion <= compiledSdkVersion (highest possible)

该怎么办?

这取决于你和你的应用。

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

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

评论

3赞 Caltor 7/8/2017
我不认为 Android 的建议有什么不同。“针对尽可能低的版本编译应用程序”和使用特定的 SDK 版本进行编译是有区别的。通常,您应该使用最新版本进行编译(compileSdkVersion),将最小值(minSdkVersion)设置得尽可能低,并将目标(targetSdkVersion)设置得尽可能高,具体取决于测试或其他兼容性问题。
0赞 Jeremy 8/22/2017
好点@Caltor。我希望他们能更新该文件以澄清其中的区别。文档非常模糊和模棱两可。<uses-sdk>
1赞 Salim Mazari Boufares 4/3/2021
实际上,只有当 TargetSdkVersion = CompileSdkVersion 但不高于 CompileSdkVersion 时,场景 A 才能成立,当您选择更高的值时,Android Studio 会将其视为错误,并要求您选择等于或低于 ComplieSdkVersion 的值
4赞 pcodex 11/16/2017 #7

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

至于“目标版本”,它只是指您最初计划的目标,并且可能已经测试过。如果您还没有进行尽职调查,那么这是通知 Android 的方法,它需要在“奥利奥”上部署您的“棒棒糖”目标应用程序之前执行一些额外的检查。

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

评论

1赞 Ahmed Nabil 1/1/2021
“目标版本”显然不低于您的“最低 SDK 版本”
3赞 sshturma 2/12/2018 #8

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

enter image description here

1赞 samus 9/21/2018 #9

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

enter image description here

4赞 M.Namjo 4/17/2019 #10

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

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

if(client-sdk-version   <   min-sdk-versoin )
    client-can-not-install-apk;
else
    client-can-install-apk;
1赞 kush 7/8/2019 #11

快速摘要:

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

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

编译版本: 使其与 TargetSDKversion 相同

maxSdk版本: Android 的建议是不要设置此设置,因为您不想限制您的应用程序在将来的 Android 版本上无法运行

2赞 MashukKhan 5/13/2023 #12

compileSdkVersion

compileSdkVersion 指定编译代码所依据的 Android SDK 版本。这意味着您的应用可以使用指定版本和任何先前版本中包含的所有 API。

例如,如果将 compileSdkVersion 设置为 30,则表示 您的应用可以使用版本 30 之前引入的所有 API。 例如,如果要使用已引入的 Camera2 API 在 Android 5.0(API 级别 21)及更高版本中,并且您已将 compileSdkVersion 设置为 30,则您的应用可以使用此 API,而不会出现任何问题。但是,如果您尝试使用 Android 31(尚未发布),您将获得编译时 错误,因为该 API 在您设置的 compileSdkVersion 中尚不可用。

targetSdkVersion

targetSdkVersion这是应用设计用于运行的 Android SDK 版本。它指定了应用经过测试并打算在其上运行的 API 级别,还指示了应用与较新版本的 Android 提供的兼容性级别。

例如,如果将 targetSdkVersion 设置为 30,则 表明您的应用设计为在搭载 Android 的设备上运行 30 或更高。这意味着您已经针对 版本 30 中引入的 API,并确保您的应用行为正常 在这些设备上正确。但是,这也意味着您的应用可能会 不利用更高 Android 版本,除非您明确为它们编写代码。

总结

总之,compileSdkVersion 确定可在构建过程中使用的 API 集,而 targetSdkVersion 指定应用设计用于运行的 API 级别,并指示应用与较新版本的 Android 提供的兼容性级别。

理想情况下,compileSdkVersiontargetSdkVersion 应相等,并且都指向最新的 SDK。但当然,只有在您测试该版本中引入的每个更改都能顺利地与您的应用程序一起运行之后!

1赞 Umang Choudhary 8/23/2023 #13

compileSdkVersion :compileSdkVersion 定义了 gradle 将使用哪个 Android SDK 版本来编译您的应用。

例如:在 Android 12 中,因此在 SDK 版本 31 中,引入了新的初始屏幕 API,这使我们能够轻松实现初始屏幕。 如果要在应用中使用该 API,则必须在应用中将 compileSdkVersion 更新为 31。 只有这样,才能在代码中使用这个新的初始屏幕 API,否则将出现编译错误。

当然,这并不意味着您只能使用这个新 API,而忘记使用此 API 不可用的旧 Android 版本的用户。 您还必须提供一种替代方法,通过使用版本检查条件来显示旧设备的初始屏幕。

*if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {

// New Splash screen API

} else {

// Old splash screen approach

}*

同样,某些方法或属性可能会在此 Android SDK 版本中被弃用,其中一些甚至被删除。 这就是为什么一旦你更新了你的应用程序中的compiledSdkVersion,你经常会在编译过程中看到一些警告和错误。

但是,单独更改 compileSdkVersion 实际上并不能改变应用程序在 Android 设备上运行时的行为。 那么,Android 系统如何知道它是否可以在您的应用程序中使用新功能呢?这就是 targetSdkVersion 发挥作用的地方。

targetSdkVersion :targetSdkVersion 告诉系统应用是针对哪个 Android 版本设计和测试的。

例如:在 Android 12 中,自定义通知的外观已更改。 如果您的 targetSdkVersion 低于 31,系统将假定您尚未测试该功能 并将以旧方式显示通知,以最大程度地降低通知无法正确显示的风险。 只有在将目标 SDK 版本更新到 31 后,才会使用新的通知外观。

并非新 Android 版本中引入的所有更改都是有针对性的,并且使用这些向后兼容机制。 对于每个 Android 版本,在文档中,您可以看到更改分为两组:

- 针对特定 Android 版本的应用程序的>行为更改

->和更改所有应用,无论它们定义哪个 targetSdkVersion。

后者的一个例子可能是在 Android 11 中引入一次性权限。 当设备使用 Android 版本 11 或更高版本并且应用请求位置权限时, 用户可以授予对该数据的临时访问权限,并且无论应用是否面向 SDK 版本 30,都必须正确处理这种情况。

编译版和目标版SDK的关系:

-> targetSdkVersion 不能高于 compileSdkVersion,因为我们不能针对我们在编译过程中一无所知的东西。

-> 理想情况下,compileSdkVersion 和 targetSdkVersion 应该相等,并且都指向最新的 SDK。