ChatGPT解决这个技术问题 Extra ChatGPT

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

“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 版本必须始终与编译版本相同

M
Matt

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

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

compile sdk version 是您的 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 <= targetSdkVersion <= compileSdkVersion
我不明白“目标 sdk 版本是您的应用程序要运行的版本”。因为我从不针对特定的 API 级别,因为我应该这样做并且我必须让我的应用程序在一系列具有各种 API 级别的设备上正常运行。
y
yoAlex5

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)开始,引入了运行时权限。如果您将 targetSdkVersion 设置为 22 或更低,您的应用程序不会在运行时向用户请求某些权限。

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

从 Android 9(API 级别 28)开始,基于 Web 的数据目录由进程分隔。如果 targetSdkVersion 为 28+,并且您在不同的进程中创建了多个 WebView,您将获得 java.lang.RuntimeException

compileSdkVersion - 实际上它是 SDK 平台版本,并告诉 Gradle 使用哪个 Android SDK 进行编译。当您想使用新功能或从 Android SDK 调试 .java 文件时,您应该注意 compileSdkVersion。另一个示例是使用强制使用 compileSdkVersion - 级别 28 的 AndroidXcompileSdkVersion不包含在您的 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 线程 stackoverflow.com/questions/26694108/… 中找到更多信息
@yoAlex5 你的意思是'Android 系统开启特定的行为改变'你能解释一下吗?
@atishr '特定行为变化'列在'例如'块中
n
nbro

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

目标 sdk 版本是创建您的应用程序以在其上运行的 Android 版本。

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

通常编译 sdk 版本和目标 sdk 版本是相同的。


当它们不是相同的优点/缺点时?
V
Vinay John

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

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

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


最简洁直接的解释!谢谢!
N
Narendra_Nath

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 后,才会使用新的通知外观。


q
qix

早期答案中有很多很好的解释,但没有链接到官方文档。如果好奇,请参阅 https://developer.android.com/guide/topics/manifest/uses-sdk-element 了解:

minSdkVersion:

如果系统的 API Level 低于此属性中指定的值,Android 系统将阻止用户安装应用程序。

除此之外:如果您使用 NDK 运行本机代码,minSdkVersion 也会影响 NDK 的 API 可用性。 (https://developer.android.com/ndk/guides/sdk-versions)

目标SDK版本:

此属性通知系统您已针对目标版本进行了测试,并且系统不应启用任何兼容性行为来保持您的应用程序与目标版本的前向兼容性。该应用程序仍然能够在旧版本上运行(低至 minSdkVersion)。随着 Android 随着每个新版本的发展,某些行为甚至外观可能会发生变化。但是,如果平台的 API 级别高于您应用的 targetSdkVersion 声明的版本,系统可能会启用兼容性行为,以确保您的应用继续按照您期望的方式运行。您可以通过指定 targetSdkVersion 以匹配其运行平台的 API 级别来禁用此类兼容性行为。例如,将此值设置为“11”或更高允许系统在 Android 3.0 或更高版本上运行时将新的默认主题 (Holo) 应用到您的应用程序,并且还可以在大屏幕上运行时禁用屏幕兼容模式(因为支持 API 11 级隐式支持更大的屏幕)。

因此,假设您在开发应用程序时考虑了目标 API,并测试了一切看起来/行为都符合您的预期,尤其是如果您尝试使用此 API 中引入的功能。此外,您的代码应该能够处理没有该新功能的平台(直到您的 minSdkVersion,例如检查您的代码是否处理您正常使用的缺失 API 等)。但即使是较新的 Android 版本也可能会做一些事情来保持您的应用程序运行,如果操作系统没有启用“兼容性行为”,这可能会破坏或看起来更时髦。

请参阅 https://developer.android.com/studio/build 了解:

compileSdkVersion:

compileSdkVersion 指定 Gradle 用于编译您的应用程序的 Android API 级别。这意味着您的应用可以使用此 API 级别及更低级别中包含的 API 功能。

理想情况下,你会设定目标 &编译版本与最高版本相同,当然您不必使用任何新功能。但是您可能希望将您的目标保持在您已经发布的旧版本,同时使用更新的编译版本以获得更好的警告/错误,直到您准备好更新目标版本。在 the past 中,它还允许人们通过 Android Gradle 插件升级在其代码中使用更新的 Java 语言功能,而与目标 Android API 无关。

最后,不要忘记 Google 最近的 target API level requirements,如果您希望 Play 商店中使用操作系统比您的目标 API 更新。这是为了激励应用开发社区提供更新的性能/安全增强功能(例如为用户提供 more privacy options when you request location info).

自 9 年以来发布的每个 Android 版本都列出了将影响所有应用的行为变化,无论您的 targetSdkVersion(例如 here's Android 12's)如何,以及您专门针对它时发生的变化(例如 Behavior changes: Apps targeting Android 12)。下一个版本是预览版是开始检查您的 app's compatibility 与即将发布的版本的好时机,即使只是在不更改 compileSdkVersion 的情况下任何兼容模式都可以,如果您还没有准备好定位它。 Compatibility framework tools 可以帮助解决这个问题并帮助您迁移到使用新的 API。


A
Ajay Vishwakarma

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

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

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

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

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