如何在保持向后兼容性的同时将 foregroundServiceType 添加到库清单?
How can I add foregroundServiceType to a library manifest while maintaining backwards compatibility?
我的图书馆项目有一个位置服务,根据 Android Q 要求,它在清单中设置了 android:foregroundServiceType="location"
属性。当应用程序模块使用我的库并针对 API 级别 28 进行编译时,它会失败并出现以下错误:
AndroidManifest.xml:57: AAPT: error: attribute android:foregroundServiceType not found.
我的库如何保持与旧版本的兼容性,同时确保功能适用于 Android Q?
我的目标是避免在更新库版本时破坏任何人的构建,同时避免强迫开发人员针对 API 29 进行编译。看来我有两个选择:
- 提供一个单独的库,以便针对 API 28 及更低版本进行编译的开发人员不会受到影响;
- 警告针对新版本的开发人员使用
tools:node="replace"
替换清单中的服务定义。
第一种方法的问题是我需要维护两个库一段时间。第二个问题是开发者必须记得在更新 SDK 版本后恢复更改。
就我而言,我将采用第二种方法。通过在针对 Android Q 时将显式前台服务类型传递给 startForeground
方法,如果未在清单中设置该类型,我可能会导致崩溃。因此,开发人员可以在针对 Android Q 时捕获此问题并恢复清单更改以修复它。
我有同样的错误,在迁移到 Androidx
并将 compileSdkVersion
从 28 更新到 29 后,我的问题得到解决。所以请做这些改变,你就可以得到你的解决方案
我的图书馆项目有一个位置服务,根据 Android Q 要求,它在清单中设置了 android:foregroundServiceType="location"
属性。当应用程序模块使用我的库并针对 API 级别 28 进行编译时,它会失败并出现以下错误:
AndroidManifest.xml:57: AAPT: error: attribute android:foregroundServiceType not found.
我的库如何保持与旧版本的兼容性,同时确保功能适用于 Android Q?
我的目标是避免在更新库版本时破坏任何人的构建,同时避免强迫开发人员针对 API 29 进行编译。看来我有两个选择:
- 提供一个单独的库,以便针对 API 28 及更低版本进行编译的开发人员不会受到影响;
- 警告针对新版本的开发人员使用
tools:node="replace"
替换清单中的服务定义。
第一种方法的问题是我需要维护两个库一段时间。第二个问题是开发者必须记得在更新 SDK 版本后恢复更改。
就我而言,我将采用第二种方法。通过在针对 Android Q 时将显式前台服务类型传递给 startForeground
方法,如果未在清单中设置该类型,我可能会导致崩溃。因此,开发人员可以在针对 Android Q 时捕获此问题并恢复清单更改以修复它。
我有同样的错误,在迁移到 Androidx
并将 compileSdkVersion
从 28 更新到 29 后,我的问题得到解决。所以请做这些改变,你就可以得到你的解决方案