如何在保持向后兼容性的同时将 foregroundServiceType 添加到库清单?

bla*_*ack 9 android android-manifest android-10.0

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

AndroidManifest.xml:57: AAPT: error: attribute android:foregroundServiceType not found.
Run Code Online (Sandbox Code Playgroud)

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

小智 11

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


bla*_*ack 6

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

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

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

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

  • @PandaWorld 您是否还添加了 `android:foregroundServiceType="location"` 属性?`tools:node="replace"` 旨在将从库导入的服务定义替换为您在应用程序中定义的服务定义。它并没有消除定义“android:foregroundServiceType”属性的需要。 (2认同)