【问题标题】:Deprecated code works safely on all Android versions and devices?已弃用的代码可以在所有 Android 版本和设备上安全运行吗?
【发布时间】:2020-11-06 02:26:22
【问题描述】:

我正在开发一个包含大量类的大型 android 项目。到目前为止,我们正在使用 Android 3.2 进行编译并支持 Android 2.3。

现在我正在测试使用 Android 5.1.1 进行编译,但仍然支持 Android 2.3。令我惊讶的是,现在很多代码都被弃用了……(getWith(), getDrawable(), setBackgroundDrawable(), HttpRequest, ActivityGroup,等等……)。那些弃用的函数不会给出编译错误,但会给出弃用的警告。

我知道如果 SDK_INT 低于 XX,我可以复制代码并对已弃用的方法进行特殊调用,如果 SDK_INT 比 XX 新,我可以调用新方法,但这是一个巨大的补丁,需要大量重复代码在大量类和包中的许多功能中,因此,如果可能的话,我们宁愿等到不需要支持最旧版本的android。这意味着继续使用已弃用的方法,直到例如我们只需要从 4.4 提供支持,这意味着将需要更少的重复代码和函数。

问题是:如果我用 Android 5.1.1 编译但仍然使用那些已弃用的功能,这个庞大的项目将继续在所有设备上运行(从 2.3 到 5.1.1)?现在它正在使用 Android 3.2 进行编译。

我了解已弃用意味着它们可能会在平台的未来版本中被删除,因此您应该开始考虑在您的代码中替换它们的使用,但如果它仍然受支持并且不会产生编译错误,它会像现在一样正常工作。这就是我对弃用的理解。 对吗?

谢谢。

【问题讨论】:

  • 简短的回答是NO。较长的是有些代码有,有些没有
  • 如果它没有给出编译错误为什么它不应该工作?
  • 我了解已弃用意味着它们可能会在平台的未来版本中被删除,因此您应该开始考虑在您的代码中替换它们的使用,但如果它仍然受支持并且不提供编译错误,它将完美运行。这是我对弃用的理解。这是正确的? ——
  • @DerGol...lum developer.android.com/about/dashboards/index.html 不要迷惑。 2.2怎么活,2.3怎么死?
  • 抱歉,误读了 2.3.x (with x > 2) 还活着。 API 9。 Android 2.2 仍然完美活着

标签: android deprecated deprecation-warning


【解决方案1】:

弃用意味着两件事:

  1. 还有另一种(可能更好)解决方案
  2. 不再完全支持

这意味着您的代码could 可以正常运行。但 Google/Android 不保证这一点。

根据Java documentation @Deprecated 注释说:

@Deprecated 注解表示标记的元素已被弃用,不应再使用。每当程序使用带有 @Deprecated 注释的方法、类或字段时,编译器都会生成警告。 [...]

所以请停止使用已弃用的方法。 :)

你看过或者知道有support-libraries可以帮助你向后兼容吗?

【讨论】:

  • 我不明白你从谷歌文档中做了什么。我知道应该不再使用它,但如果它没有给出编译错误,为什么它不应该工作?
  • 我了解已弃用意味着它们可能会在平台的未来版本中被删除,因此您应该开始考虑在您的代码中替换它们的使用,但如果它仍然受支持并且不提供编译错误,它将完美运行。这是我对弃用的理解。对吗?
  • 这些方法在较新的平台上存在(因此它不会给您编译时错误),但它们可能仅包含异常,例如“已弃用。请改用 XXX。”它们不能保证工作,除非出于兼容性原因,否则不要在生产中使用它们,例如setBackgroundDrawableBuild.VERSION.SDK_INT < 16setBackground 否则。这很安全。
  • 关于这个,Eugen Pechanec,嘿可能只包含诸如“已弃用。改用 XXX”之类的例外。我在哪里可以从官方来源阅读该信息?
  • Depcreacted 的意思不是“我们已经删除了这个方法!”。它仅意味着“不要使用它”。从文档中获取信息。例如:developer.android.com/reference/android/content/res/…
【解决方案2】:

是的,它应该可以正常工作。但是您确实应该使用最新的方法而不是弃用的方法,并使用支持库使其与以前的版本兼容。 我使用的所有已弃用的方法都可以正常工作,但 Google 不保证它们会。

【讨论】:

    【解决方案3】:

    您可以继续使用已弃用的方法,它们应该仍能按预期工作。但是您必须小心,因为它们可能会在未来的版本中被删除。

    正如文档中提到的developer.android.com

    注解@Deprecated 的程序元素是程序员的 不鼓励使用,通常是因为它很危险,或者因为 存在更好的选择。当不推荐使用的程序时,编译器会发出警告 元素在非弃用代码中被使用或覆盖。

    【讨论】:

      【解决方案4】:

      它可能会停止使用新版本。

      示例:LocationManager.addNmeaListener(GpsStatus.NmeaListener listener)

      从 API 24 中弃用。

      停止使用 API 29 (Android 10)。内部没有实现(返回 false)。

      在文档中:保持向后兼容性的无操作方法。

      很难找到旧代码停止工作的原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-24
        • 1970-01-01
        • 2018-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多