我创建了一个Android库模块并将其托管在我的Github上。但是,该库与 Android Studio 项目的图标和版本冲突。当附加到我的 Android 项目的 gradle 时,会显示以下错误:
清单合并失败:属性元数据#android.support.VERSION@value值=(25.3.1( 来自 [com.android.support:cardview-v7:25.3.1] AndroidManifest.xml:24:9-31 也出现在 [com.android.support:appcompat-v7:26.0.0-alpha1] AndroidManifest.xml:27:9-38 value=(26.0.0-alpha1(。 建议:在 AndroidManifest.xml:22:5-24:34 的元素中添加 'tools:replace="android:value"' 以覆盖。
和
清单合并失败:来自 AndroidManifest 的属性application@icon value=(@drawable/ic_launcher.xml:26:9-45 也出现在 [com.github.dinukapj:ATM-EditText:1.2] AndroidManifest.xml:13:9-43 value=(@mipmap/ic_launcher(。 建议:将"tools:replace="android:icon"添加到AndroidManifest.xml:23:5-305:19的元素中以覆盖。
我知道通过向清单的应用程序标记添加tools:replace="android:value"
和tools:replace="android:icon"
可以解决此问题,但由于它是一个库,我不想强迫开发人员为每个项目执行此操作。
我的图书馆:https://github.com/dinukapj/ATM-EditText/
有没有办法从我的库项目中解决此冲突?
我处理库模块中的框架兼容性问题的首选方法是针对给定版本编译库(在您的情况下为 Support Lib v25(,但不要将库包含在编译的输出中。
通常,dependencies
包括:
compile 'com.android.support:appcompat-v7:25.3.1'
此行执行 3 项操作:
- 它允许代码使用该库中的类和方法
- 它将这些类和方法编译到库输出 AAR 文件中
- 这意味着使用您的库的任何人都可以访问它们,而无需在应用程序的 build.gradle 文件中声明它们
第二点是冲突可能出现的地方。
我的首选方法是使用provided
关键字将外部dependencies
包含在库模块中,如下所示:
provided 'com.android.support:appcompat-v7:25.3.1'
这与上述略有不同:
- 它允许你的代码使用类和方法(如上所述(
- 它不会将类编译到库输出 AAR 文件中
- 它告诉库的用户/开发人员,这些类必须在应用程序的构建 gradle 文件中提供。
- 这意味着使用您的库的任何人都无法访问这些类,而无需在应用程序的 build.gradle 中添加依赖项本身。
这样做的好处是,使用您的库的开发人员可以依赖于他们想要的任何(兼容(外部框架版本,例如,在您的情况下,他们会在其应用程序的 build.gradle 中包含以下内容:
compile 'com.android.support:appcompat-v7:26.0.0'
一些额外的链接:
- 关于构建依赖项的 Android 开发者文档
- Gradle 依赖关系差异...
- 安卓依赖关系范围
这种技术最适合在任何情况下都极有可能包含在应用程序中的库,例如Android支持库,GSON等
。总结一下:
- 我们针对 1 个版本构建库
- 用户必须在其项目中提供依赖项
然后,您的用户可以自由使用他们想要的任何库版本。
您使用的是 lib 项目 SDK 版本 25,而主项目版本为 26,因此它们相互冲突。尝试使用 25 更改主项目的版本,这将解决您的问题。
你可以添加一个wiki,说它应该排除你图书馆的AppCompat版本,就像这样。
compile (project(":ATM-EditText")){
exclude module: 'appcompat-v7'
exclude group: 'com.android.support'
}
这不会要求用户在清单中添加工具属性。