Eclipse中的“构build目标SDK”和AndroidManifest.xml中的android:targetSdkVersion之间的区别?

当我将一个现有的Android项目导入到Eclipse中时,我被要求select一个SDK构build目标作为这个过程的一部分。

为什么我需要input这些信息? 这与AndroidManifest.xml指定的android:targetSdkVersion/android:minSdkVersion值有何不同?

例如,在Google IO示例应用程序中,其AndroidManifest中的android:targetSdkVersion=11 ,但是自述文件显示Eclipse项目需要将API级别设置为13或更高,否则将发生编译错误。

Solutions Collecting From Web of "Eclipse中的“构build目标SDK”和AndroidManifest.xml中的android:targetSdkVersion之间的区别?"

清单文件中的android:minSdkVersion意味着市场将过滤较低sdk的设备。

在项目属性文件中的target=android-x意味着Eclipse将不允许使用sdk比x更高的方法或类。 它会显示编译器错误。

您可以像这样使用它:在清单中提供最小版本 – 取决于您的应用程序的关键function。 将相同的值设置为项目属性。 然后,如果您想使用来自更高SDK的某处API – 在项目属性中引发价值,并且检查设备API是否可以执行以下代码,

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR_MR1) { // here you can use APIs, that appears in Android 2.1 } 

以下是每个属性的描述,正是它所控制的内容,以及如何使用它。

AndroidManifest.xml

  • midSdkVersion由Google Play市场使用。 您将允许应用运行的最低API。 运行Android以上版本的设备将不被允许安装您的应用程序。 将其设置为您的代码可以支持的最低版本的Android(即,不使用任何API调用,而不需要特别注意向后兼容性)。 当然,您应该在运行此版本的设备或模拟器上进行testing。

    Google提供了一个仪表板,让您了解每个版本使用人数的细目,在决定是否停止支持某个版本时,这可能非常有用。

    注意:如果您正在使用任何android-support库,则不应使用比支持库名称中指示的版本旧的版本。 例如, android-support-v4.jar将不能在比4岁以前的Android版本上运行。

  • targetSdkVersion运行时由设备使用。 设备使用它来决定是否以向后兼容模式运行你的应用程序。 例如,如果将此设置为10(姜饼),则运行16(Jelly Bean)的设备仍将使用姜饼的视觉样式作为应用程序; 例如它将有一个标题栏而不是一个操作栏。 将其设置为最新版本的Android,您希望您的应用程序看起来像(您只能通过在较新的版本上testing它来确定它是否看起来不错并且performance良好)。

project.properties ,或通过Eclipse的Project Build Target设置进行设置:

  • target在编译时由您的计算机使用。 您的应用程序编译的Android版本。 尝试使用比这更新的APIfunction将导致错误。 您应该将其设置为与minSdkVersion相同,除非您为了向后兼容(请参见下文)做特殊的事情,以便编译器将防止您意外使用用户旧设备上不存在的function(导致其崩溃) 。

    注意:您所包含的图书馆项目可能需要此值的最小值。 例如, android-support-v7-appcompat包含res/layout-v14中的.xml资源文件,这些文件要求您根据API 14或更新版本进行编译。

关于向后兼容的说明

minSdkVersion project.properties应该高于minSdkVersion :当你想使用更新的APIfunction,但是你包含了特殊的向后兼容代码,以便它可以在老设备上运行。 在这种情况下,您必须将project.properties碰撞到包含您所使用的所有function的最旧API。

在可能的情况下,使用Android支持库来实现向后兼容性,因为它是传统的,经过良好testing的,易于使用,并允许您单独离开project.properties 。 但是,有时支持库不能满足您的需求,在这种情况下,您将不得不使用诸如此类的技术

问题的核心是:项目清单中声明的​​targetSdkVersion值与Eclipse项目的Project / Properties / Android对话框中select的Project Build Target之间的关系是什么,该项目select您的应用程序的SDK级别编译?

minSdkVersion值是分散您的问题; 这必须小于或等于targetSdkVersion,但是与Project Build Target没有直接关系。 关系在targetSdkVersion和Project Build Target之间。

经过仔细考虑(你必须自己判断我是否有这个权利),我已经得出结论,targetSdkVersion和Project Build Target应该总是被设置为相同的API级别。 我的推理分为两部分。

**首先,我认为Project Build Target永远不能低于targetSdkVersion:

当您将targetSdkVersion设置为某个API级别时,通常会执行此操作,以便使用该级别首先可用的某些APIfunction。 您可能决定将版本支持回早期的minSdkVersion,并检测那些早期版本中没有的targetSdkVersionfunction的可用性,并编写支持这些早期版本的替代代码,但是您设置targetSdkVersion的原因是获取可用于该API级别的function。

由于您显然想要访问在targetSdkVersion API级别首次引入的一些function,因此您可以将Project Build Target设置为与targetSdkVersion中指定的API级别相同。 否则,您正在编译的API将不包含将targetSdkVersion设置为您select的级别的APIfunction。

所以,显然,你不想设置你的Project Build Target 低于你的targetSdkVersion。 但是你会想要把它设置得更高吗? 这使我们接受了第二部分的论证:

**其次,我会争辩说,Project Build Target不应该高于targetSdkVersion:

您不希望select高于targetSdkVersion的项目构build目标,因为那意味着您可能无意中使用了构build目标的SDK提供的一些function,这些function在声明的targetSdkVersion级别上不可用;如果您确实使用了这些function,如果您的应用程序在较早版本(比构build目标)Android版本中运行,那么它们将不可用,并且您的应用程序可能会因此而崩溃。

现在,如果您的应用程序致力于检测这些缺失的特征本身并处理它们的缺失,则可以将targetSdkLevel设置为Project Build Target的级别,因为这正是targetSdkLevel的含义(即您正在检测并处理targetSdkLevel中出现但不存在于minSdkLevel的任何API特性),所以如果你这样做了,那么没有理由把你的targetSdkLevel设置为你在代码中以这种方式支持的最高级别(即,到项目build设目标的水平)。

[好吧,我刚刚find一个“理由”将Project Build Level设置为高于targetSdkLevel。 API级别16和更高版本的默认软键盘是越野车(它的退格键不能正常工作),所以我把我的targetSdkLevel降到15,使键盘消失。 我本来可以把我的Project Build Target改为15,但是我没有这样做,因为我想要最新的代码,理论上说最近一般是“改进”,因此“更好”。 这也许是迷信。 尽pipe有这个例外,上面的论点通常是有效的。]

在这方面,我会注意到,官方文档声明:“当你正在开发你的应用程序时,你将需要select你将编译应用程序的平台版本。一般来说,你应该尽可能低的编译你的应用程序您的应用程序可以支持的平台版本。“

http://developer.android.com/guide/topics/manifest/uses-sdk-element.html

这似乎表明,你应该编译一个项目构build目标,它等于minSdkVersion而不是targetSdkVersion,这与我上面提到的相反。 我列出了赞成targetSdkVersion而不是这个的原因。 具体来说,如果您正在尝试使用targetSdkVersion中存在的function,而不是minSdkVersion中的function,那么如果您正在编译vs minSdkVersion,您将如何做到这一点? 当然,您的应用程序将在minSdkVersion上运行,因为您将testing这些function的可用性(例如,通过reflection),但即使您的应用程序正在最新运行,您也不会拥有这些新的API元素Android的版本,如果你编译与SDK的minSdkVersion级别。

所以,Project Build Target应该总是和targetSdkVersion一样; 那是我的论点。 我找不到任何清楚说明这种关系的材料,所以以上是由我推断的,并没有任何权威来源的支持,实际上上述官方来源的说法似乎与我的立场相矛盾, 因此鼓励和期望评论。

AFAIK, android:minSdkVersion和Eclipse在设置项目时要求你select的是一样的。 但是, android:targetSdkVersion是您希望您的应用程序针对市场上可用的特定SDK版本的Android。

例如,你可能有你的android:minSdkVersion="8" (Eclipse在设置你的项目时问你的那个),因为你希望你的应用程序在Froyo的设备上运行(还有更高版本的Android )。 但是,您可能希望您的应用程序真正定位到GingerBread用户或HoneyComb用户或ICS用户。

编辑:请记住,您的targetSdkVersion必须等于或超过minSdkVersion 。 否则,这没有什么意义。

我并不是说Eclipse的构build目标应该设置为小于minSdkVersion。 我问为什么Eclipse不会自动使用minSdkVersion或targetSdkVersion作为其构build目标SDK。 为什么你会想把它设置成不同的东西?

称之为function。 eclipse并不是专门为androiddevise的。 如果没有人想添加一个自动化来使用清单中给出的sdk版本,那么简单地eclipse就不会这样做。 我不认为这背后有太多的魔力。 我认为它只是没有添加到eclipsefunction的eclipse / android插件。

另外,因为你总是可以改变清单中的sdk版本,所以在eclipse中也是灵活的(你总是可以通过项目的属性来改变eclipse sdk target)。 像其他人张贴有时候清单sdk可能不同于eclipse sdk。 (多sdk版本的支持)。 使用更低的清单中的min-sdk没有任何意义,但是在这里可以获得:如果没有人为eclipse插件编写检查器来检查你正在做的事情是否有意义,那么这将是可能的。

伙计们,我做了一些这些testing,find下面的答案:

minSDKVersion – 应用程序不会运行在该SDK下面

targatSDKVersion – 应用程序运行时环境。 对于前应用程序有最新的SDK在设备说21,但你设置目标SDK版本19这意味着当应用程序运行在此设备运行时(主题和其他用户界面/类)将19。

项目构build目标 – 当你select一个项目构build目标版本,这意味着你是apk或类将根据选定的sdk编译。 对于前 – 如果你select项目构build目标16,并尝试使用@JavaScriptInterface的注释,它不会find,因为这个注释是可用的目标上方。

maxSDKVersion – 这意味着应用程序不会安装在sdk上面。

每个android版本都被分配给android:targetSdkVersion。 较高版本的项目不能在较低版本的仿真器上运行,但是反之亦然。 确保您的sdk已更新,并尝试将项目更改为相应的版本