新创建的 Android 库模块与图标和版本冲突
Newly Created Android Library module conflicts with Icon and Versions
我创建了一个 android 库模块并将其托管在我的 Github 上。但是,库与 Android Studio 项目的图标和版本冲突。附加到我的Android项目的gradle时,显示如下错误:
Manifest merger failed : Attribute meta-data#android.support.VERSION@value value=(25.3.1) from [com.android.support:cardview-v7:25.3.1] AndroidManifest.xml:24:9-31
is also present at [com.android.support:appcompat-v7:26.0.0-alpha1] AndroidManifest.xml:27:9-38 value=(26.0.0-alpha1).
Suggestion: add 'tools:replace="android:value"' to element at AndroidManifest.xml:22:5-24:34 to override.
和
Manifest merger failed : Attribute application@icon value=(@drawable/ic_launcher) from AndroidManifest.xml:26:9-45
is also present at [com.github.dinukapj:ATM-EditText:1.2] AndroidManifest.xml:13:9-43 value=(@mipmap/ic_launcher).
Suggestion: add 'tools:replace="android:icon"' to element at AndroidManifest.xml:23:5-305:19 to override.
我知道通过向清单的应用程序标记添加 tools:replace="android:value"
和 tools:replace="android:icon"
可以解决这个问题,但由于它是一个库,我不想强迫开发人员为每个项目都这样做。
我的图书馆:https://github.com/dinukapj/ATM-EditText/
有没有办法从我的图书馆项目中解决这个冲突?
你可以添加一个 wiki,它说它应该排除你的图书馆的 AppCompat 版本,就像这样。
compile (project(":ATM-EditText")){
exclude module: 'appcompat-v7'
exclude group: 'com.android.support'
}
这不会要求您的用户在清单中添加工具属性。
您使用的lib项目SDK版本为25,主项目版本为26,相互冲突。尝试将主项目的版本更改为 25 这将解决您的问题。
我处理库模块中框架兼容性问题的首选方法是针对给定版本编译您的库(在您的情况下支持 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 文件
- 它告诉库的 user/developer 类 必须 在应用程序的构建 gradle 文件
中提供
- 这意味着如果不在应用的 build.gradle
中自行添加依赖项,使用您的库的任何人都无法访问 类
这样做的好处是,使用您的库的开发人员可以依赖他们想要的外部框架的任何(兼容)版本,例如在您的情况下,他们会在其应用的 build.gradle:
中包含以下内容
compile 'com.android.support:appcompat-v7:26.0.0'
一些额外的链接:
- Android Developer docs on Build Dependencies
- Android Dependency scope
此技术最适合在任何情况下都极有可能包含在应用程序中的库,例如Android 支持库、GSON 等
总结一下:
- 我们针对 1 个版本构建库
- 用户必须在他们的项目中提供依赖项
然后您的用户可以自由使用他们想要的任何库版本。
我创建了一个 android 库模块并将其托管在我的 Github 上。但是,库与 Android Studio 项目的图标和版本冲突。附加到我的Android项目的gradle时,显示如下错误:
Manifest merger failed : Attribute meta-data#android.support.VERSION@value value=(25.3.1) from [com.android.support:cardview-v7:25.3.1] AndroidManifest.xml:24:9-31 is also present at [com.android.support:appcompat-v7:26.0.0-alpha1] AndroidManifest.xml:27:9-38 value=(26.0.0-alpha1). Suggestion: add 'tools:replace="android:value"' to element at AndroidManifest.xml:22:5-24:34 to override.
和
Manifest merger failed : Attribute application@icon value=(@drawable/ic_launcher) from AndroidManifest.xml:26:9-45 is also present at [com.github.dinukapj:ATM-EditText:1.2] AndroidManifest.xml:13:9-43 value=(@mipmap/ic_launcher). Suggestion: add 'tools:replace="android:icon"' to element at AndroidManifest.xml:23:5-305:19 to override.
我知道通过向清单的应用程序标记添加 tools:replace="android:value"
和 tools:replace="android:icon"
可以解决这个问题,但由于它是一个库,我不想强迫开发人员为每个项目都这样做。
我的图书馆:https://github.com/dinukapj/ATM-EditText/
有没有办法从我的图书馆项目中解决这个冲突?
你可以添加一个 wiki,它说它应该排除你的图书馆的 AppCompat 版本,就像这样。
compile (project(":ATM-EditText")){
exclude module: 'appcompat-v7'
exclude group: 'com.android.support'
}
这不会要求您的用户在清单中添加工具属性。
您使用的lib项目SDK版本为25,主项目版本为26,相互冲突。尝试将主项目的版本更改为 25 这将解决您的问题。
我处理库模块中框架兼容性问题的首选方法是针对给定版本编译您的库(在您的情况下支持 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 文件
- 它告诉库的 user/developer 类 必须 在应用程序的构建 gradle 文件 中提供
- 这意味着如果不在应用的 build.gradle 中自行添加依赖项,使用您的库的任何人都无法访问 类
这样做的好处是,使用您的库的开发人员可以依赖他们想要的外部框架的任何(兼容)版本,例如在您的情况下,他们会在其应用的 build.gradle:
中包含以下内容compile 'com.android.support:appcompat-v7:26.0.0'
一些额外的链接:
- Android Developer docs on Build Dependencies
- Android Dependency scope
此技术最适合在任何情况下都极有可能包含在应用程序中的库,例如Android 支持库、GSON 等
总结一下:
- 我们针对 1 个版本构建库
- 用户必须在他们的项目中提供依赖项
然后您的用户可以自由使用他们想要的任何库版本。