提问人:coder123 提问时间:11/2/2014 最后编辑:Ramesh Rcoder123 更新时间:8/23/2023 访问量:319494
compileSdkVersion 和 targetSdkVersion 有什么区别?
What is the difference between compileSdkVersion and targetSdkVersion?
问:
我已经查看了使用 Gradle 构建的文档,但我仍然不确定 和 之间有什么区别。compileSdkVersion
targetSdkVersion
它说的是:
The `compileSdkVersion` property specifies the compilation target.
那么,什么是“编译目标”?
我认为有两种可能的方式来解释这一点:
compileSdkVersion
是用于构建应用的编译器版本,而是“应用程序面向的 API 级别”。(如果是这种情况,我认为必须大于或等于 ?targetSdkVersion
compileSdkVersion
targetSdkVersion
- 他们的意思是一样的。“compilation target” == “应用程序目标的 API 级别”
- 别的?
我看到这个问题以前有人问过,但一个答案只是引用了文档,这是我不清楚的。
答:
compileSdkVersion
是编译应用所针对的 API 版本。这意味着您可以使用该版本的 API 中包含的 Android API 功能(显然还有所有以前的版本)。如果尝试使用 API 16 功能,但设置为 15,则会出现编译错误。如果设置为 16,只要应用的执行路径不尝试调用特定于 API 16 的任何 API,您仍然可以在 API 15 设备上运行应用。compileSdkVersion
compileSdkVersion
compileSdkVersion
targetSdkVersion
这与您的应用程序的编译方式或您可以使用哪些 API 无关。这应该表明您已经在您指定的版本上(可能达到并包括)测试了您的应用程序。这更像是您给 Android 操作系统的认证或签字,作为它应该如何处理您的应用程序在操作系统功能方面的提示。targetSdkVersion
targetSdkVersion
例如,如文档所述:
例如,将此值设置为“11”或更高,允许系统在 Android 3.0 或更高版本上运行时将新的默认主题 (Holo) 应用于您的应用。
Android 操作系统在运行时可能会根据此值更改应用的风格化或以其他方式在操作系统上下文中的执行方式。还有其他一些已知示例受此值的影响,并且该列表可能只会随着时间的推移而增加。
出于所有实际目的,大多数应用程序都希望设置为最新版本的 API。这将确保您的应用程序在最新的 Android 设备上看起来尽可能好。如果未指定 ,则默认为 。targetSdkVersion
targetSdkVersion
minSdkVersion
评论
targetSdkVersion
compileSdkVersion
targetSdkVersion
compileSdkVersion
compileSdkVersion
targetSdkVersion
compileSdkVersion
应该是最新的稳定版本。
应经过全面测试,并且小于或等于 。compileSdkVersion
targetSdkVersion
compileSdkVersion
评论
targetSdkVersion
targetSdkVersion
compileSdkVersion
The CompileSdkVersion
是您的应用用于编译等的 SDK 平台的版本 在开发过程中(应始终使用最新版本) 这是与您正在使用的 API 版本一起提供的
您将在文件中看到以下内容:build.gradle
targetSdkVersion:
包含您的应用在开发过程后附带的信息,以允许它 .根据应用的功能,它可以定位低于当前版本的 API。例如,即使当前版本为 23,也可以以 API 18 为目标。TARGET the SPECIFIED version of the Android platform
好好看看这个官方的谷歌页面。
评论
作为单行指南:
minSdkVersion <= targetSdkVersion <= compileSdkVersion
理想:
minSdkVersion (lowest possible) <= targetSdkVersion == compileSdkVersion (latest SDK)
从伊恩·莱克(Ian Lake)的这篇精彩文章中阅读更多内容
P.S. 正如@sshturma在下面的回答中剪辑的那样:
评论
minSdkVersion
can
minSdkVersion
minSdkVersion
compileSdkVersion
可以小于targetSdkVersion
迟到了..上面有几个很好的答案 - 本质上,是编译应用程序所针对的 API 版本,而 表示测试应用程序的版本。compileSdkVersion
targetSdkVersion
我想用以下注释来补充这些答案:
- 如果设备运行的是 Android 6.0(API 级别 23)或更高版本,并且应用的版本为 23 或更高版本,则应用会在运行时向用户请求权限。
targetSdkVersion
- 如果设备运行的是 Android 5.1(API 级别 22)或更低版本,或者应用的版本为 22 或更低版本,则系统会要求用户在安装应用时授予权限。
targetSdkVersion
如果 高于应用声明的版本,系统可能会启用兼容性行为,以确保应用继续按预期方式运行。(参考文献
compileSdkVersion
targetSdkVersion
)随着每个新的 Android 版本...
targetSdkVersion
应递增以匹配最新的 API 级别,然后在相应的平台版本上彻底测试您的应用程序compileSdkVersion
,另一方面,除非您添加新平台版本独有的功能,否则不需要更改- 因此,虽然通常(最初)小于 ,但看到一个维护良好/成熟的应用程序并不少见
targetSdkVersion
compileSdkVersion
targetSdkVersion > compileSdkVersion
评论
targetSdkVersion
compileSdkVersion
在之前的回答中,我看到了很多关于 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 功能。
评论
<uses-sdk>
我的 2 美分:针对任何版本的 SDK 进行编译,但注意不要调用您的“最低 SDK 版本”不支持的任何 API。这意味着您“可以”针对最新版本的 SDK 进行编译。
至于“目标版本”,它只是指您最初计划的目标,并且可能已经测试过。如果您还没有进行尽职调查,那么这是通知 Android 的方法,它需要在“奥利奥”上部署您的“棒棒糖”目标应用程序之前执行一些额外的检查。
所以“目标版本”显然不低于你的“最低SDK版本”,但不能高于你的“编译版本”。
评论
不回答您的直接问题,因为已经有很多详细的答案,但值得一提的是,与 Android 文档相反,Android Studio 建议对 和 使用相同的版本。compileSDKVersion
targetSDKVersion
Visual Studio 2017 (15.8.5)SQL 项目属性的应用程序设置将它们组合在一起:
compiledSdkVersion==>哪个版本的 SDK 应该将你的代码编译为字节码(在开发环境中使用) 要点:最好使用上一个版本的 SDK。
minSdkVersion==>这些项目用于安装APK(在生产环境中使用)。例如:
if(client-sdk-version < min-sdk-versoin )
client-can-not-install-apk;
else
client-can-install-apk;
快速摘要:
对于 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 版本上无法运行
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 提供的兼容性级别。
理想情况下,compileSdkVersion 和 targetSdkVersion 应相等,并且都指向最新的 SDK。但当然,只有在您测试该版本中引入的每个更改都能顺利地与您的应用程序一起运行之后!
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。
评论