1. 问题描述
项目在接入第三方库的时候,如果 Library 声明的 minSdkVersion 大于 Module 所声明的,那么在项目编译阶段会抛出错误。错误信息如下:
1 | D:\APP\Project\CLIENT\CHAT\src\main\AndroidManifest.xml Error: |
这段报错的大致意思是:Library 和 Module 的清单在合并过程中发生了冲突。并明确指出项目中的 minSdkVersion(16)低于引用库中声明的 minSdkVersion(21),然后给出了三条解决建议:
1. 使用 minSDK 为 16 的兼容库
2. 项目 minSDK 升到 21
3. 使用 tools:overrideLibrary="com.sunzn.core.chat" 强制使用(可能导致运行时错误)
2. 解决方案
报错给出解决建议的同时,也附上了参考链接 Manifest-Merger,在 tools:overrideLibrary marker 标签下,文档对清单合并问题进行了详述,以下的阐述为官方文档的翻译。
如果引用库的 minSdkVersion 比应用程序的高,只能通过 uses-sdk 标记来声明覆盖引用库的 minSdkVersion。没有这样的标记,清单合并会失败。该标记允许用户选择哪些导入的库可以忽略最低的 SDK 版本。
例如,在主 Module 的清单中:
1 |
|
将允许导入具有以下清单的库而不会出现错误:
1 |
|
3. 应用方案
重新回到文章开始的问题上来。首先,第三方库我们是无法干预的,所以使用较低版本的兼容库不可行;其次,将项目的最低 SDK 升到 21 是可以解决问题的,但是考虑到从 16 升到 21 不是渐进式的提升,会在短时间内导致大量手机系统 API 低于 16 的用户无法更新和安装。最终,只能折中选择增加声明的方式,尽管这种方式可能会导致运行时错误。
在 Android Studio 中,minSdkVersion 的配置已经迁至 Module 的 build.gradle 中,所以在清单文件中只需要增加标记即可,本例增加的标记如下:
1 |
|