net8.0-android34.0的C#原生Android项目中Type com.google.gson.FieldNamingPolicy$5重复定义问题求助
net8.0-android34.0的C#原生Android项目中Type com.google.gson.FieldNamingPolicy$5重复定义问题求助
各位好,我最近在做一个基于net8.0-android34.0的C#原生Android项目,碰到个头疼的问题,想请大家帮忙支支招。
项目里我导入了几个Android库,配置是这样的:
<AndroidLibrary Update="Jars\jc3api.jar" /> <AndroidLibrary Update="Jars\jc3api-android.jar" /> <AndroidLibrary Update="Jars\commons-codec-1.6r.jar" Bind="false" /> <AndroidLibrary Update="Jars\gson-2.8.6.jar" />
结果现在编译或者运行的时候,一直弹出错误提示:Type com.google.gson.FieldNamingPolicy$5 is defined multiple times,明显是gson的相关类被重复定义了,应该是不同的jar包里面都包含了这部分代码。
我自己琢磨了几个可能的解决方向,但还没完全搞定,也想听听大家的建议:
- 先排查所有引入的jar包:用解压工具打开jc3api.jar、jc3api-android.jar这些第三方包,看看里面是不是已经内置了com.google.gson相关的类。如果有的话,那我手动加的gson.jar就可以删掉了,避免重复引入。
- 给冲突的jar包加排除规则:如果必须同时保留多个依赖,那可以在项目文件的AndroidLibrary配置里,给内置了gson的jar包加上排除规则,把里面的gson类排除掉。比如这样改:
<AndroidLibrary Update="Jars\jc3api.jar"> <Exclude>com/google/gson/**</Exclude> </AndroidLibrary> - 统一gson版本:如果第三方jar里的gson版本和我手动加的不一样,试着把手动引入的gson版本换成和第三方包一致的,这样类版本统一了,可能冲突就消失了。
- 调整D8打包参数:因为net-android用的是D8来处理dex,或许可以在项目文件里配置D8的额外参数,指定优先保留某个版本的类。比如在PropertyGroup里加:
<PropertyGroup> <AndroidDexTool>d8</AndroidDexTool> <AndroidD8AdditionalArguments>--pick-first com/google/gson/FieldNamingPolicy.class</AndroidD8AdditionalArguments> </PropertyGroup>
有没有朋友遇到过类似的问题?或者有其他更靠谱的解决办法吗?麻烦大家帮忙看看了!
备注:内容来源于stack exchange,提问作者Jesoo
相关产品推荐
相关产品推荐

