我已经查看了使用 Gradle 构建的 documentation,但我仍然不确定 compileSdkVersion
和 targetSdkVersion
之间的区别是什么。
它说的是:
compileSdkVersion 属性指定编译目标。
那么,什么是“编译目标”?
我看到了两种可能的解释方式:
compileSdkVersion 是用于构建应用程序的编译器版本,而 targetSdkVersion 是“应用程序目标的 API 级别”。 (如果是这种情况,我会假设 compileSdkVersion 必须大于或等于 targetSdkVersion?它们的意思是一样的。“编译目标”==“应用程序目标的 API 级别”还有什么?
我看到之前有人问过 this question,但一个答案只是引用了文档,这对我来说是不清楚的。
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
。
作为单行指南:
minSdkVersion <= targetSdkVersion <= compileSdkVersion
理想情况下:
minSdkVersion (lowest possible) <= targetSdkVersion == compileSdkVersion (latest SDK)
Read more from this great post by Ian Lake
minSdkVersion
是否表示运行的最低设备 API 级别应用程序 can
?大概是因为它使用了从 minSdkVersion
开始提供的某些 API?
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
游戏迟到了.. 上面有几个很好的答案 - 本质上,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 的情况下看到维护良好/已建立的应用程序并不少见
targetSdkVersion
新,您可能会看到兼容性行为。我不相信它与 compileSdkVersion
有任何关系。
compileSdkVersion
应该是最新的稳定版本。 targetSdkVersion
应经过全面测试并且小于或等于 compileSdkVersion
。
targetSdkVersion
设置为较低的版本,最新的 API 版本可以像旧版本一样“表现”。因此,targetSdkVersion
应该是您已经测试过并且知道确切行为的那个,并且可以是 <= 最新的稳定版。
compileSdkVersion
应该是最新的稳定版本”应该加上“您使用 API 功能的”后缀。如果您只使用较低的 API 版本功能,那么针对 API 27(当今最新的稳定 API)进行编译是没有意义的。但是,最新的稳定版本可能包含一些自动变得更好的功能,例如增强的安全性或具有向后兼容性的高效编译。因此,建议使用最新的或至少最近的稳定版本,但它“应该[不] 是”本身的最新版本。
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。
我在以前的答案中看到了很多关于 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 功能。
<uses-sdk>
文档非常含糊不清。
我的 2 美分:针对任何版本的 SDK 进行编译,但注意不要调用您的“最低 SDK 版本”不支持的任何 API。这意味着您“可以”针对最新版本的 SDK 进行编译。
至于“目标版本”,它只是指您最初计划针对的目标并可能已经测试过的目标。如果您还没有进行尽职调查,那么这是通知 Android 需要执行一些额外检查的方法,然后才能在“Oreo”上部署您的“Lollipop”目标应用程序。
所以“目标版本”显然不低于你的“最低SDK版本”,但不能高于你的“编译版本”。
不回答您的直接问题,因为已经有很多详细的答案,但值得一提的是,与 Android 文档相反,Android Studio 建议对 compileSDKVersion
和 targetSDKVersion
使用相同的版本。
https://i.stack.imgur.com/lxWp6.png
compiledSdkVersion==> 哪个版本的 SDK 应该将您的代码编译为字节码(它在开发环境中使用)点:最好使用最新版本的 SDK。
minSdkVersion==> 这些项目用于安装 APK(在生产环境中使用)。例如:
if(client-sdk-version < min-sdk-versoin )
client-can-not-install-apk;
else
client-can-install-apk;
Visual Studio 2017 (15.8.5) 中 Android 项目属性的应用程序设置将它们组合在一起:
https://i.stack.imgur.com/RkYRn.png
快速总结:
对于 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 版本上不执行
不定期副业成功案例分享
targetSdkVersion
很可能会高于compileSdkVersion
,这是理所当然的。这意味着尽管您设计了一个以 API 16 为目标的应用程序,例如,它仍然在 API 21 (Lollipop) 上运行良好,您应该将targetSdkVersion
提高到 21 以表明 Android 操作系统可以应用任何 Lollipop-您的应用中可能存在的样式。compileSdkVersion
更改为更高版本意味着您希望使用仅包含在该特定版本中的一些新 API。如果您不打算在您的应用程序中使用任何 Lollipop 特定功能,那么实际上(通常)没有理由将compileSdkVersion
设置为 21。但是,您的应用程序可能会在 API 21 上按原样正常运行,因此您更改targetSdkVersion
以指示您的应用程序运行就像您在 API 21 上的预期(目标)一样,但您没有使用任何特定于 21(编译)的 API,因此您的compileSdkVersion
可以保留在本例中为 15。