2

好吧,我认为这没有得到很好的解释,现在我有点困惑。从这个链接:

Compile With是编译应用程序的平台版本。默认情况下,这设置为您的 SDK 中可用的最新版本的 Android。(它应该是 Android 4.1 或更高版本;如果您没有这样的版本,您必须使用 SDK 管理器安装一个)。您仍然可以构建您的应用程序以支持旧版本,但将构建目标设置为最新版本允许您启用新功能并优化您的应用程序,以便在最新设备上获得出色的用户体验。

取而代之是:

在开发应用程序时,您需要选择编译应用程序的平台版本。通常,您应该针对您的应用程序可以支持的平台的最低版本编译您的应用程序

现在,由于他们自相矛盾,在这里我将解释我的理解:假设我们使用 api 5 编译。这意味着如果我从 1 运行到 5,我的应用程序可以工作,但它不适用于版本 > 5. 所以:

  1. 如果 compileWith 设置为 5,为什么我需要设置 minSdkVersion?
  2. 什么是 targetSdkVersion?

关键是:如果 compileWith 设置为最新版本,是否可以使用最新的 API 并且仍然具有向后兼容性?我确定我错了,我错过了一些东西。谢谢你。

编辑 1

现在我明白了,但无论如何我错过了一些东西:假设 minSdk 是 9,target 是 18(我当前的 sdk)。这意味着我不能使用任何特定于 api 18 的东西,除非有一些旧版本的支持包,对吧?我的想法不同:我会使用尽可能低的版本进行编译以获得前向兼容性。我的意思是,如果您在 Win2000 上编译 Windows 应用程序,它将运行到 Windows 8,但我仅限于 Win2000 api。如果我使用 Windows 8 编译,则应在运行时检查向后兼容性,并且我只能在 Win2000 上使用“支持包”(显然这是一个示例)上的 Windows 8 api。正确的?

编辑 2

就是我要问的关于 Android 的问题(而不是关于 JVM)。Android 正在向前和向后混合,我使用 Windows 示例进行了更多混合。FIY,Windows 似乎是向后兼容的,如此处示例中所述。那么,安卓呢?似乎 minSdk 版本应该由开发人员测试,我的意思是:我应该用最新版本编译并测试我的应用程序行为,直到不会改变它的最低 api 级别。因此,我似乎需要通过在每个低于已编译 wich 的 api 级别上进行测试来测试向后兼容性,并确保向前兼容性。正确的?

我认为我正在混合向前和向后兼容性定义。每次我读它们时,它们似乎都不一样。

4

1 回答 1

2

文档中,您可以阅读以下内容:

安卓:m​​inSdkVersion

一个整数,指定应用程序运行所需的最低 API 级别。如果系统的 API Level 低于此属性中指定的值,Android 系统将阻止用户安装应用程序。您应该始终声明此属性。

安卓:targetSdkVersion

一个整数,指定应用程序所针对的 API 级别。如果未设置,则默认值等于提供给 minSdkVersion 的值。此属性通知系统您已针对目标版本进行了测试,并且系统不应启用任何兼容性行为来保持您的应用程序与目标版本的前向兼容性。该应用程序仍然能够在旧版本上运行(低至 minSdkVersion)。

为了回答您的最后一个问题,针对最新的 API 将不允许您在旧手机上执行任何较新的方法或使用任何较新的类,因为您需要使用支持包,这样您才能获得接近的结果您可以在较新的 API 中做什么。

希望这能让您更清楚地了解为什么拥有这两个值以及它们之间的区别。

更新:

关于为 windows 2000 构建并在 windows 8 上运行的示例,并不保证它会运行,这就是为什么在 windows 上你有“兼容运行”模式,然后你根据你想要的操作系统进行选择运行它。

这是因为可能两个操作系统(或本例中的 API)具有相同的方法或选项,它们以不同的方式执行或需要其他权限。这里也会发生同样的情况,因此目标 SDK 将是针对您测试的参考框架,因此如果您在比 taget SDK 更新的设备上运行它,它将使用该行为。

对于 min 和 target 之间的 API,它们将像往常一样运行,因此您总是会遇到奇怪的行为,并且可能需要进行一些修补,通常在 2.x 到 3.x 的跳转中最为明显。

更新 2:

好吧,让我试着用不同的方式来解释它。

minSDK 将确定您可以在整个应用程序中使用哪些方法和选项,这意味着如果某个方法仅在该 API 之后可用,您将无法使用它,而是会收到错误消息。

targetSDK 代表您测试的 API 的最新版本,因此,如果手机的 API 比您指定的 API 更新,它将尝试按照您指定的 API 版本运行,例如this,在部分重要的行为变化

这种不精确的批处理行为仅适用于更新的应用程序。如果您将 targetSdkVersion 设置为“18”或更低,则在 Android 4.4 上运行时,您的警报将继续像以前版本一样运行。

因此,如您所见,如果您将 targetSDK 设置为以前的 API(19 之前),它的行为将与以前一样,但如果您针对最新的 API(此时 API 19),那么它的行为将有所不同.

希望我足够清楚,如果没有,请不要犹豫,问。

于 2013-10-31T21:09:06.493 回答