18

我想知道拥有的后果targetSDK > buildTarget

我最近观察到,如果我保留平板电脑上的buildTarget=16和选项卡(正在运行,API 级别 16),则会移动到操作栏的中心。我无法合理化这种行为。有人可以解释为什么会这样吗?targetSDK=174.1.1

4

2 回答 2

13

好问题!前段时间我也有类似的行为,当时 buildTarget 和 targetSDK 在所描述的方式上有所不同。我花了一些时间来弄清楚,但我会尝试总结我的理解。

您必须区分三个重要值:

  1. minSdkVersion

    这是应用程序将(或应该!)运行的最低可用版本。将 .apk 安装到 Android 上时,将检查该值,如果您运行的 Android 版本低于指定版本,则不会安装。

  2. buildTarget

    这是编译应用程序的 .apk 的 SDK(Eclipse 也将作为该值的目标,用于检查编译错误)。如果buildTarget高于minSdkVersion,即使您的 Android 版本不支持所有方法,您也可以安装该应用程序。默认情况下,这设置为您的 SDK 中可用的最新版本的 Android。您仍然可以构建您的应用程序以支持旧版本,但将构建目标设置为最新版本允许您启用新功能并优化您的应用程序,以便在最新设备上获得出色的用户体验。

    如果在较低的 API 级别上运行,您需要检查您正在使用的方法在运行时是否存在,否则应用程序可能会崩溃!

  3. targetSdkVersion

    指定您的targetSdkVersion应用应在哪个 SDK 平台上正常运行。因此,如果您针对 API 17 进行测试,您可以将 API 17 添加为targetSdkVersion. 如果使用 Android 版本 > targetSdkVersion,Android 系统将进入某种前向兼容模式以确保对应用程序的支持。将输入此兼容性行为以确保您的应用程序继续按照您期望的方式运行,因为在非 API 级别之间的行为可能会发生一些变化(这里是一些最重要的变化)。因此,为较低 API 级别开发的任何应用程序都将能够在较高版本上运行,因为旧行为(如过时值)可能会在兼容模式下“模拟”。

    例如:

    如果您设置targetSdkVersion为 HONEYCOMB (API 11),默认主题将更改为Theme_Holo(即深色全息 UI)。设置targetSdkVersion为较低的值将影响系统保持默认的轻主题,无论您将使用哪个构建 API!

    在您的情况下,API 16 和 17 之间似乎没有太多明显的变化,这应该会影响设计更改,但我想,更高版本targetSdkVersion会在编译时影响一些额外的变化(比如包括额外的类、主题, values, ...),这将影响不同的行为,就像上面的主题示例一样。

我希望这对您有所帮助,以找出奇怪的行为。这里有一些更多相关信息可以在Android 开发者文档中阅读。

PS:有一种前向后向地狱:Android系统是向后兼容的,这样就保证了Android应用程序的前向兼容。这意味着:如果您通过 OTA 更新您的 Android 版本,所有旧应用程序都应该保持运行(因此它们将保持向前兼容)。

于 2013-02-11T16:56:30.470 回答
2

构建目标用于应用程序开发,目标 SDK 用于应用程序兼容性。

构建目标指定您在实现应用程序时可以访问的 API。就像如果您将构建标记设置为 android API 级别 10,那么就您的代码而言,没有 ActionBar 之类的东西。您在开发过程中使用的 API 只是 Android 的一个存根实现,这是必须在真实设备上模拟或运行的方式。因此,构建目标定义(对编译器和您的 IDE)您正在使用的 Android 接口。编译后,基于构建目标应该没有区别(Android系统看不到构建目标,它是一个编译时标志)。这是您与 android 编译器(和您的 IDE)之间的严格约定,它定义了您可以在应用程序中使用的 Android 组件,

目标SDK是您与 Android 系统签订的合同,以确保您的应用程序已准备好从您的最小 SDK 到目标 SDK 正常工作(有效的最大 SDK,因为通常应避免使用最大 SDK 设置)。我相信有一些东西没有向前兼容,比如一些安全变化(可能变化来自应用程序开发之外并且是系统范围的)。本合同是一项协议,意味着您已采取措施确保您的应用能够处理该范围内 Android API 的任何更改,以便在所有情况下都能提供您期望的行为。合同的另一端来自Android系统,它同意使用不超过你目标SDK的Android实现,

关于前向兼容性的说明意味着您的构建目标应始终至少与您的目标 SDK 匹配。您是说您已经测试了您的应用程序以在您的目标 SDK 上运行,那么为什么要针对较低的 API 级别构建它呢?

构建目标和目标 SDK 的实际示例: ActionBarSherlock提供向后兼容的 ActionBar。以下是目前使用该库的要求引用。

库本身必须针对 Android 4.0(API 级别 14)构建。您的项目应尽可能使用最新版本的 SDK 构建,只要它是 4.0 或更高版本。

需要以 API 级别 11 或更高版本为目标,因为它会导致 Android 在较新的设备上运行时自动添加本机操作栏。由于您将针对新的 API 进行编译,但您的应用程序可能会在具有旧版本 Android 的设备上运行,因此必须特别注意避免使用或正确检查和调用在您的最低 SDK 版本之后引入的任何方法。

第一段显示需要包含 4.0 ActionBar API 的构建目标,因为库使用它并且没有它就无法编译。第二段显示需要包含 3.0 ActionBar API 的目标 SDK,因为该库在此类设备上使用本机 ActionBar,但如果您的目标 SDK 低于 3.0,Android 系统将不会提供 ActionBar,因为这告诉它不使用比您的目标更新的任何东西(如 3.0 ActionBar)。

一些参考资料:

构建目标

目标 SDK

于 2013-02-19T17:54:25.117 回答