我查看了使用Gradle构建的文档,但我仍然不确定compileSdkVersion和targetSdkVersion之间的区别是什么。
它只是说:
The compileSdkVersion property specifies the compilation target.
那么,"汇编目标"是什么?
我看到两种可能的解释方法:
compileSdkVersion是构建应用程序时使用的编译器版本,而targetSdkVersion是"应用程序所针对的API级别"。 (如果是这种情况,我假设compileSdkVersion必须大于或等于targetSdkVersion?
他们的意思是一样的。"编译目标"=="应用程序所针对的API级别"
别的什么?
我看到之前已经问过这个问题,但是一个答案只引用了文档,这对我来说是不清楚的。
-
更多细节:选择compileSdkVersion,minSdkVersion和targetSdkVersion
-
targetSdkVersion是您的设备运行的。 因此,如果您的设备运行低于奥利奥,那么不要以27为目标。
compileSdkVersion
compileSdkVersion是编译应用程序的API的版本。这意味着您可以使用该API版本中包含的Android API功能(以及所有以前的版本)。如果您尝试使用API?? 16功能但将compileSdkVersion设置为15,则会出现编译错误。如果将compileSdkVersion设置为16,只要应用程序的执行路径不尝试调用特定于API 16的任何API,您仍然可以在API 15设备上运行该应用程序。
targetSdkVersion
targetSdkVersion与您的应用程序编译方式或可以使用的API无关。 targetSdkVersion应该表明您已经测试了您的应用程序(可能是最多包括)您指定的版本。这更像是一个认证或签名,你给Android操作系统作为一个提示,它应该如何处理你的应用程序的操作系统功能。
例如,正如文档所述:
For example, setting this value to"11" or higher allows the system to apply a new default theme (Holo) to your app when running on Android 3.0 or higher...
Android OS在运行时可能会根据此值更改应用程序在操作系统上下文中的样式化或执行方式。还有一些受此值影响的其他已知示例,该列表可能只会随着时间的推移而增加。
出于所有实际目的,大多数应用程序都希望将targetSdkVersion设置为最新发布的API版本。这将确保您的应用在最新的Android设备上看起来尽可能好。如果未指定targetSdkVersion,则默认为minSdkVersion。
-
我懂了。所以targetSdkVersion永远不应该大于compileSdkVersion - 这是正确的吗?
-
不,targetSdkVersion很可能会高于compileSdkVersion并且理所当然。这意味着虽然您设计的应用程序以API 16为目标,但它仍可在API 21(Lollipop)上正常运行,您应该将targetSdkVersion提升到21以表明Android OS可以应用任何Lollipop-您的应用可能存在的样式。
-
您之前说过:"如果您尝试使用API?? 16功能但将compileSdkVersion设置为15,则会出现编译错误。"在你的第二个评论中,听起来你说compileSdkVersion可以是15,而targetSdkVersion可以(并且很可能)高于15,比如16.这是否意味着我已经"认证"该应用程序与API 16及其功能一起使用?
-
从根本上说,我不明白你如何定位比你编译的SDK更高的SDK。
-
将compileSdkVersion更改为更高版本意味着您要使用仅包含在该特定版本中的一些新API。如果您不打算在您的应用程序中使用任何Lollipop特定的功能,那么真的(通常)没有理由将compileSdkVersion设置为21.但是,您的应用程序可能会在API 21上运行正常,因此您更改targetSdkVersion表示您的应用程序在API 21上按预期(目标)运行,但您没有使用任何特定于21(编译)的API,因此在此示例中您的compileSdkVersion可以保持在15。
-
当我在Android studio中执行此操作时会报告警告。我有"compileSdkVersion 17"和"targetSdkVersion 22",它告诉我"targetSdkVersion不应该高于compileSdkVersion"。哦,刚改变它,现在它告诉我targetSdkVersion不是最新的22并且兼容模式可能会启动。叹气。
-
许多开发人员都希望设置compileSdkVersion 23但是暂时使用targetSdkVersion 22。 (请参阅@ jeff-mixon评论原因。)
-
我仍然没有100%得到compileSdkVersion的含义。让我说我有一个应用程序,我建立在API级别21.然后谷歌发布API 23.我编译我的应用程序对compileSdkVersion 23但是除了我的代码之外没有改变任何东西。我的应用会使用API?? 23中的新代码吗?我问,因为我很好奇错误修复会发生什么:让我们说我有一个方法DoStuff(),我在我的APP中使用。谷歌注意到它包含一个错误,他们为API修复了它。当我使用compileSdkVersion 23进行编译时,我的应用程序是否得到了错误修正?该SDK中的代码是否会编译到我的应用程序中?
-
@degill compileSdkVersion仅影响编译时间。设备的API级别决定了它最终运行的Android版本。在具有API 21的设备上运行compileSdkVersion 11的应用将运行所有Android API的版本21。 compileSdkVersion纯粹是为了编译器;在您的应用程序已构建完成后,它不会影响任何内容。
-
当你将targetSdkVersion设置为高于compileSdkVersion时,它在android studio中清楚地说明了。"targetSdkVersion不应该高于compileSdkVersion"
-
这个答案与Android Studio所说的相矛盾。 targetSdkVersion很重要,它应该小于或等于compileSdkVersion
-
为方便起见,这只是Gradle检查提示。设置targetSdkVersion高于compileSdkVersion时没有实际的技术问题。与此同时,只要你理解其含义,将compileSdkVersion设置为最高级别也不会造成太大伤害。
-
"请注意,如果您使用支持库,则使用最新的SDK进行编译是使用最新支持库版本的必要条件。"来源:medium.com/google-developers/
-
我不明白你的答案的这一部分:"只要你的应用程序执行路径不试图调用任何特定于API 16的API"。将compileSdkVersion设置为16在API 15设备上运行应用程序是否安全?
-
最重要的问题是 - 在Google Play中永远不会降级的compileSdkVersion或targetSdkVersion?
-
"这意味着您可以使用该API版本中包含的Android API功能(以及所有以前的版本)。"我不认为你可以使用以前版本中包含的所有功能是正确的。如果方法在15中存在(但已弃用),然后在16中删除,则如果compileSdkVersion设置为16或更大,则无法使用它。
-
在Android Studio中,如果我设置compileSdkVersion低于targetSdkVersion,那么AS告诉我这是不允许的,所以在我看来你不应该像上面提到的那样设置compiled < target ...(@Jeff Mixon?)
-
我挣扎着"编译反对"这句话。对我来说,这听起来像是意味着,"编译器出来的字节代码是这个版本"。但它似乎被用作"使用的编译器的版本是这个版本"。这完全改变了意义。我想象一个较新的编译器可以生成反向兼容的字节代码,但较新的字节代码不能在较旧的OS上运行。
作为一个oneliner指南:
1
| minSdkVersion <= targetSdkVersion <= compileSdkVersion |
理想的情况是:
1
| minSdkVersion (lowest possible) <= targetSdkVersion == compileSdkVersion (latest SDK) |
阅读伊恩湖的这篇精彩文章
-
minSdkVersion 是否意味着运行的最低设备api级别app can?大概是因为它使用了从minSdkVersion开始提供的某些API?
-
@NitinBansal是的。例如,如果minSdkVersion为15(即ICS 4.0.3),则具有API 14(ICS 4.0)的设备应该无法安装该应用程序。至少现在,该应用程序将运行15,16,17,18,19,(20但旧的磨损操作系统),21,22,23,24,25,26,27,28等等在未来(可能)
compileSdkVersion应该是最新的稳定版本。
targetSdkVersion应该经过全面测试,小于或等于compileSdkVersion。
-
说targetSdkVersion小于compileSdkVersion的任何具体原因?我认为这是一个错误的陈述
-
我想重点是最后一个版本是向后兼容的,所以如果你将targetSdkVersion设置为较低的版本,最新的API版本可以像旧版本一样"行为"。所以targetSdkVersion应该是你测试过的并且知道确切的行为,并且可以是<=最新的稳定。
-
我认为你的语句compileSdkVersion应该是最新的稳定版本,应该加上你使用API??功能的后缀。如果您只使用较低的API版本功能,则针对API 27(今天最新的稳定API)进行编译是没有意义的。但是,最新的稳定版本可能包括一些自动变得更好的功能,例如通过向后兼容性增强安全性或高效编译。因此,建议使用最新版本或至少是最近的稳定版本,但它本身应该是[不]最新版本。
游戏的后期..并且上面有几个很好的答案 - 基本上,compileSdkVersion是应用程序编译的API的版本,而targetSdkVersion表示应用程序被测试的版本。
我想用以下注释补充这些答案:
targetSdkVersion会影响请求权限的方式:
-
如果设备运行的是Android 6.0(API级别23)或更高版本,且应用程序的targetSdkVersion为23或更高,则应用程序会在运行时请求用户的权限。
-
如果设备运行的是Android 5.1(API级别22)或更低版本,或者应用程序的targetSdkVersion为22或更低,系统会要求用户在用户安装应用程序时授予权限。
如果compileSdkVersion高于应用程序targetSdkVersion声明的版本,系统可能会启用兼容性行为,以确保您的应用程序继续以您期望的方式工作。 (参考文献)
每个新的Android版本......
-
应增加targetSdkVersion以匹配最新的API级别,然后在相应的平台版本上彻底测试您的应用程序
-
另一方面,除非您添加新平台版本独有的功能,否则不需要更改compileSdkVersion
-
因此,虽然targetSdkVersion通常(最初)小于compileSdkVersion,但是通过targetSdkVersion > compileSdkVersion查看维护良好/已建立的应用程序并不罕见
-
Re:你的第二点,我不认为参考文献明确说明了这一点。它说"但是,如果平台的API级别高于您的应用程序targetSdkVersion声明的版本,系统可能会启用兼容性行为,以确保您的应用程序继续以您期望的方式工作。"我认为这意味着如果您运行的设备的API级别比targetSdkVersion更新,您可能会看到兼容性行为。我不相信它与compileSdkVersion有任何关系。
The CompileSdkVersion是您的应用程序用于编译等的SDK平台的版本。在开发过程中(您应该始终使用最新版本)这是随您使用的API版本一起提供的
您将在build.gradle文件中看到此信息:
targetSdkVersion:包含您的应用在应用商店开发过程后附带的信息,允许其TARGET the SPECIFIED version of the Android platform。根据应用程序的功能,它可以定位低于当前版本的API版本。例如,即使当前版本为23,您也可以定位API 18。
仔细看看这个官方Google页面。
我在之前的答案中看到了很多关于compiledSdkVersion的差异,所以我将在这里按照android的网页进行澄清。
答 - Android说的是什么
根据https://developer.android.com/guide/topics/manifest/uses-sdk-element.html:
Selecting a platform version and API Level When you are developing
your application, you will need to choose the platform version against
which you will compile the application. In general, you should compile
your application against the lowest possible version of the platform
that your application can support.
所以,根据Android,这将是正确的顺序:
compiledSdkVersion = minSdkVersion <= targetSdkVersion
B - 其他人也说了什么
有些人更喜欢总是使用可用的最高编译的SDDVersion。这是因为他们将依赖代码提示来检查他们是否使用比minSdkVersion更新的API功能,因此要么更改代码以不使用它们,要么在运行时检查用户API版本以有条件地使用它们与旧API版本的回退。
有关弃用用途的提示也会出现在代码中,让您知道某些内容在较新的API级别中已弃用,因此您可以根据需要做出相应的反应。
所以,根据其他人的说法,这将是正确的顺序:
minSdkVersion <= targetSdkVersion <= compiledSdkVersion (highest possible)
该怎么办?
这取决于你和你的应用程序。
如果您计划在运行时根据用户的API级别提供不同的API功能,请使用选项B.您将获得有关编码时使用的功能的提示。只需确保在运行时没有检查用户API级别就不会使用比minSdkVersion更新的API功能,否则您的应用程序将崩溃。这种方法还有一个好处,就是在编码时学习新的东西和旧的东西。
如果您已经知道新的或旧的,并且您正在开发一个肯定永远不会更新的一次性应用程序,或者您确定不会有条件地提供新的API功能,那么请使用选项A.您将不会受到打扰使用已弃用的提示,即使您有诱惑,也永远无法使用较新的API功能。
-
我不认为Android的建议是不同的。"将应用程序与最低版本编译"并使用特定SDK版本进行编译之间存在差异。您通常应该使用最新版本编译(compileSdkVersion),将您的min(minSdkVersion)设置为尽可能低,并根据测试或其他兼容性问题将目标(targetSdkVersion)设置为尽可能高。
-
好点@Caltor。我希望他们能够更新该文件以澄清其中的差异。 文档非常模糊和含糊不清。
我的2美分:针对任何版本的SDK进行编译,但请注意不要调用任何"最低SDK版本"不支持的API。这意味着您"可以"针对最新版本的SDK进行编译。
至于"目标版本",它只是指你计划首先定位的目标并且可能已经过测试。如果您还没有完成尽职调查,那么这就是告知Android它需要执行一些额外检查才能在"Oreo"上部署您的"Lollipop"目标应用程序之前的方法。
所以"目标版本"显然不低于"最低SDK版本",但它不能高于"编译版本"。
没有回答你的直接问题,因为已经有很多详细的答案,但值得一提的是,与Android文档相反,Android Studio建议对compileSDKVersion和targetSDKVersion使用相同的版本。
快速摘要:
对于minSDKversion,请参阅twitter句柄中的最新条目:https://twitter.com/minSdkVersion
TargetSDKversion:请参阅twitter句柄中的最新条目:https://twitter.com/targtSdkVersion
或使用devel https://developer.android.com/guide/topics/manifest/uses-sdk-element.html中指出的最新API级别
编译版本:
使其与TargetSDKversion相同
maxSdkVersion:
来自Android的建议是不要设置它,因为你不想限制你的应用程序在未来的Android版本上不执行
compiledSdkVersion ==>哪个版本的SDK应该将你的代码编译成字节码(它在开发环境中使用)点:最好使用最新版本的SDK。
minSdkVersion ==>这些项用于安装APK(它在生产环境中使用)。例如:
1 2 3 4
| if(client-sdk-version < min-sdk-versoin )
client-can-not-install-apk;
else
client-can-install-apk; |
Visual Studio 2017(15.8.5)中Android项目属性的应用程序设置似乎将它们组合在一起: