【问题标题】:Difference between "Build Target SDK" in Eclipse and android:targetSdkVersion in AndroidManifest.xml?Eclipse 中的“构建目标 SDK”和 AndroidManifest.xml 中的 android:targetSdkVersion 之间的区别?
【发布时间】:2012-02-14 20:06:23
【问题描述】:

当我将现有的 Android 项目导入 Eclipse 时,我被要求选择一个 SDK 构建目标作为该过程的一部分。

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

例如,在 Google IO 示例应用中,其 AndroidManifest 显示为android:targetSdkVersion=11,但 README 显示 Eclipse 项目需要以 API 级别 13 或更高级别为目标,否则会出现编译错误。

【问题讨论】:

标签: android


【解决方案1】:

伙计们,我对这些进行了一些测试并找到以下答案:

minSDKVersion - 应用程序不会在该 sdk 下运行

targatSDKVersion - 应用程序运行环境。对于前应用程序在设备中有最新的 SDK,比如说 21,但您设置了目标 sdk 版本 19,这意味着 当应用程序在此设备中运行时,运行时(主题和其他 UI/类)将为 19。

项目构建目标 - 当您选择项目构建目标版本时,这意味着您是 apk 或类将根据所选 sdk 进行编译。 例如 - 如果您选择项目构建目标 16 并尝试使用注释 @JavaScriptInterface 它将找不到,因为此注释在 高于该目标。

ma​​xSDKVersion - 这意味着应用程序不会安装在该 sdk 之上。

