前言:今天公司项目准备使用高德导航,其中用到了高德3D地图SDK,然后就出现bug了。在真机上可以完美运行,但是在模拟器上,就出现了一大片的bug:提示有82个Duplicate symbols,仔细一看是MobileVLCKit和高德的MAMapKit之间的问题。(PS:今天是真心累啊,不过解决了bug,还是很值得的。)


现在,我就今天踩过的坑,做个简单的整理,以备以后翻看。 也希望以后遇到类似坑的小伙伴们,可以有些许启发和不同见解。


问题描述及猜想


duplicate symbols.png

上图为部分报错内容。两个第三方SDK之间在某些特定平台存在一些duplicate symbols。分析:那是不是除掉其中一个SDK中相应平台上,重复的那部分symbols,是不是就解决问题了呢?且继续向下看。


解决问题


通过查找资料,各种扒论坛,终于发现,跟我一起踩坑的小伙伴们还真不少。
然后通过借鉴他们的经验,在对linux的相关语法实在小白的情况下,终于解决问题了,好感动啊!!!


工具介绍


lipo

lipo是管理Fat File的工具, 可以查看平台列表, 提取特定平台, 重新打包。

nm

nm用来显示一个程序包的符号表, 默认会显示入口地址, 符号类型, 符号名。

strip

strip用来删除程序里的符号表。-R 用来指定一个要删除的符号列表, 使用上述生成的symbols文件.。添加 -S 选项来保留其他符号。

ar

ar可以查看一个程序包里的对象文件列表, 解压出其中的对象文件并重新打包。

ld

ld苹果系统下的链接器, 可以更精确的控制符号表的导出。


具体步骤


因为担心修改MobileVLCKit对已上线的视频播放造成不可估计的影响,因此,此次修改MAMapKit,出现任何bug也可以尽快发现并解决。
下面将进行十分小白式的记录(PS:主要是我太小白了。)

cd path(framework的路径)
lipo -info MAMapKit

lipo info MAMapKit

查看MAMapKit的适用平台,可以发现arm7,i386,x86_64,arm64均可用。并且前面bug只是存在于x86_64平台上,那么就先修改这个平台的内容。

 lipo -thin x86_64 MAMapKit -output MAMapKit.x86_64

文件瘦身,提取x86_64平台的MAMapKit到新的文件MAMapKit.x86_64,发现该文件只有3M而已(源文件20.2M),该文件位置与MAMapKit相同,发现确实单个平台的文件比较小。

nm -j MAMapKit.x86_64  | grep png > symbols
  • 获取MAMapKit.x86_64文件中以_png为前缀的所有符号,生成符号列表并存于symbols文件中。( -j 选项控制只输出符号名)

  • 因为上面的symbols内容不是上述bug中包含的内容,因此,需要更改该symbols文件,删除里面所有符号,将报错的所有重复符号

_png_do_invert
_png_set_shift
_png_get_user_transfom_ptr
...

这些符号依次输入到该文件中,每行一个。这就将本次需要删除的符号存在符号列表中了。

ar -t MAMapKit.x86_64

ar -t MAMapKit.x86_64

可以发现整个包中就一个主要文件MAMapKit-x86_64-master.o文件,这也是前面bug中提到的重名符号所在的位置。(PS:更确定找对了方法)

Duplicate symbols path
ar -x MAMapKit.x86_64

MAMapKit.x86_64 File Path

可以发现多出了三个文件,也获得了需要的MAMapKit-86_64-master.o文件。

ld -x -r -unexported_symbols_list symbols MAMapKit-x86_64-master.o -o MAMapKit-x86_64-master.o.strip

可以将symbols文件中的符号列表在MAMapKit-x86_64-master.o文件中删除掉,并生成一个新的文件MAMapKit-x86_64-master.o.strip。

ar -r MAMapKit.x86_64 MAMapKit-x86_64-master.o.strip Pods-MAMapKit-dummy.o
  • 在执行此命令之前,可以将前面获得MAMapKit.x86_64文件放在其他位置作为对比。
  • 然后通过该命令得到一个新打包好的x86_64平台包。
  • 也可以用以前的获取symbols的方式从这个新包中获取相应的_png的所有符号表,查询刚才需要删除的符号,验证那些符号是否已被删除。(很高兴确实已经删除了,这下问题应该可以解决了吧。)

下面将替换原有包中的x86_64平台包。(该文件中只修改了x86_64平台的内容)

lipo MAMapKit -replace x86_64 MAMapKit.x86_64 -output MAMapKitTest

用上面生成的新包替换MAMapKit包中的x86_64平台包,然后生成一个新的文件包,最后将旧的MAMapKit包移除,其他多余内容也一并移除,将MAMapKitTest更名为MAMapKit。至此,MAMapKit.framework看起来跟原来的没有什么区别了。(看事情不能只看表面哦,咱修改的是内在!)

多余的话:如果修改多个平台的包(因为我只需要修改x86_64这一个平台包),可能需要重新生成一个新包更合适。

  • 根据前面的方法,生成每个平台的新包;
  • 将所有新包对应各个平台,生成一个新包。

合成新包

上图红色标记即最后的合成新包方法。在此之前记得将前面更改过的x86_64平台包拷贝到这些包的相同路径下。

最后重新编译工程,就这么完美解决了!!!这一刻的感觉,太激动了。暂时未发现有什么问题,以后有什么由此衍生的bug,到时候再更新了。也希望小伙伴们共同学习,有问题大家一定要指出来哟!欢迎大家找我交流问题一起进步哦。


