当我将现有的Android项目导入Eclipse时,我被要求选择SDK构建目标作为该过程的一部分。
为什么我需要输入此信息?
这与android:targetSdkVersion/android:minSdkVersion
中指定的AndroidManifest.xml
值有什么不同?
例如,在Google IO示例应用中,其AndroidManifest显示android:targetSdkVersion=11
,但README表示Eclipse项目需要针对API级别13或更高级别,否则将发生编译错误。
答案 0 :(得分:19)
android:minSdkVersion
表示市场将过滤具有较低sdk的设备。
target=android-x
表示Eclipse不允许使用sdk高于x的方法或类。它将显示编译器错误。
您可以像这样使用它:在清单中提供最小版本 - 取决于您的应用关键功能。将相同的值设置为项目属性。然后,如果您想使用来自更高SDK的某些API - 在项目属性中提高值,并使用检查包装代码是否设备API可以执行此代码:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ECLAIR_MR1)
{
// here you can use APIs, that appears in Android 2.1
}
答案 1 :(得分:11)
以下是每个属性的描述,它正是它控制的内容,以及如何使用它。
在AndroidManifest.xml
:
midSdkVersion
:由Google Play电影市场使用。您允许应用运行的最低API。运行早于此版本的Android的设备将无法安装您的应用。将此设置为您的代码可以支持的最低版本的android(即,它不使用比此更新的任何API调用,而不特别注意向后兼容性)。当然,您应该在运行此版本的设备或模拟器上进行测试。
Google提供了一个dashboard,其中列出了使用每个版本的人数,这在决定是否可以停止支持时非常有用。
注意:如果您使用的是任何android-support
库,则不应使用支持库名称中指定的旧版本。例如,android-support-v4.jar
将无法在早于4的Android版本上运行。
targetSdkVersion
:在运行时由设备使用。设备使用此选项来决定是否以向后兼容模式运行您的应用。例如,如果将此设置为10(Gingerbread)设备运行16(Jelly Bean)仍将使用Gingerbread的视觉样式为您的应用程序;例如它将有一个标题栏而不是一个操作栏。将此设置为您希望您的应用看起来的Android的最新版本(您只能通过在较新版本上测试它来确定它是否看起来很好并且表现良好)。
在project.properties
中,或通过Eclipse的Project Build Target
设置设置:
target
:您的计算机在编译时使用。您的应用编译的Android版本。尝试使用比此更新的API功能将导致错误。您应该将此设置为与minSdkVersion
相同,除非您为了向后兼容而执行特殊操作(请参见下文),以便编译器可以防止您意外使用用户旧设备上不存在的功能(导致它崩溃了。)
注意:您所包含的库项目可能需要此值的最小值。例如,android-support-v7-appcompat
包含res/layout-v14
中的.xml资源文件,这些文件要求您针对API 14或更新版本进行编译。
关于向后兼容性的说明:
有些情况project.properties
应高于minSdkVersion
:当您想要使用较新的API功能时,但您需要包含特殊代码以实现向后兼容,以允许它在旧设备上运行。在这种情况下,您必须将project.properties
与包含您使用的所有功能的最旧API匹配。
如果可能,请使用Android Support Libraries来实现向后兼容性,因为它是传统的,经过良好测试的,很简单,并允许您单独留下project.properties
。但是,有时支持库不能满足您的需求,在这种情况下,您必须使用this或these等技术
答案 2 :(得分:8)
问题的核心是:项目清单中声明的targetSdkVersion值与Eclipse中项目的Project / Properties / Android对话框中选择的Project Build Target之间的关系是什么?您的应用程序编译的SDK级别?
minSdkVersion值会分散您的问题;这必须小于或等于targetSdkVersion,但它不是直接与Project Build Target相关。关系在targetSdkVersion和Project Build Target之间。
经过仔细考虑(你必须自己判断我是否有这个权利),我得出结论,targetSdkVersion和Project Build Target应始终设置为相同的API级别。我的推理分为两部分。
**首先,我认为Project Build Target绝不应低于targetSdkVersion:
当您将targetSdkVersion设置为某个API级别时,通常这样做是为了使用首先在该级别可用的某些API功能。您可能决定支持版本回到较早的minSdkVersion,并检测缺少早期版本中不可用的targetSdkVersion功能,并编写支持这些早期版本的备用代码,但是原因用于设置targetSdkVersion将获得对该API级别仅可用的功能的访问权限。
由于您显然希望访问最初在targetSdkVersion API级别引入的某些功能,因此您可以将Project Build Target设置为与targetSdkVersion中指定的API级别相同。否则,您编译的API将不包含API功能,这是您将targetSdkVersion设置为所选级别的原因。
因此,显然,您不希望将Project Build Target 设置为而不是targetSdkVersion。但是你想要设置更高吗?这让我们得出了论证的第二部分:
**其次,我认为Project Build Target不应该高于targetSdkVersion:
您不希望选择高于targetSdkVersion的Project Build Target,因为这可能意味着您可能无意中使用了Build Target SDK提供的某些功能,这些功能在您声明的targetSdkVersion级别不可用,如果你 使用了这些功能,那么如果您的应用程序是在早期(比构建目标)Android版本中运行的话,它们将无法使用,并且您的应用可能会因此崩溃。
现在,如果你的应用程序本身已经提交检测这样的缺失功能并处理它们的缺席,那么这就可以将targetSdkLevel设置为Project Build Target的级别,因为这正是意义targetSdkLevel(你承诺检测和处理你的targetSdkLevel上但没有出现在你的minSdkLevel上的任何API特性),所以如果你这样做,那么没有理由不以您的方式将targetSdkLevel设置为您在代码中支持的最高级别(即,达到项目构建目标的级别)。
[好吧,我刚发现一个"原因"将Project Build Level设置为高于targetSdkLevel。 API级别16及更高级别的默认软键盘是错误的(其退格键无法正常工作),因此我将targetSdkLevel向下移动到15以使该键盘消失。我可以将我的项目构建目标也改为15,但我还没有做到这一点,因为我想要最新的代码,理论上最近的一般是"改进了& #34;因此"更好。"这可能是迷信的。尽管有这个例外,上述论点通常都是有效的。]
在这方面,我要注意官方文档声明:"在开发应用程序时,您需要选择要编译应用程序的平台版本。通常,您应该根据应用程序可以支持的最低版本的平台编译应用程序。"
http://developer.android.com/guide/topics/manifest/uses-sdk-element.html
这似乎表明你应该编译一个等于minSdkVersion而不是targetSdkVersion的Project Build Target,这与我上面提到的相反。我已经列出了支持targetSdkVersion的原因,而不是这个。具体来说,如果您尝试使用targetSdkVersion中存在但不存在于minSdkVersion中的功能,那么如果您正在编译minSdkVersion,您将如何能够这样做?当然,您的应用程序将在minSdkVersion 工作,因为您将测试这些功能的可用性(例如,通过反射),但您不会拥有那些不错的新API元素永远,即使您的应用程序在最新版本的Android上运行,如果您对SDK的minSdkVersion级别进行编译。
因此,项目构建目标应始终与targetSdkVersion相同;这是我的论点。我无法找到任何明确表达这种关系的材料,所以上面是由我推断的,并没有得到任何权威来源的支持,事实上上述官方来源的引用似乎与我的立场相矛盾;因此鼓励和期望评论。
答案 3 :(得分:1)
AFAIK,android:minSdkVersion
以及Eclipse在设置项目时要求您选择的那个是同一个。但是,android:targetSdkVersion
是您希望应用针对市场上可用的特定sdk版本Android的目标。
例如,您可能拥有android:minSdkVersion="8"
(Eclipse在设置项目期间要求您提供的那个),因为您希望您的应用程序在具有Froyo的设备上运行(以及更高版本的Android的)。但您可能希望您的应用真正针对GingerBread用户或HoneyComb用户或ICS用户。
编辑:请注意,targetSdkVersion
必须等于或大于minSdkVersion
的{{1}}。否则,它真的没有多大意义。
答案 4 :(得分:1)
我不是说Eclipse的构建目标应该设置为更少 比minSdkVersion。我问为什么Eclipse不会自动使用 minSdkVersion或targetSdkVersion作为其构建目标SDK 代替。你为什么要把它设置成不同的东西?
称之为功能。 eclipse不是专为android设计的。如果没有人想过添加一个自动机来使用清单中给出的sdk版本,那么eclipse就不会这么做了。我不认为这背后有很多魔力。 我认为它还没有添加到eclipse功能的eclipse / android插件中。
另外,既然你总是可以改变清单中陈述的sdk版本,那么在eclipse中也很灵活(你总是可以通过项目的属性改变eclipse sdk目标)。 像其他人一样,有时候清单sdk可能与eclipse sdk不同。 (多sdk版本支持)。使用较低然后清单中的min-sdk当然没有任何意义,但这里获得:如果没有人为eclipse插件编写检查器,检查你正在做什么是有意义的,那么它就是可能的。
答案 5 :(得分:0)
伙计们我对这些做了一些测试,并找到以下答案:
minSDKVersion - 应用程序不会在sdk下面运行
targatSDKVersion - 应用程序运行时环境。对于ex应用程序有最新的SDK设备让我们说21但你设置目标sdk版本19意味着 当应用程序在此设备中运行时,运行时(主题和其他UI /类)将为19。
项目构建目标 - 当您选择项目构建目标版本时,它意味着您是apk或将根据所选的sdk编译类。 对于ex - 如果您选择项目构建目标16并尝试使用anotation @JavaScriptInterface它将无法找到,因为此anotation可用于 高于那个目标。
maxSDKVersion - 这意味着应用程序不会安装在sdk上面。
答案 6 :(得分:-4)
每个Android版本都分配给android:targetSdkVersion。较高版本的项目无法在较低版本的模拟器上运行,但反之亦然。确保您的sdk已更新,并尝试将项目更改为相应的版本