【讨论】:

    【解决方案2】:

    这里是每个属性的描述,它控制什么,以及你应该如何使用它。

    AndroidManifest.xml:

    • midSdkVersion由 Google Play Market 使用。 允许应用运行的最低 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-appcompatres/layout-v14 中包含 .xml 资源文件,要求您针对 API 14 或更高版本进行编译。

    关于向后兼容性的说明

    有一种情况,project.properties 应该高于 minSdkVersion:当您想使用较新的 API 功能时,您需要包含特殊代码以实现向后兼容性,以使其能够在较旧的设备上运行。在这种情况下,您必须将 project.properties 提高到与包含您使用的所有功能的最旧 API 匹配的位置。

    如果可能,请使用Android Support Libraries 来实现向后兼容性,因为它是常规的、经过良好测试的、简单的,并且允许您不理会project.properties。但是,有时支持库不能满足您的需求,在这种情况下,您将不得不使用 thisthese 等技术

    【讨论】:

      【解决方案3】:

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

      minSdkVersion 值会分散您对问题的注意力;这必须小于或等于 targetSdkVersion,但它与项目构建目标不直接相关。 targetSdkVersion 和 Project Build Target 之间的关系。

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

      ** 首先,我认为项目构建目标不应低于 targetSdkVersion:

      当您将 targetSdkVersion 设置为某个 API 级别时,通常这样做是为了使用在该级别首次可用的某些 API 功能。您可能决定支持回到更早的 minSdkVersion 版本,并检测那些早期版本中不可用的 targetSdkVersion 功能缺乏可用性,并编写支持这些早期版本的替代代码,但您的原因用于设置 targetSdkVersion 的 em> 将获得对在该 API 级别可用的功能的访问权限。

      由于您显然希望访问最初在 targetSdkVersion API 级别引入的一些功能,因此您可以将项目构建目标设置为与 targetSdkVersion 中指定的相同 API 级别。否则,您正在编译的 API 将不包含导致您将 targetSdkVersion 设置为您选择的级别的 API 功能。

      因此,很明显,您不希望将项目构建目标设置为低于您的 targetSdkVersion。但是你会想要将它设置为 更高 吗?这将我们带到了论点的第二部分:

      ** 其次,我认为项目构建目标不应高于 targetSdkVersion:

      您不希望选择高于您的 targetSdkVersion 的项目构建目标,因为这意味着您可能会无意中使用构建目标的 SDK 提供的某些功能,这些功能在您声明的 targetSdkVersion 级别不可用,并且如果您确实使用了这些功能,那么如果您的应用在早于构建目标的 Android 版本中运行,它们将不可用,并且您的应用可能会因此崩溃。

      现在,如果您的应用承诺检测这些缺失的功能本身并处理它们的缺失,那么这将证明将 targetSdkLevel 设置为项目构建目标的级别是合理的,因为这正是含义targetSdkLevel(您承诺检测和处理存在于您的 targetSdkLevel 但不存在于您的 minSdkLevel 的任何 API 功能),所以如果您这样做,那么没有理由设置您的targetSdkLevel 到您以这种方式在代码中支持的最高级别(即,到项目构建目标的级别)。

      [好的,我刚刚找到了一个“原因”,将 Project Build Level 设置为高于 targetSdkLevel。 API 级别 16 及更高级别的默认软键盘有问题(其退格键无法正常工作),因此我将 targetSdkLevel 降低到 15 以使该键盘消失。我也可以将我的项目构建目标更改为 15,但我没有这样做,因为我想要最新的代码,理论上更新的代码通常是“改进的”,因此“更好” 。”这或许是迷信。尽管有这个例外,但上述论点通常是有效的。]

      在这方面,我会注意到官方文档声明:“当您开发应用程序时,您需要选择编译应用程序的平台版本。通常,您应该编译您的应用程序您的应用程序可以支持的平台的最低版本。”

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

      这似乎表明您应该编译与等于 minSdkVersion 而不是 targetSdkVersion 的项目构建目标,这与我上面的观点相反。我已经列出了我偏爱 targetSdkVersion 而不是这个的原因。具体来说,如果您尝试使用 targetSdkVersion 而不是 minSdkVersion 中的功能,那么如果您正在编译与 minSdkVersion 相比,您将如何做到这一点?当然,您的应用将在 minSdkVersion 上运行,因为您将测试这些功能的可用性(例如,通过反射),但您将永远不会拥有那些不错的新 API 元素 ,即使您的应用在最新版本的 Android 上运行,如果您编译的 SDK 与 minSdkVersion 级别相比。

      因此,Project Build Target 应该始终与 targetSdkVersion 相同;这是我的论点。我找不到任何材料可以清楚地阐明这种关系,所以以上是我推断的,没有任何权威来源的支持,实际上上述来自官方来源的引述似乎与我的立场相矛盾;因此,鼓励和期望 cmets。

      【讨论】:

      • 我完全同意你的论点。
      • 请注意,我在上面关于通过将 targetSdkLevel 设置为较低来访问可用的兼容性代码来解决键盘错误的问题在这个单独的答案中处理了更多问题:stackoverflow.com/questions/18581636/…
      【解决方案4】:

      我并不是说 Eclipse 的构建目标应该设置为更少 比 minSdkVersion。我在问为什么 Eclipse 不会自动使用 minSdkVersion 或 targetSdkVersion 作为其构建目标 SDK 反而。你为什么要设置不同的东西?

      称之为功能。 eclipse 不是专门为 android 制作的。如果没有人想过添加自动功能来使用清单中给出的 sdk 版本,那么 eclipse 根本不会这样做。我不认为这背后有太多的魔力。 我认为它还没有被添加到 eclipse / android 插件中用于 eclipse 功能。

      另外,由于您总是可以更改清单中规定的 sdk 版本,因此在 eclipse 中也很灵活(您始终可以通过项目的属性更改 eclipse sdk 目标)。 像其他人一样,有时清单 sdk 可能与 eclipse sdk 不同。 (多 sdk 版本支持)。在清单中使用低于 min-sdk 的值当然没有任何意义,但在这里获得:如果没有人为 eclipse 插件编写检查器来检查你所做的事情是否有意义,那么它就是可能的。

      【讨论】:

        【解决方案5】:

        manifest 文件中的android:minSdkVersion 表示市场将过滤具有较低 sdk 的设备。

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

        您可以像这样使用它:在清单中提供最小版本 - 取决于您的应用关键功能。为项目属性设置相同的值。然后,如果您想在某处使用来自更高 SDK 的 API - 在项目属性中提高价值,并通过检查设备 API 是否可以执行此代码来包装代码:

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

        【讨论】:

        • 有趣。所以 Eclipse 的构建目标应该始终是等于或高于 android:minSdkVersion 的 sdk 版本。但是我仍然不明白为什么 Eclipse 不只是使用 android:targetSdkVersion 作为它的构建目标。
        • @Matthew:这里已经解释了一切:developer.android.com/guide/topics/manifest/…
        • 构建目标只是向 Eclipse 展示了要包含哪些库来访问 android API。所以,低于 minSdkVersion 是没有任何意义的。
        • @Ghost:该链接可以很好地解释 Android 清单中的 minSdkVersion/targetSdkVersion,但没有提及可以设置为不同内容的 Eclipse 构建目标 SDK 设置。
        • @Jin35:我并不是说 Eclipse 的构建目标应该设置为小于 minSdkVersion。我在问为什么 Eclipse 不会自动使用 minSdkVersion 或 targetSdkVersion 作为其构建目标 SDK。为什么你会想把它设置成不同的东西?
        【解决方案6】:

        AFAIK、android:minSdkVersion 和 Eclipse 在设置项目时要求您选择的那个是一回事。但是,android:targetSdkVersion 是您希望您的应用程序针对市场上可用的特定 sdk 版本的 Android 的位置。

        例如,您可能拥有android:minSdkVersion="8"(Eclipse 在设置项目期间询问您的那个),因为您希望您的应用程序也可以在具有 Froyo 的设备上运行(以及更高版本的 Android) .但是您可能希望您的应用真正针对 GingerBread 用户或 HoneyComb 用户或 ICS 用户。

        编辑:请记住,您的targetSdkVersion 必须等于或大于minSdkVersion。否则,它真的没有多大意义。

        【讨论】:

        • “真正瞄准”另一个版本到底是什么意思?我的意思是,该应用程序在市场上的展示率会更高吗?你知道,如果它适用于较低的版本,如果你瞄准另一个版本有什么关系?
        • 建议您通过以下方式了解更多信息:developer.android.com/guide/topics/manifest/…
        • 你可以有不同的 Eclipse 构建目标 SDK 和 Android manifest minSdkVersion,所以我不认为它们是相同的。
        • @Matthew:是的,您可以拥有不同的 Eclipse 构建目标 SDK 和 minSdkVersion,但不建议这样做。 here 已经解释了这是一个 11 小时 24 分钟的视频教程,由 O'Reilly 进行,由 Tony Hillerson 进行,我选择提供 O'Reilly 链接,因为你可能会在那里找到视频。他在视频中解释了一些事情。
        【解决方案7】:

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

        【讨论】:

        • targetSdkVersion 属性不是这样。目标为 15 的项目可以在模拟器上运行,模拟 api 版本 8。但是,如果 minSdkVersion 为 15,则应用程序将拒绝在版本 8 上运行。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-01
        • 2018-09-09
        相关资源
        最近更新 更多