ChatGPT解决这个技术问题 Extra ChatGPT

compileSdkVersion 和 targetSdkVersion 有什么区别?

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

它说的是:

compileSdkVersion 属性指定编译目标。

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

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

compileSdkVersion 是用于构建应用程序的编译器版本,而 targetSdkVersion 是“应用程序目标的 API 级别”。 (如果是这种情况,我会假设 compileSdkVersion 必须大于或等于 targetSdkVersion?它们的意思是一样的。“编译目标”==“应用程序目标的 API 级别”还有什么?

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

targetSdkVersion 是您的设备正在运行的版本。因此,如果您的设备运行速度低于 Oreo,则不要以 27 为目标。

J
Jeffrey Mixon

compileSdkVersion

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

目标SDK版本

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
J
Jimmy Kane

作为单行指南:

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 但这是针对旧的磨损操作系统)、21、22、23、24、25、26、27、28 等运行在未来(可能)
compileSdkVersion 可以小于 targetSdkVersion
@djzhao 想详细说明为什么?
@JimmyKane 不确定您是否已经看到此内容,但此 comment 可以解释为什么您可能想要这样做(不是说我会推荐它,只是传递信息)。
A
Austin

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

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

该 targetSdkVersion 会影响请求权限的方式:

如果设备运行 Android 6.0(API 级别 23)或更高版本,并且应用的 targetSdkVersion 为 23 或更高版本,则应用在运行时向用户请求权限。

如果设备运行Android 5.1(API级别22)或更低,或者应用的targetSdkVersion为22或更低,系统会在用户安装应用时要求用户授予权限。

如果 compileSdkVersion 高于您应用的 targetSdkVersion 声明的版本,系统可能会启用兼容性行为以确保您的应用继续按照您期望的方式运行。 (参考)随着每个新的 Android 版本......

targetSdkVersion 应该增加以匹配最新的 API 级别,然后在相应的平台版本上彻底测试您的应用程序

另一方面,compileSdkVersion 不需要更改,除非您要添加新平台版本独有的功能

因此,虽然 targetSdkVersion 通常(最初)小于 compileSdkVersion,但在 targetSdkVersion > compileSdkVersion 的情况下看到维护良好/已建立的应用程序并不少见


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

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


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

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

https://i.stack.imgur.com/VE1Mx.png

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

https://i.stack.imgur.com/N8GuB.png

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

好好看看这个官方的 Google page


C
CGodo

我在以前的答案中看到了很多关于 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。您将获得有关您在编码时使用的功能的提示。只要确保在运行时不检查用户 API 级别的情况下,您永远不要使用比 minSdkVersion 更新的 API 功能,否则您的应用程序将崩溃。这种方法还具有在编码时了解新内容和旧内容的好处。

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


我认为 Android 的建议没有什么不同。 “针对可能的最低版本编译您的应用程序”与使用特定 SDK 版本进行编译之间存在差异。您通常应该使用最新版本编译(compileSdkVersion),将您的最小值(minSdkVersion)设置为尽可能低,并将您的目标(targetSdkVersion)设置为尽可能高,这取决于测试或其他兼容性问题。
好点@Caltor。我希望他们能更新该文件以澄清差异。 <uses-sdk> 文档非常含糊不清。
实际上,场景 A 只有在 TargetSdkVersion = CompileSdkVersion 但不更高时才为真,当您选择更高的值时,Android Studio 会将其视为错误并要求您选择等于或低于 ComplieSdkVersion 的值
p
pcodex

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

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

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


“目标版本”显然不低于您的“最低SDK版本”
s
sshturma

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

https://i.stack.imgur.com/lxWp6.png


M
M.Namjo

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

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

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

B
Bhargav Rao

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

https://i.stack.imgur.com/RkYRn.png


k
kush

快速总结:

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

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

编译版本:与 TargetSDKversion 相同

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