compileSdkVersion和targetSdkVersion有什么区别?

cod*_*123 495 sdk android android-build android-gradle-plugin

我已经看了看文档与摇篮建设,但我仍然不知道什么之间的差异compileSdkVersion,并targetSdkVersion为.

它只是说:

compileSdkVersion属性指定编译目标.

那么,"汇编目标"是什么?

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

  1. compileSdkVersion在构建应用程序所使用的编译器的版本,同时targetSdkVersion"API级别的应用程序的目标".(如果是这种情况,我认为compileSdkVersion必须大于或等于targetSdkVersion
  2. 他们的意思是一样的."编译目标"=="应用程序所针对的API级别"
  3. 别的什么?

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

Jef*_*xon 524

compileSdkVersion

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 在运行时可能会根据此值更改应用程序在操作系统上下文中的样式化或执行方式.还有一些受此值影响的其他已知示例,该列表可能只会随着时间的推移而增加.

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

  • 将`compileSdkVersion`更改为更高版本意味着您要使用仅包含在该特定版本中的一些新API.如果您不打算在您的应用程序中使用任何特定于Lollipop的功能,那么(通常)没有理由将`compileSdkVersion`设置为21.但是,您的应用程序可能会在API 21上正常运行,因此,您更改`targetSdkVersion`以指示您的应用程序**在API 21上运行**,但您没有使用任何特定于21(编译)的API,因此您的`compileSdkVersion`可以保持在15 in这个例子. (55认同)
  • 从根本上说,我不明白你如何定位比你编译的SDK更高的SDK. (24认同)
  • 当我在Android studio中执行此操作时会报告警告.我有"compileSdkVersion 17"和"targetSdkVersion 22",它告诉我"targetSdkVersion不应该高于compileSdkVersion".哦,只是改变它,现在它告诉我targetSdkVersion不是最新的22并且兼容模式可能会启动.叹气. (17认同)
  • 这个答案与Android Studio所说的相矛盾.targetSdkVersion很重要,它应该小于或等于compileSdkVersion (16认同)
  • 不,`targetSdkVersion`很可能会高于`compileSdkVersion`并且理所当然.这意味着,虽然你设计一个应用程序为目标API 16,例如,它仍然运行在API 21(棒棒堂)的罚款,你应该撞你`targetSdkVersion`到21来表示它是好的,为Android OS应用任何Lollipop-您的应用可能存在的样式. (14认同)
  • 当你将targetSdkVersion设置为高于compileSdkVersion时,它在android studio中清楚地说明了."targetSdkVersion不应该高于compileSdkVersion" (7认同)
  • @degill`compileSdkVersion`只影响_compilation_ time.设备的API级别决定了它最终运行的Android版本.在具有API 21的设备上运行的`compileSdkVersion`为11的应用程序将运行所有Android API的版本21.`compileSdkVersion`纯粹是为了编译器; 在您的应用程序已构建完成后,它不会影响任何内容. (4认同)
  • 许多开发人员都希望设置`compileSdkVersion 23`,但请继续使用`targetSdkVersion 22`一段时间.(请参阅@ jeff-mixon评论原因.) (3认同)
  • "请注意,如果您使用支持库,则使用最新的SDK进行编译是使用最新支持库版本的必要条件." 来源:https://medium.com/google-developers/picking-your-compilesdkversion-minsdkversion-targetsdkversion-a098a0341ebd#.6lmj281s2 (3认同)
  • 我仍然没有100%得到compileSdkVersion的含义.让我说我有一个应用程序,我建立在API级别21.然后谷歌发布API 23.我编译我的应用程序对compileSdkVersion 23但是除了我的代码之外没有改变任何东西.我的应用会使用API​​ 23中的"新"代码吗?我问,因为我很好奇bug修复会发生什么:让我们说我的APP中有一个方法`DoStuff()`.谷歌注意到它包含一个错误,他们为API修复了它.当我使用compileSdkVersion 23进行编译时,我的应用程序是否得到了错误修正?该SDK中的代码是否会编译到我的应用程序中? (2认同)
  • 为方便起见,这只是Gradle检查提示.将`targetSdkVersion`设置为高于`compileSdkVersion`没有实际的技术问题.与此同时,只要你理解其含义,将`compileSdkVersion`设置为最高级别也没有什么坏处. (2认同)
  • 在 Android Studio 中,如果我将 `compileSdkVersion` 设置为低于 `targetSdkVersion` 那么 AS 告诉我这是不允许的,所以在我看来你不应该设置 `compiled < target` 如上所述......(@Jeff Mixon ?) (2认同)

Jim*_*ane 142

作为一个oneliner指南:

minSdkVersion <= targetSdkVersion <= compileSdkVersion
Run Code Online (Sandbox Code Playgroud)

理想的情况是:

minSdkVersion (lowest possible) <= targetSdkVersion == compileSdkVersion (latest SDK)
Run Code Online (Sandbox Code Playgroud)

阅读伊恩湖的这篇精彩文章

  • @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 等时间运行在未来(可能) (2认同)
  • @djzhao 愿意详细说明原因吗? (2认同)

小智 33

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

  • 说targetSdkVersion小于compileSdkVersion的任何具体原因?我认为这是一个错误的陈述 (13认同)
  • 我想重点是最后一个版本是向后兼容的,所以如果你将`targetSdkVersion`设置为较低版本,最新的API版本可以像旧版本一样"行为".所以`targetSdkVersion`应该是你测试过的并知道确切的行为,并且可以是<=最新的稳定. (6认同)

Aus*_*n D 25

在游戏的后期..并且上面有几个很好的答案 - 基本上,这compileSdkVersion是应用程序编译的API的版本,而targetSdkVersion表示应用程序被测试的版本.

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

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

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

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

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

  • Re:你的第二点,我不认为参考文献明确说明了这一点.它说"但是,如果平台的API级别高于应用程序的targetSdkVersion声明的版本,系统可能会启用兼容性行为,以确保您的应用程序继续以您期望的方式工作." 我认为这意味着如果您运行的设备的API级别比您的`targetSdkVersion`更新,您可能会看到兼容性行为.我不相信它与`compileSdkVersion`有任何关系. (4认同)
  • 如果compileSdkVersion是23并且targetSdkVersion是22,它会在marshmallow及以上设备中显示权限对话框吗? (3认同)

ojo*_*ifu 19

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

在此输入图像描述

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

在此输入图像描述

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

仔细看看这个官方Google 页面.


CGo*_*odo 8

compiledSdkVersion在之前的答案中看到了很多不同之处,因此我将在这里按照android的网页进行一些澄清.

答 - Android说的是什么

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

选择平台版本和API级别在开发应用程序时,您需要选择要编译应用程序的平台版本.通常,您应该针对应用程序可以支持的最低版本的平台编译应用程序.

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

compiledSdkVersion = minSdkVersion <= targetSdkVersion

B - 其他人也说了什么

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

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

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

minSdkVersion <= targetSdkVersion <= compiledSdkVersion (highest possible)

该怎么办?

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

如果您计划在运行时根据用户的API级别提供不同的API功能,请使用选项B.您将获得有关编码时使用的功能的提示.只需确保在运行时没有检查用户API级别就不会使用比minSdkVersion更新的API功能,否则您的应用程序将崩溃.这种方法还有一个好处,就是在编码时学习新的东西和旧的东西.

如果您已经知道新的或旧的,并且您正在开发一个肯定永远不会更新的一次性应用程序,或者您确定不会有条件地提供新的API功能,那么请使用选项A.您将不会受到打扰使用已弃用的提示,即使您有诱惑,也永远无法使用较新的API功能.

  • 我不认为Android的建议是不同的."将您的应用程序**编译为**尽可能低的版本"与使用**特定SDK版本编译**之间存在差异.您通常应该使用最新版本编译(compileSdkVersion),将您的min(minSdkVersion)设置为尽可能低,并根据测试或其他兼容性问题将目标(targetSdkVersion)设置为尽可能高. (2认同)

小智 5

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

\n

例如: \n在 Android 12 中,因此在 SDK 版本 31 中,引入了新的闪屏 API,这使我们能够轻松实现闪屏。\n如果您想在应用程序中使用该 API,则必须将compileSdkVersion 更新为 31您的应用程序。\n只有这样您才能在代码中使用这个新的启动屏幕 API,否则您将收到编译错误。

\n

\xe2\x80\x99t 当然意味着您只能使用这个新 API,而忘记那些拥有旧版 Android 版本(该 API 不可用)的用户。\n您还必须提供另一种方法来显示启动屏幕较旧的设备通过使用版本检查条件。

\n
*if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {\n\n// New Splash screen API\n\n} else {\n\n// Old splash screen approach\n\n}*\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n

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

\n

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

\n

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

\n

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

\n

-> 以及所有应用程序的更改,无论它们定义哪个 targetSdkVersion。

\n

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

\n

编译版本和目标SDK版本之间的关系:

\n

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

\n

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

\n