感谢下面两位大神踩过的坑,有了它们的经验,才让我如此顺利的解决问题!
[1]Mac系统下lipo, ar, nm等工具的使用简介
[2]Lipo - 如何为ARMv7/ARMv7s/ARM64架构 创建通用文件(Universal Files)](http://blog.csdn.net/volvet/article/details/50097563)

转载:http://www.jianshu.com/p/e857730015cf

解决iOS第三方SDK之间重复的symbols问题的更多相关文章

  1. unity 引入 ios 第三方sdk

    原地址:http://blog.csdn.net/u012085988/article/details/17785023 unity开发中ios应用时,要想成功引入第三方sdk,首先得知道c#与obj ...

  2. 最受欢迎的iOS第三方SDK

    http://www.raywenderlich.com/forums/viewtopic.php?t=4496

  3. iOS 第三方库冲突的处理

    最近项目组在做一些第三方功能的集成,不止一次的遇到第三方库冲突的问题,报错如下: duplicate symbol _OBJC_METACLASS_$_JKSerializer in: /Users/ ...

  4. fir.im Weekly - 热门 iOS 第三方库大盘点

    本期 fir.im Weekly 收集的热度资源,大部分关于Android.iOS 开发工具.源码和脑洞大开的 UI 动画,希望给你带来更多的工作创意与灵感. 盘点国内程序员不常用的热门iOS第三方库 ...

  5. Android高效率编码-第三方SDK详解系列(三)——JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送

    Android高效率编码-第三方SDK详解系列(三)--JPush推送牵扯出来的江湖恩怨,XMPP实现推送,自定义客户端推送 很久没有更新第三方SDK这个系列了,所以更新一下这几天工作中使用到的推送, ...

  6. iOS 第三方库、插件、知名博客总结

    iOS 第三方库.插件.知名博客总结 用到的组件 1.通过CocoaPods安装 项目名称 项目信息 AFNetworking 网络请求组件 FMDB 本地数据库组件 SDWebImage 多个缩略图 ...

  7. 开发者所需要知道的 iOS 10 SDK 新特性

    转自:https://onevcat.com/2016/06/ios-10-sdk/ 写的很好啊.哈哈哈 总览 距离 iPhone 横空出世已经过去了 9 个年头,iOS 的版本号也跨入了两位数.在我 ...

  8. Unity导出xcode后自动化导入第三方SDK

    最近因为在给项目接入第三方SDK,遇到了一个比较烦人的事情就是,每次出包都要重新根据第三方SDK说明设置xcode,每次最少花20分钟来设置,如果出错的话就不一定是20分钟的事了,所以我决定要做一个自 ...

  9. cocos2d-x + Lua接入iOS原生SDK的实现方案[转]

    相信很多朋友在使用cocos2d-x+lua开发游戏时都遇到过接入iOS原生SDK的问题,比如常见的接应用内支付SDK,广告SDK或是一些社交平台SDK等等,我也没少接过这类SDK.这篇文章主要是对我 ...

随机推荐

  1. POJ 3415 Common Substrings(长度不小于K的公共子串的个数+后缀数组+height数组分组思想+单调栈)

    http://poj.org/problem?id=3415 题意:求长度不小于K的公共子串的个数. 思路:好题!!!拉丁字母让我Wa了好久!!单调栈又让我理解了好久!!太弱啊!! 最简单的就是暴力枚 ...

  2. mutect/mutsig/gistic官网汇总

    http://software.broadinstitute.org/software/cprg/

  3. R语言通过loess去除某个变量对数据的影响--CNV分析

    当我们想研究不同sample的某个变量A之间的差异时,往往会因为其它一些变量B对该变量的固有影响,而影响不同sample变量A的比较,这个时候需要对sample变量A进行标准化之后才能进行比较.标准化 ...

  4. jmeter3.2 版本完美实现Load Test报表

    今天下载了最新版的apache tomcat jmeter 3.2,需要jdk1.8以上的版本. 用非GUI模式运行压力测试后,出现的报表太完美了. 将jmx脚本放在就jmeter_home/bin下 ...

  5. 写给前端的Python依赖管理指北

    概述 在Python的项目中,我们可以通过pip来安装依赖包,但是不像npm install,pip默认安装的依赖包会挂在全局上,不利于项目工程协作. 这时候需要一款类似npm的工具记录我们的项目依赖 ...

  6. Mac Python PyQt5 环境搭建

    pip install pyqt5 测试开发环境 在Terminal里敲下以下代码,如果没有报错就说明安装成功了. python -c "import PyQt5" 或是如下图,导 ...

  7. java再次学习

    1.maven配置.

  8. lua中pairs 和 ipairs 的区别

    1.table中存储值的时候,是按照顺序存储的,存储 k-v 的时候,是按照 k 的哈希值存储的. 2.ipairs --- 只能输出 table 中的值,并且不可输出nil,遇到 ni l就退出 p ...

  9. Java创建WebService

    从java 6之后就提供了简单快速的创建WebService的方法,这里将这种简单的方法记录下来方便以后回看.第一步:首先创建一个java Project,然后创建一个类HelloWorldImpl如 ...

  10. HTML第十四章总结 HTML forms

    第十四章主要讲了 html forms,通过 forms,我们可以得到 customers' feedback,使得网页能够 interactive,本章的内容分为三个部分: forms 的 elem ...