最小 SDK 版本/目标 SDK 版本与编译 SDK 版本有啥区别?

Posted

技术标签:

【中文标题】最小 SDK 版本/目标 SDK 版本与编译 SDK 版本有啥区别?【英文标题】:What is the difference between min SDK version/target SDK version vs. compile SDK version?最小 SDK 版本/目标 SDK 版本与编译 SDK 版本有什么区别? 【发布时间】:2014-08-22 00:15:25 【问题描述】:

“min sdk version/target sdk version”和“compile sdk version”有什么区别?我知道 min 和 target sdk 是什么意思,但是 compile sdk version 是什么意思?

在 Eclipse 中,我有 min/max 和 target sdk,但在 android studio 中有这三个设置。

【问题讨论】:

我目前正在开发一个应用程序,我使用 targetsdkversion 作为 12 并且我的所有布局都非常不正常,然后我将其更改回 23,它就像一个魅力,所以我认为 targetsdk 版本必须始终相同作为编译版本 相关帖子 - What is the difference between compileSdkVersion and targetSdkVersion? 【参考方案1】:

min sdk 版本是您的应用程序可以在其上运行的 Android SDK 的最早版本。这通常是因为早期 API 存在问题、缺少功能或其他一些行为问题。

目标 sdk 版本是您的应用程序目标运行的版本。理想情况下,这是因为某种最佳运行条件。如果你要“为版本 19 制作你的应用程序”,这就是要指定的地方。它可能在早期或以后的版本上运行,但这是您的目标。这主要是为了表明您的应用程序在市场上的使用情况等。

编译 sdk 版本是您的 IDE(或我想的其他编译方式)在您发布 .apk 文件时用于制作应用程序的 android 版本。这对于测试您的应用程序很有用,因为在开发应用程序时编译您的应用程序是一种常见的需求。由于这将是编译为 APK 的版本,因此它自然是您发布的版本。同样,建议将此匹配您的目标 sdk 版本。

【讨论】:

我的编译sdk版本和目标sdk版本是一样的。那是 21。当我在 API 级别较低的设备上运行它时,我的应用程序崩溃了。我是 Android 新手,现在应该如何进行? @prgmrDev 如果您的应用在低于 21 的版本上崩溃,您可能应该将最低 SDK 版本设置为 21。这实际上不会在低于 21 的目标上修复您的应用,它只会注意到您的应用程序在较低版本上不受支持。您还可以选择确定究竟是什么破坏了您的应用程序(版本 21 中发生了哪些变化)并添加支持以处理该依赖项,但我怀疑这将是很多工作并且不在 Android 初学者的范围内项目。 如果我设置我的 minSdkVersion =14 会发生什么; targetSdkVersion=23;并将SDK编译到19? @thadeuszlay 您的问题无关紧要,因为您应该考虑一下,如果您的目标是在版本 23 上运行,那么如何用 19 编译它!请遵循公式 minSdkVersion 我不明白“目标 sdk 版本是您的应用程序目标运行的版本”。因为我从不定位特定的 API 级别,因为我应该这样做并且我必须让我的应用在具有各种 API 级别的一系列设备上正常运行。【参考方案2】:

minSdkVersion、targetSdkVersion、compileSdkVersion

公式是

minSdkVersion <= targetSdkVersion <= compileSdkVersion

minSdkVersion - 是一个标记,它定义了可以安装应用程序的最低 Android 版本。此外,Lint 使用它来防止调用不存在的 API。此外,它对构建时间有影响。因此,您可以在开发过程中使用构建风格将 minSdkVersion 覆盖到最大值。使用 Android 团队为我们提供的所有改进将有助于加快构建速度。例如,Java 8 的某些功能只有在您使用特定版本的 minSdkVersion 时才可用。

targetSdkVersion - 如果 AndroidOS 版本是 &gt;= targetSdkVersion,则表示 Android 系统打开特定(新)behavior 更改。 *请注意,即使认为targetSdkVersion&lt;,这些新行为也会默认开启,您应该阅读官方文档。

例如:

从 Android 6.0(API 级别 23)开始,引入了 Runtime Permissions。如果您将 targetSdkVersion 设置为 22 或更低,您的应用程序不会在运行时向用户请求某些权限。

从 Android 8.0(API 级别 26)开始,所有notifications 都必须分配给一个频道,否则它不会出现。在运行 Android 7.1(API 级别 25)及更低版本的设备上,用户只能基于每个应用管理通知(实际上每个应用在 Android 7.1 及更低版本上只有一个通道)。

从 Android 9(API 级别 28)开始,Web-based data directories separated by process。如果 targetSdkVersion 是 28+ 并且您在不同的进程中创建了多个 WebView,您将得到 java.lang.RuntimeException

