Xamarin.Forms安装Xam.Plugin.Geolocator后Android重复类报错如何解决?
嘿,这个问题我之前帮不少开发者解决过,咱们一步步来拆解:
错误含义解析
你看到的这个错误 java.lang.IllegalArgumentException: already added : Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat;,本质就是重复引入了Android Support v4库中的同一个类。简单说就是:你的项目里,Geolocator插件本身依赖了某个版本的Android Support v4组件,但你的Android项目或者其他引用的NuGet包也引入了相同组件的不同版本,甚至是重复引入,导致编译时出现类冲突,编译器不知道该用哪一个版本的类。
具体解决步骤
下面是几个按优先级排序的解决方案,你可以从简单的开始试:
清理重建解决方案
先试试最基础的操作:右键你的解决方案 → 「清理解决方案」,然后再右键 → 「重建解决方案」。有时候只是编译缓存搞的鬼,清理后就能自动修复重复引用的问题。统一Android Support库版本
这是最常见的原因——项目中各个NuGet包依赖的Support库版本不一致。你可以这么做:- 打开Android项目的
packages.config文件,或者直接在NuGet包管理器中查看所有已安装的包,找到所有以Xamarin.Android.Support.开头的包,检查它们的版本号是否统一; - 如果发现版本不一致,把所有Support库包升级或降级到同一个稳定版本(建议选和Geolocator插件依赖版本匹配的,或者最新的兼容稳定版);
- 更省心的方式是在Android项目的
.csproj文件中添加强制统一版本的配置,比如:
把版本号替换成你想要统一的那个,这样NuGet会自动对齐所有Support库的版本,避免冲突。<PropertyGroup> <AndroidSupportLibraryVersion>28.0.0.3</AndroidSupportLibraryVersion> </PropertyGroup>
- 打开Android项目的
升级Geolocator插件到兼容版本
旧版本的Xam.Plugin.Geolocator可能依赖的Support库版本比较老,和你项目中的新版本冲突。打开NuGet包管理器,找到Xam.Plugin.Geolocator,点击「更新」到最新稳定版,新版本通常会适配更广泛的Support库或AndroidX版本。移除重复的依赖引用
有些第三方库会内嵌部分Support库的类,导致重复引入。你可以:- 在NuGet包管理器中排查所有已安装的包,看看有没有多个包都引入了相同的Support组件;
- 如果某个包不需要依赖Support库,可以尝试卸载它,或者看看有没有不依赖Support库的版本;
- 也可以直接打开Android项目的
.csproj文件,检查是否有重复的<Reference>节点指向同一个Support库,手动移除重复的那一项。
迁移到AndroidX(长期推荐)
Google已经停止维护旧的Android Support库,转而全力支持AndroidX,Geolocator的新版本也已经适配了AndroidX。如果你的项目还在使用旧Support库,建议直接迁移:- 确保你的Xamarin.Forms版本在4.5及以上(这个版本开始原生支持AndroidX);
- 在Android项目中安装
Xamarin.AndroidX.Core等必要的AndroidX包; - 卸载所有旧的Android Support库包;
- 安装支持AndroidX的
Xam.Plugin.Geolocator版本(最新版默认支持)。
内容的提问来源于stack exchange,提问作者mrisek

