最小 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 版本是 >= targetSdkVersion
,则表示 Android 系统打开特定(新)behavior
更改。 *请注意,即使认为targetSdkVersion
是<
,这些新行为也会默认开启,您应该阅读官方文档。
例如:
从 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 >= 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)