compileSdkVersion - 实际上它是 SDK 平台版本,并告诉 Gradle 使用哪个 Android SDK 进行编译。当您想使用新功能或从 Android SDK 调试 .java 文件时,您应该注意 compileSdkVersion。另一个例子是使用AndroidX,它强制使用compileSdkVersion - 级别28。compileSdkVersion 不包含在您的APK中:它纯粹用于compile time。更改 compileSdkVersion 不会更改运行时行为。例如,它可以生成新的编译器警告/错误。因此强烈建议您始终使用最新的 SDK 进行编译。您将获得对现有代码的新编译检查的所有好处,避免新弃用的 API,并准备好使用新的 API。还有一个事实是compileSdkVersion &gt;= Support Library version

您可以阅读更多关于它的信息here。 另外,我建议您看一下migration 到 Android 8.0 的示例。

[buildToolsVersion]

【讨论】:

最佳答案在这里,因为它实际上解释了 targetSdkVersion 和 compileSdkVersion 之间的实际区别 @yoAlex5 感谢您的回答。我看到很多情况 targetSdkVersion 和 compileSdkVersion 是相同的。为什么android将两个分开的不能一个足以处理,或者有什么特定的原因导致两个分开的字段? @Manju 您可以在 SO 线程 ***.com/questions/26694108/…中找到更多信息 @yoAlex5 你是什么意思'Android系统开启特定行为改变'你能解释一下吗? @atishr '特定行为变化'列在'例如'块中【参考方案3】:

最低 SDK 版本是运行您的应用程序所需的最低 Android 操作系统版本。

目标 sdk 版本是创建您的应用以运行的 Android 版本。

compile sdk 版本是 build tools 用于编译和构建应用程序以发布、运行或调试的 Android 版本。

通常编译的sdk版本和目标sdk的版本是一样的。

【讨论】:

当它们的优缺点不同时?【参考方案4】:

compileSdkVersion :compileSdkVersion 是编译应用程序所针对的 API 版本。这意味着您可以使用该 API 版本中包含的 Android API 功能(当然,也可以使用所有以前的版本)。如果您尝试使用 API 16 功能但将 compileSdkVersion 设置为 15,您将收到编译错误。如果您将 compileSdkVersion 设置为 16,您仍然可以在 API 15 设备上运行应用程序。

minSdkVersion:min sdk 版本是运行您的应用程序所需的 Android 操作系统的最低版本。

targetSdkVersion :目标 sdk 版本是您的应用要运行的版本。

【讨论】:

最简洁直接的解释!谢谢!【参考方案5】:

Reference- Medium Article by Paulina Sadowska

    compileSdkVersion 定义 Gradle 将使用哪个 Android SDK 版本来编译您的应用。

例如:

在 Android 12 中,因此在 SDK 版本 31 中,引入了一个新的 API,使我们能够轻松实现启动画面。在这个新 API 中,可以使用这些属性自定义启动画面:

如果您想在您的应用中使用该 API,您首先必须:

i)  download SDK version 31 in Android Studio,
ii) and then: update compileSdkVersion to 31 in your app.

只有这样您才能看到这些新属性。只有这样,您才能在代码中使用这个新的初始屏幕 API。

2.targetSdkVersion 是一个属性,它告诉系统应用程序是在哪个 Android 版本上设计和测试的。

如果用户在 android 版本高于您应用中定义的 targetSdkVersion 的设备上运行您的应用,对于新的 android 功能,系统可能会引入一些向后兼容的行为,以确保您的应用仍然可以正常运行一种你设计的方式。

例如:

在 Android 12 中,自定义通知的外观发生了变化。以前他们可以使用整个通知区域,但在 Android 12 中,系统将标准模板应用于所有自定义通知,因此它们看起来更加一致。 如果您的 targetSdkVersion 低于 31,系统将假定您尚未测试该功能,并将以旧方式显示通知,以最大程度地降低通知无法正确显示的风险。只有在您将目标 SDK 版本更新到 31 后,才会使用新的通知外观。

【讨论】:

【参考方案6】:

这里有一个清晰易懂的小方法-

minSdkVersion 应该较低,以针对将安装应用程序的 Android 设备的最大覆盖范围。

compileSdkVersion 在开发应用程序以使用最新的和优化的 android API 时是必需的。

tarketSkdVersion 是您希望在其上运行应用程序以实现对 android 资源的全面优化的最新/版本的 android 操作系统。

注意-如果有错误请纠正我。 谢谢

【讨论】:

以上是关于最小 SDK 版本/目标 SDK 版本与编译 SDK 版本有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

VS2017新建或拷贝项目编译时出现:找不到 Windows SDK 版本8.1.请安装所需的版本的 Windows SDK

修改Android Studio默认的API Level(SDK版本)

混淆谷歌播放控制台中的版本控制

[转载]Android studio 修改最小SDK版本(minSdkVersion)

我还能将 iOS 3.2 SDK 编译的应用程序上传到 iTunesConnect

Cordova 10 不支持目标 SDK 版本