今天在海外SDK的开发中,遇到Google登录SDK与Google分析SDK有冲突的问题,于是才有了本篇文章的出现。当我们使用别人提供的SDK进行开发时,时常会遇到两个静态库有相同类而发生冲突的问题。如果我们自己能够通过技术解决这个问题,那当然是最好的。
问题分析:iOS中并不是像Android中存在命名空间这一说法,命名空间的存在是为了防止不同人编写类库发送命名冲突而设计的。因此,iOS中在两个静态库中,如果存在相同的类,则会发生冲突的问题。
例如:
First.framework
FirstViewController.o
SecodeViewController.o
ThirdViewController.o
FourViewController.o
Secode.framework
FourViewController.o
FiveViewController.o
SixViewController.o
SevenViewController.o
当这两个静态库的framework放在同一个工程下时,则会出现冲突的问题。
duplicate_symbol.png解决思路:
1.修改其中一个framework中的冲突类名;
2.删除其中一个framework中的冲突类;
下面简单操作一下删除First.framework中的冲突类(FourViewController.o),灵感来自Google登录与分析SDK的冲突
前提:前提是被"瘦身"的framework必须是一个"胖"的framework。所谓瘦身就是删除其中的部分内容,所谓胖也就是该framework支持多位CPU架构。(armv7 i386 x86_64 arm64)
architectrues.png0.打开终端,进入First.framework目录
$ cd xxxx/First.framework
1.查看First.framework支持的架构
$ lipo -info First
如图:
1.png
2.获得“瘦”的.a文件
$ lipo -thin armv7 First -output armv7.a
$ lipo -thin i386 First -output i386.a
$ lipo -thin x86_64 First -output x86_64.a
$ lipo -thin arm64 First -output arm64.a
如图:
2.png
3.将不同的架构移动到不同的文件夹下(自行创建文件夹)
如图:
3.png
4.进入对应文件夹并从瘦文件中提取对象文件(*.o)
$ cd armv7
$ ar -x armv7.a
$ cd ../i386
$ ar -x i386.a
$ cd ../x86_64
$ ar -x x86_64.a
$ cd ../arm64
$ ar -x arm64.a
如图:
4.png
5.删除冲突的对象文件(.o文件)与对应的.a文件
6.将对应文件夹中的内容合并成新的瘦文件
$ cd armv7
$ libtool -static *.o -o armv7-new.a
$ cd ../i386
$ libtool -static *.o -o i386-new.a
$ cd ../x86_64
$ libtool -static *.o -o x86_64-new.a
$ cd ../arm64
$ libtool -static *.o -o arm64-new.a
如图:
5.png
7.将瘦文件合并成一个胖文件
将上面生成的四个 -new.a文件放到一个新的文件夹中,进入该文件夹,执行以下命令得到一个First胖文件,替换工程中First.framework中的First文件即可。
$ cd new
$ lipo -create armv7-new.a i386-new.a x86_64-new.a arm64-new.a -output First
如图:
至此,framework的静态库瘦身到此结束。
对于.a静态库的瘦身在于如何将.a静态库文件生成多个架构的.a文件。
假设存在First.a静态库文件
lipo -thin i386 First.a -output First.i386.a
lipo -thin x86_64 First.a -output First.x86_64.a
lipo -thin armv7 First.a -output First.armv7.a
lipo -thin arm64 First.a -output First.arm64.a
其他步骤与framework类似。
网友评论