iOS集合

iOS 类冲突之 .a .framework静态库瘦身

2018-06-19  本文已影响0人  037e3257fa3b

今天在海外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.png

0.打开终端,进入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类似。

上一篇下一篇

猜你喜欢

热点阅读