首页 / 资讯中心 / 文章详情

SDK依赖冲突?一招搞定打包闪退难题

SDK依赖冲突?一招搞定打包闪退难题 ★ FEATURED ARTICLE
一句话两个 SDK 各自带了同一个零件但版本不一样游戏不知道该用哪个于是编译失败或者运行时闪退。一、什么是依赖SDK 不是从零写出来的它内部也会用别人做好的工具包。比如联网用OkHttp处理数据用Gson谷歌相关功能用Google Play Services这些被 SDK 用到的工具包就叫依赖。打个比方你买了两台家电SDK A 和 SDK B每台都附带了一根电源线依赖。二、冲突是怎么发生的你的游戏 ├── 广告 SDK → 自带 Gson 2.8 └── 统计 SDK → 自带 Gson 2.10游戏里同时出现两个 Gson就会出现两种情况情况比喻表现两份一模一样的东西两根完全一样的电源线插座只能插一根打包失败报Duplicate class只留了一份但版本不对留下的是旧电源线新家电插不上打包成功但玩的时候闪退报NoSuchMethodError或ClassNotFoundException第二种更麻烦因为测试时不一定能发现上线后才崩。三、怎么看懂报错遇到冲突时报错信息里会直接写出是哪个零件。比如Duplicate class com.google.gson.Gson found in modules gson-2.8.6.jar gson-2.10.1.jar翻译成大白话Gson 有两份一份 2.8.6一份 2.10.1。常见报错速查报错关键词意思Duplicate class同一个零件有两份AndroidNoSuchMethodError/ClassNotFoundException零件版本不对找不到需要的功能Androidduplicate symbol同一个零件有两份iOSProgram type already present和Duplicate class一样老版本工具的说法四、解决办法从简单到复杂以下以Unity 打包安卓为例。办法 1删掉多余的那份文件很多 SDK 是把.aar或.jar文件直接放进Assets/Plugins/Android/文件夹的。打开这个文件夹看看如果发现Assets/Plugins/Android/ ├── gson-2.8.6.jar ← 旧的 └── gson-2.10.1.jar ← 新的删掉旧的留下新的重新打包。一般留新版本因为新版本通常兼容旧版本的用法。删完一定要在手机上把相关功能都试一遍。办法 2用 EDM4U 统一管理推荐手动删文件容易出错。Unity 上有个专门管依赖的免费工具External Dependency Manager简称 EDM4U。大部分正规 SDKFirebase、各大广告平台都自带它。它的作用就像一个管家每个 SDK 告诉管家我需要什么管家统一去下载同一个零件只下载一份并自动选一个合适的版本。每个 SDK 的需求写在一个 xml 文件里放在任意Editor文件夹下例如Assets/MySDK/Editor/MySDKDependencies.xmldependenciesandroidPackages!-- 告诉管家我需要 Gson 2.10.1 --androidPackagespeccom.google.code.gson:gson:2.10.1//androidPackages/dependencies然后在菜单里点Assets → External Dependency Manager → Android Resolver → Force Resolve管家会把所有 SDK 的需求汇总自动处理重复的版本。⚠️ 用了 EDM4U 之后不要再手动往Plugins/Android里拷同样的 jar/aar否则又会重复。办法 3修改 Gradle 配置强制指定版本如果管家也搞不定可以直接告诉打包工具只用哪个版本。第一步打开自定义配置文件Edit → Project Settings → Player → 安卓图标 → Publishing Settings → 勾选 Custom Main Gradle Template项目里会出现Assets/Plugins/Android/mainTemplate.gradle。第二步在文件里加上下面这段// 不管哪个 SDK 要什么版本Gson 一律用 2.10.1configurations.all{resolutionStrategy{forcecom.google.code.gson:gson:2.10.1}}另一种写法不让某个 SDK 带它自己的那份dependencies{implementation(com.example:ad-sdk:1.0.0){// 广告 SDK 别带 Gson 了用别人的就行exclude group:com.google.code.gson,module:gson}**DEPS**}**DEPS**是 Unity 自带的占位符不要删掉它。办法 4找 SDK 厂商有些 SDK 把别人的零件直接打包进了自己的文件里你删不掉、也排除不了。这时只能联系厂商问他们有没有新版本解决了这个问题能不能提供一个不内置这个零件的版本五、苹果手机iOS怎么办iOS 上的报错一般是duplicate symbol _xxxxx in: libSDK_A.a libSDK_B.a意思是两个 SDK 都内置了同一段代码。解决思路和安卓一样优先使用 CocoaPods 版本的 SDKEDM4U 会自动帮你管理它会像管家一样只装一份尽量不要把.a/.framework文件手动拖进项目实在不行找厂商要新版本。在 xml 里写 iOS 需求的方式dependenciesiosPodsiosPodnameGoogleUtilitiesversion~ 7.0//iosPods/dependencies六、怎么避免以后再遇到习惯说明一次只接一个 SDK接完立刻打包测试出了问题马上知道是谁引起的优先选支持 EDM4U 的 SDK让管家管比手动拷文件靠谱不随手拷 jar/aar文件越乱越容易重复升级 SDK 后完整测一遍版本冲突经常在升级后才出现记下每个 SDK 的版本出问题时方便回退七、总结是什么两个 SDK 带了同一个零件的不同版本。表现打包失败有两份或者玩的时候闪退版本不对。怎么查看报错里面会写出零件名字和版本。怎么修删掉多余的旧文件用 EDM4U 统一管理在 Gradle 里强制指定版本或排除找厂商要新版本。记住一句话同一个零件游戏里只能留一份并且要选大家都能用的那个版本。
阅读完成 · 觉得有帮助?
咨询建站