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


214

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

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


我目前正在开发一个应用程序,其中我使用targetsdkversion为12,并且所有布局都异常工作,然后我将其更改回23,它就像一个符咒,因此我认为targetsdk版本必须始终与编译版相同
Shahid Sarwar

Answers:


232

分SDK版本是Android SDK的最早发行您的应用程序都可以运行。通常这是由于较早的API存在问题,缺少功能或其他一些行为问题所致。

目标SDK版本为您的应用程序的版本针对上运行。理想情况下,这是因为某种最佳运行条件。如果要“使您的应用程序版本为19”,则将在此处指定。它可能在早期或更高版本上运行,但这是您的目标。这主要是为了指示您的应用程序在市场等方面的最新使用情况。

编译SDK版本是Android平台的IDE(或编译,我想等手段)使用,让您的应用程序时,您发布的版本.apk文件。这对于测试您的应用程序很有用,因为在开发应用程序时通常需要编译该应用程序。由于这是要编译为APK的版本,因此自然是您发布的版本。同样,建议使它与目标sdk版本匹配。


我的编译sdk版本和目标sdk版本相同。那是21.我的应用程序在API级别较低的设备上运行时崩溃。我是Android的新手,现在应该如何进行?
prgmrDev

2
@prgmrDev如果您的应用程序在低于21的版本上崩溃,则可能应将您的最小SDK版本设置为21。这实际上不会将应用程序固定在低于21的目标上,它只会指出您的应用程序在较低版本上不受支持。您还可以选择确定到底是什么在破坏您的应用程序(在版本21中进行了哪些更改),并添加支持以解决该依赖性问题,但是我怀疑这将需要大量工作,并且不属于Android初学者的范围。项目。
马特

1
如果我将minSdkVersion设置为14,会发生什么?targetSdkVersion = 23; 并将SDK编译为19?
thadeuszlay

5
@thadeuszlay您的问题是无关紧要的,因为您应该考虑一下,如果您打算在版本23上运行,那么怎么用19编译它!请遵循以下公式:minSdkVersion <= targetSdkVersion <= compileSdkVersion
阿萨德

@Matt会发生这种情况吗,例如在使用compileVersion 26时,我意外使用了版本21(min sdk)不支持的功能或Java API?抱歉,这里并没有真正了解一些基本概念
haart

83

公式是

minSdkVersion <= targetSdkVersion <= compileSdkVersion

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

targetSdkVersion-表示Android系统可以打开特定的行为更改。

例如:

  • 从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进行编译。当您想使用新功能或.java通过Android SDK 调试文件时,应注意compileSdkVersion。另一个示例是使用AndroidX,它强制使用compileSdkVersion级别28。compileSdkVersion 您的APK中未包含该代码:它纯粹用于compile time。更改compileSdkVersion不会更改运行时行为。例如,它可以生成新的编译器警告/错误。因此,强烈建议您始终使用最新的SDK进行编译。您将获得对现有代码进行新编译检查的所有好处,避免使用新近弃用的API,并准备使用新的API。还有一个事实是compileSdkVersion >= Support Library version

您可以在此处了解更多信息。另外,我建议您看一下迁移到Android 8.0 的示例。


9
最佳答案,因为它实际上解释了targetSdkVersion和compileSdkVersion之间的实际区别
Dean Wild

@ yoAlex5感谢您的回答。我看到很多情况下targetSdkVersion和compileSdkVersion相同。为什么android将两个分开,所以不能单独处理两个,或者在分成两个分开的字段后是否有任何特定的原因?
Manju


@ yoAlex5您的意思是“ Android系统可以打开特定的行为更改”,请您解释一下?
k_kumar

@atishr的“特定行为更改”列在“例如”块中
yoAlex5 '19

74

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

目标SDK版本就是Android的版本,您的应用程序创建来运行。

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

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


23
而当他们不是相同的优点/缺点时?
powder366 2015年

4

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.