之前看过一篇类似的解说文章,链接为点击跳转原文,然后我也遇上了相同的问题,第三方包中的AsynSocket与自己工程的AsynSocket发生了冲突,通过控制台指令xcrun -sdk iphoneos lipo -info libx.a 发现libx.a中包含的armv7和arm64两种类型的文件,说明一下
- arm64:iPhone6s | iphone6s plus|iPhone6| iPhone6 plus|iPhone5S | iPad Air| iPad mini2(iPad mini with Retina Display)
- armv7s:iPhone5|iPhone5C|iPad4(iPad with Retina Display)
- armv7:iPhone4|iPhone4S|iPad|iPad2|iPad3(The New iPad)|iPad mini|iPod Touch 3G|iPod Touch4
因此,根据文章的内容只能用xcrun指令分离libx.a,具体做法可以参考链接,我怕大家看不懂,所以贴出我的流程如下:
- 将libx.a放到桌面(我的libx.a叫DvrCamSDK.a)
从简介看出原来的libx.a大小为4.5M,缩小后应该会有所减少 - 然后打开终端如下图,用指令xcrun -sdk iphoneos lipo -info DvrCamSDK.a 查看其合成的文件类型
可以看出这个第三方包包含了armv7和arm64两种文件,所以都要分别分离出来,然后剔除和我工程冲突了的AsynSocket
3.先分离出armv7,写法为xcrun -sdk iphoneos lipo -extract_family armv7 -output DvrCamSDK-armv7.a DvrCamSDK.a
,即是将DvrCamSDK.a中分离出armv7的.a文件,并将分离出的.a文件改名为DvrCamSDK-armv7.a,看下图
分离成功的话可以在桌面看到多一个DvrCamSDK-armv7.a如下图
可以看出大小约为原来的.a包的一半,当然另一半是种类arm64的文件,两个种类的文件都一样,故两个都要分离和剔除冲突的文件 因为我的.a包没有armv7s的文件,因此根据原文中的理解,应该是最瘦的lib包了,故可以直接分解其内容,获取其所有的.o文件,具体命令为
ar -x DvrCamSDK-armv7.a
,如下图
分离完后可以看到DvrCamSDK-armv7.a中的所有.o文件如下
其中AsyncSocket.o和AsyncUdpSocket.o是和原来的工程冲突的文件,故删掉。删掉后把剩下的.o文件合成为新的DvrCamSDK-armv7.a,改名为newDvrCamSDK-armv7.a,代码为libtool -static -o ../newDvrCamSDK-armv7.a *.o
如下图
这里遇到一点小问题,我在桌面看不到新生成的newDvrCamSDK-armv7.a,全局搜索,发现去到了根目录里了
可以看到newDvrCamSDK-armv7.a为1.7M大小,比DvrCamSDK-armv7.a小了,说明瘦身成功!把桌面的.o文件全删掉防止分离arm64后分不清,然后同理从最原始的DvrCamSDK.a分离出DvrCamSDK-arm64.a,代码为
lipo DvrCamSDK.a -thin arm64 -output DvrCamSDK-arm64.a
如下图
然后同理在桌面看到DvrCamSDK-arm64.a
获取其所有的.o文件,具体命令为
ar -x DvrCamSDK-arm64.a
,如下图
同理生成的.o文件在桌面,剔除冲突文件AsyncSocket.o和AsyncUdpSocket.o
- 用指令
libtool -static -o ../newDvrCamSDK-arm64.a *.o
合成新的newDvrCamSDK-arm64.a文件,同理可以查找到newDvrCamSDK-arm64.a在根目录
- 把桌面所有.o文件删除,把newDvrCamSDK-arm64.a和newDvrCamSDK-armv7.a移到桌面,然后用
lipo -create -output newDvrCamSDK.a newDvrCamSDK-armv7.a newDvrCamSDK-arm64.a
合成新文件newDvrCamSDK.a
最后新文件瘦身成功!引入工程