增加 Android 目标 SDK 时如何识别潜在的不兼容问题
Posted
技术标签:
【中文标题】增加 Android 目标 SDK 时如何识别潜在的不兼容问题【英文标题】:How to identify potential incompatibilies when increasing Android target SDK 【发布时间】:2018-08-26 21:04:47 【问题描述】:我想尝试将需要目标 SDK 级别 26 的功能(通知渠道)添加到当前目标 SDK 级别 22 的开源 android 项目中。
查看通知通道的文档,我看到了一些令人不安的事情:显然增加目标级别可能会导致以前有效使用 API 的功能有所不同——在这种情况下,将不再显示未指定通道的通知.这告诉我,仅更改目标级别可能会破坏其他事情。
在从级别 22 更改为级别 26 时,如何找到项目中需要检查的每个 API 调用是否存在不兼容性?或者,有没有办法隔离代码段,以便我不更改的代码仍然使用级别 22,而只有新代码使用 26?
【问题讨论】:
您无需更改您的targetSdkVersion
即可使用新的 API - 根据 this blog post 由 compileSdkVersion
控制
@ianhanniballake:我阅读了您链接的帖子。那么,这是否是说,如果我有在级别 22 上工作的源,并且我离开目标级别 22(在项目文件中设置)但在级别 27(我看到 Android Studio 为我选择)编译,一切在 22 级有效的仍然可以工作,并且我将能够使用在 27 级中定义的任何东西......即使行为不同?
@ianhanniballake:例如,尽管如此:“Starting in Android 8.0 (API level 26), all notifications must be assigned to a channel or it will not appear.” 我将能够在我添加的新代码中使用通知渠道,但在设置渠道之前创建通知的旧代码仍然有效, 也?如果这是真的很好,但听起来编译器必须读懂我的想法才能做到这一点。
这是正确的(以及为什么它们是两个单独的值)。
【参考方案1】:
我想尝试添加需要目标 SDK 级别 26 的功能(通知渠道)
如果您将 targetSdkVersion
设置为 26 或更高,则需要通知渠道。如果您的targetSdkVersion
设置为低于 26,则不需要通知通道,但如果您在 API 级别 26+ 设备上运行,您仍然可以设置它们。就个人而言,我从未尝试过这个;在现代 Android 应用开发中,让您的 targetSdkVersion
保持最新是相当重要的。
在从 22 级更改为 26 级时,如何找到项目中需要检查的每个 API 调用是否存在可能的不兼容性?
一般来说,你不能。欢迎您阅读 Android 的发行说明;在过去的几个版本中,Google 更好地专门调用了由targetSdkVersion
触发的更改。您还可以阅读相关Build.VERSION_CODES
值(例如the JavaDoc for M
)的JavaDocs,因为它们列出了由targetSdkVersion
触发的更改。 IDE 可能会给您一些警告。除此之外,这是一个测试问题。
或者,有没有办法隔离代码段,以便我不更改的代码仍然使用级别 22,而只有新代码使用 26?
将它们放在完全独立的应用程序中。否则,没有。 targetSdkVersion
是针对每个应用的设置,而不是针对每个文件或每个类的设置。
【讨论】:
谢谢。我想我现在明白了。这意味着对于一个规模巨大的开源项目,仅仅将 Target SDK 提升到一个新的水平本身就是一个令人生畏的变更请求。看起来这个项目一直在苦苦挣扎。好吧,无论如何,对我来说,进行值得提交的更改将是一条路。不过,如果我只是为自己做,可能会更容易忘记通知渠道,以更笨拙但不那么复杂的方式做我想做的事。 @Coises:“这意味着对于一个规模很大的开源项目,仅仅将 Target SDK 提升到一个新的水平本身就是一个令人生畏的变更请求”——可能。这不像 吨 的事情会根据targetSdkVersion
改变行为。拥有较低的targetSdkVersion
只是另一种形式的技术债务,例如使用过期版本的库。以上是关于增加 Android 目标 SDK 时如何识别潜在的不兼容问题的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Worklight Studio 中设置 Android SDK 目标
为旧版 SDK 部署 iOS 应用程序时,如何对其进行测试?