最小SDK版本/目标SDK版本与编译SDK版本之间的区别是什么?

“最小sdk版本/目标sdk版本”和“编译sdk版本”有什么区别?我知道什么是最小和目标sdk的意思,但什么是编译sdk版本的意思?

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

168974 次浏览

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

目标SDK版本是你的应用程序创建运行的Android版本。

编译SDK版本构建工具用来编译和构建应用程序以便发布、运行或调试的Android版本。

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

最小SDK版本是您的应用程序可以在其上运行的Android SDK的最早版本。这通常是由于早期api的问题,缺乏功能,或其他行为问题。

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

当你发布一个.apk文件时,编译SDK版本是你的IDE(或其他编译方式)用来制作你的应用程序的android版本。这对于测试应用程序很有用,因为在开发应用程序时,编译应用程序是一个常见的需求。因为这将是要编译到APK的版本,所以它自然是您发布的版本。同样,最好让它与你的目标sdk版本相匹配。

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

你可以阅读更多关于它在这里。 另外,我建议你看一下迁移到Android 8.0的例子

< a href = " https://stackoverflow.com/a/49255626/4770877 " > [buildToolsVersion] < / >

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

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

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

参考-中等文章由Paulina Sadowska

  1. compileSdkVersion定义哪个Android SDK版本将被Gradle用来编译你的应用。

例如:

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

这里有一个简单明了的方法来理解——

minSdkVersion应该更低,以目标最大覆盖的android设备上的应用程序将被安装。

compileSdkVersion是必需的,而开发应用程序使用最新的和优化的android api。

tarketSkdVersion是android操作系统的最新/版本,你想在上面运行你的应用程序,以实现android资源的充分优化。

注-如有错误,请指正。 由于< / p >
之前的答案中有很多很好的解释,但没有链接到官方文档。如果好奇,请看 https://developer.android.com/guide/topics/manifest/uses-sdk-element: < / p >
  • minSdkVersion:

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

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

  • targetSdkVersion:

此属性通知系统您已经对进行了测试 目标版本和系统不应启用任何兼容性 行为来维持你的应用程序与目标的前向兼容性 的版本。应用程序仍然能够在旧版本上运行(down minSdkVersion)。< / p > 随着Android的每一个新版本的发展,一些行为甚至 外表可能会改变。但是,如果平台的API级别为 比应用程序的targetSdkVersion声明的版本高 系统可能启用兼容性行为,以确保您的应用程序 继续按您期望的方式工作。你可以禁用 的兼容行为,指定targetSdkVersion来匹配 运行它的平台的API级别。例如,设置 此值为“;11"或更高的值允许系统应用新的默认值 主题(Holo)到您的应用程序时,运行在android3.0或更高 当在大屏幕上运行时,也会禁用屏幕兼容模式 (因为对API级别11的支持隐式支持更大的屏幕)

因此,假设你开发应用程序时考虑了目标API,并且已经测试了所有东西的外观/行为都符合你的预期,特别是如果你试图使用这个API中引入的功能。此外,你的代码应该能够处理没有这个新功能的平台(直到你的minSdkVersion,例如检查你的代码处理丢失的api,你优雅地使用,等等)。但即使是更新的Android版本也可能会做一些事情来保持你的应用程序运行,否则如果操作系统没有启用“兼容性行为”,应用程序可能会崩溃或看起来更时髦。

参见https://developer.android.com/studio/build:

  • compileSdkVersion:

compileSdkVersion指定Gradle应该使用的Android API级别 这意味着你的应用程序可以使用包含的API特性

理想情况下,你应该设定目标&编译与最高版本相同的版本,当然您不必使用任何新特性。但是,在准备更新目标版本之前,您可能希望将目标版本保持在已经发布的旧版本上,同时使用更新的编译版本以获得更好的警告/错误。在过去的中,它还允许在他们的代码中使用更新的Java语言特性,并升级Android Gradle插件,独立于目标Android api。


最后,不要忘记谷歌最近的目标API水平要求,它基本上要求你在某个日期之前发布一个针对最新API级别的构建,如果你想在Play商店上使用比你的目标API更新的操作系统的用户仍然可用。这是为了激励应用程序开发社区提供更新的性能/安全增强(比如给用户当您请求位置信息时,更多隐私选项). properties)。

自9年以来发布的每个Android版本都列出了行为变化,这将影响所有应用程序,而不管你的targetSdkVersion(例如这是安卓12),以及当你专门针对它时发生的变化(例如行为改变:针对Android 12的应用。当下一个版本预览时,是开始检查即将发布的版本的应用程序的兼容性的好时机,即使只是在不改变compileSdkVersion的情况下,任何compat模式都可以,如果你还没有准备瞄准它。兼容性框架工具可以帮助解决这个问题,并帮助迁移到使用新的api。