【问题标题】:Application behavior when targetSdkVersion is changed更改 targetSdkVersion 时的应用程序行为
【发布时间】:2018-04-19 19:20:12
【问题描述】:

如果targetSdkVersion 大于设备操作系统版本,并且如果我将targetSdkVersion 降低到设备操作系统版本,应用的行为是否会有所不同?

我的应用程序 targetSdkVersion 是 27,我在 8.0.0[26] 设备上运行。我得到了一个IllegalStateException,如下面的链接中所述,因为我正在使用一个对话框Activity

java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation

建议了两个选项。从AndroidManifest.xml 中删除android:screenOrientation="portrait" 或将targetSdkVersion 更改为26。这两种解决方案都对我有用。

但我的问题是关于将 targetSdkVersion 更改为 26。当我们将 targetSdkVersion 从 27 降低到 26 并且设备操作系统为 26 时,应用程序的行为将如何变化?由于设备运行在 26 并且targetSdkVersion 是 27,我认为没有应用任何兼容模式。我的理解是,当设备操作系统版本大于targetSdkVersion时,应用兼容模式。

那么当我们在这里更改targetSdkVersion 时,应用行为会发生怎样的变化?

【问题讨论】:

  • 你不应该降低targetsdk级别。您的应用最终会被 Play 商店屏蔽。始终以最新的 Android Api 级别为目标 android-developers.googleblog.com/2017/12/…
  • 感谢您的信息。我最终使用了另一个选项。但只是想知道降低 targetSdkVersion 是如何解决上述问题的

标签: android


【解决方案1】:

可能是的,您的应用程序的行为会有所不同。当您将 targetSDKVersion 设置为 27 时,您的应用程序将针对 API 27 SDK 进行编译并与 API 27 库链接。如果较新的 SDK 和库包含您的应用代码不允许的更改,那么您的应用可能会异常。降低targetSDKVersion 意味着该应用程序是针对早期 SDK 构建的,您不需要为以后的 SDK 更改修改代码,因此也不例外。但是,您将失去使用新版 SDK 新功能的能力,并缩短应用在 Play 商店中的停留时间,因为旧版 API 最终会被淘汰。

请记住,targetSDKVersion 与设备 API 支持无关。它是 SDK 编译版本。 26 的 targetSDKVersion 将在支持 API 27 的设备上运行。如果您不使用任何 API 27 功能,则 27 的 targetSDKVersion 将在 26 API 设备上运行(解决方法是使用支持库版本的新功能(如果已提供),有时新的 API 功能不会出现在支持库中)。

【讨论】:

  • 当 targetSDKVersion 为 27 时,我同意它是针对 API 27 SDK 编译的。但是当它在具有 API 26 的设备中运行时,它应该访问 API 26 的 API 实现对吗?为了更清楚地说明 - 异常是从 onCreate 函数引发的。 API 27 的 onCreate 函数具有导致异常的条件检查。但是当构建的apk在没有条件检查的API 26设备上运行时,导致异常,targetSdkVersion是27还是26应该没有关系吧?
  • 正如您所指出的 - 当您将 targetSDKVersion 设置为 27 时,您的应用将针对 API 27 SDK 进行编译并与 API 27 库链接 - API 26 设备没有 27 SDK 和 API图书馆对吗?
  • 是的,API 26 设备上的 API 27 应用程序将调用 API 26 代码,即使它链接到 API 27。由于向后兼容,除非调用新的 API 27 代码,否则它不会异常(这显然不在 API 26 设备中,因此有时使用支持库来提供新的 API 功能)。
  • 所以你的意思是说当 API 27 应用程序在 API 26 设备上运行时,v27 支持库导致异常?而当我们将 targetSDKVersion 降低到 26 时,是否包含支持库 v26 ?
  • 如果您指的是上面的 IllegalState 异常,那么提供的链接中的答案中涵盖了其原因。 v27 支持库不应在 API 26 设备上导致异常(除非使用不正确或库本身存在错误)。使用的支持库的版本在 build.gradle 文件中设置。
【解决方案2】:

是的,Android 文档已经提到 targetSdkVersion 更改时的行为更改。例如,在 API 19 中,我们被告知 Android 4.4 的 WebView operates in "quirks mode" in apps that target API level 18 and lower,以及 AlarmManagerContentResolver 为此类应用保留了一些旧行为。我们还被告知small change to WifiConfiguration in Android 6 检查targetSdkVersion 是否为20 或更低,temporary reprieve on linking to non-NDK platform libraries in Android 7 如果targetSdkVersion 为23 或更低。更引人注目的是Android 8 behaviour changes 的一堆,其中一些在给你新行为之前检查targetSdkVersion 是否为26 或更高。基本上,他们希望您阅读每一个出现的新 API 的“行为变化”部分。

【讨论】:

  • 那么设备操作系统版本究竟是如何影响这些行为的呢?在我的情况下,设备在 26.0.0.并且在 Android 代码库中为 targetSdkVersion 27 添加了特定 API 的更改不应该影响 v26 中的 API?除非设备升级到 v27,否则它如何知道 v27 中添加的更改?
  • 对我来说听起来像是 API 26 中可能存在的错误。在 API 26 设备上,如果 target 是 25 与 26 可能会有所不同,但如果 target 是 27 与 26 则不应该有所不同。如果确实如此,则可能是某些 API 27 代码意外提前发布而您'已经设法激活它。如果您可以模拟 API 25 设备,我将首先尝试在该设备上进行重现,以验证问题是否特定于 API 26 设备。然后,您可以在运行时检测 API 并使其不在 26 上运行受影响的代码,或者只是重新编码整个部分以避免使用 API 的受影响部分。
猜你喜欢
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
  • 2019-01-12
  • 1970-01-01
  • 2019-04-08
  • 2015-09-06
  • 2012-09-16
  • 1970-01-01
相关资源
最近更新 更多