关于android:compileSdkVersion和targetSdkVersion有什么区别?

What is the difference between compileSdkVersion and targetSdkVersion?

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

它只是说:

The compileSdkVersion property specifies the compilation target.

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

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

  • compileSdkVersion是构建应用程序时使用的编译器版本,而targetSdkVersion是"应用程序所针对的API级别"。 (如果是这种情况,我假设compileSdkVersion必须大于或等于targetSdkVersion
  • 他们的意思是一样的。"编译目标"=="应用程序所针对的API级别"
  • 别的什么?
  • 我看到之前已经问过这个问题,但是一个答案只引用了文档,这对我来说是不清楚的。


    compileSdkVersion

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

    targetSdkVersion

    targetSdkVersion与您的应用程序编译方式或可以使用的API无关。 targetSdkVersion应该表明您已经测试了您的应用程序(可能是最多包括)您指定的版本。这更像是一个认证或签名,你给Android操作系统作为一个提示,它应该如何处理你的应用程序的操作系统功能。

    例如,正如文档所述:

    For example, setting this value to"11" or higher allows the system to apply a new default theme (Holo) to your app when running on Android 3.0 or higher...

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

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


    作为一个oneliner指南:

    1
    minSdkVersion <= targetSdkVersion <= compileSdkVersion

    理想的情况是:

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

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


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


    游戏的后期..并且上面有几个很好的答案 - 基本上,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查看维护良好/已建立的应用程序并不罕见

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

    enter image description here

    您将在build.gradle文件中看到此信息:

    enter image description here

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

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


    我在之前的答案中看到了很多关于compiledSdkVersion的差异,所以我将在这里按照android的网页进行澄清。

    答 - Android说的是什么

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

    Selecting a platform version and API Level When you are developing
    your application, you will need to choose the platform version against
    which you will compile the application. In general, you should compile
    your application against the lowest possible version of the platform
    that your application can support.

    所以,根据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功能。


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

    至于"目标版本",它只是指你计划首先定位的目标并且可能已经过测试。如果您还没有完成尽职调查,那么这就是告知Android它需要执行一些额外检查才能在"Oreo"上部署您的"Lollipop"目标应用程序之前的方法。

    所以"目标版本"显然不低于"最低SDK版本",但它不能高于"编译版本"。


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

    enter image description here


    快速摘要:

    对于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版本上不执行


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

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

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

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

    enter image description here