【问题标题】:How can I add foregroundServiceType to a library manifest while maintaining backwards compatibility?如何在保持向后兼容性的同时将 foregroundServiceType 添加到库清单?
【发布时间】:2019-10-27 23:29:00
【问题描述】:

我的库项目有一个定位服务,并且根据 Android Q 要求,它在清单中设置了 android:foregroundServiceType="location" 属性。当应用程序模块使用我的库并针对 API 级别 28 进行编译时,它会失败并出现以下错误:

AndroidManifest.xml:57: AAPT: error: attribute android:foregroundServiceType not found.

我的库如何保持与旧版本的兼容性,同时确保该功能适用​​于 Android Q?

【问题讨论】:

  • 每个人都应该使用最新的compileSdkVersion。在库的清单中包含该属性不会影响运行时向后兼容性,这是更关键的一点。
  • @CommonsWare 我想避免破坏任何人的自动构建。我希望有一种方法可以避免强迫开发人员更新他们编译的 SDK。
  • 您可以分发两个库,一个用于针对 Q+ 的库,一个用于针对旧设备的库,其中此清单属性仅出现在前者中。然后,您需要检查 old-target 库中的 PackageManager 以确认应用程序确实以 compileSdkVersion 或添加清单合并内容以删除您的属性。
  • 定位服务是什么意思??您是否在前台服务中使用 FusedLocationProviderClient 请求位置更新?如果我们不在清单文件中使用这个属性 android:foregroundServiceType="location" 会发生什么??
  • @PradeepkumarReddy 我的意思是请求位置的服务。它不一定必须使用FusedLocationProviderClient。如果不设置此属性,您的应用将不会收到具有“使用时”权限的更新位置。您应该阅读 Android 文档。

标签: android android-manifest android-10.0


【解决方案1】:

我遇到了同样的错误,在迁移到 Androidx 并将 compileSdkVersion 从 28 更新到 29 后,我的问题得到了解决。所以请做这些改变,你就能得到你的解决方案

【讨论】:

    【解决方案2】:

    我的目标是避免在更新库版本时破坏任何人的构建,同时避免强迫开发人员针对 API 29 进行编译。看来我有两个选择:

    • 提供单独的库,以便针对 API 28 及更低版本进行编译的开发人员不会受到影响;
    • 警告针对新版本的开发人员使用tools:node="replace" 替换清单中的服务定义。

    第一种方法的问题是我需要维护两个库一段时间。第二个问题是开发人员必须记住在更新 SDK 版本后恢复更改。

    就我而言,我将采用第二种方法。通过在面向 Android Q 时将显式前台服务类型传递给 startForeground 方法,如果未在清单中设置类型,我可能会导致崩溃。因此,开发人员可以在针对 Android Q 时发现此问题并恢复清单更改以修复它。

    【讨论】:

    • 您在哪里添加工具:node="replace"?我已将它添加到我的库 moudle 的服务中,但仍然出现错误。
    • @PandaWorld 您是否也添加了android:foregroundServiceType="location" 属性? tools:node="replace" 旨在用您在应用程序中定义的服务定义替换从库中导入的服务定义。它并没有消除定义android:foregroundServiceType 属性的需要。
    猜你喜欢
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    相关资源
    最近更新 更多