iOS静态库开发的故事

假设我们要做一个SDK给别人用,有两个选择,framework包,a包.他们有啥区别?framework包里面可以包含图片资源.a包里面只能是纯代码.所以a文件的容量真的很小很小.

万一,我们制作静态库的时候调用了第三方库,在打包的时候,如果不把这些第三方库去掉,会有什么效果呢?

使用我们SDK的人如果也使用了相同的第三方库,就会导致在编译的时候,出现duplicate信号,因为两个相同的类出现了,所以呢,如果一定要使用a包,只能手动的将包内的第三方库给去掉.

OK, 我们来看看删掉一个.a静态库中的某个第三方静态库需要怎么搞

Context

我们做了一个.a静态库,其中包含了

Masonary
JFMinimalNotification
FCFileManager
.....

第一步:

lipo * -thin [platform] dir/new.a

platform是平台,什么x86啊,arm之类的

ar -t dir/new.a

解压出来

cd dir && ar xv new.a

跳转到那个文件夹

rm *MAS*
rm JF*
rm ...

删啊删啊删

cd ..
ar rcs lib_1.a dir/*.o 

重新再打包成lib_1.a

lipo -create ... -output new_clean_static_lib.a

最后生成多平台的静态库


这有什么问题嘛?

嗯,你发布的SDK肯定是多平台的,也就是说,你需要有多少个平台,上面的事情就得做多少次~~

So,我写了一个Python脚本专门来解决这个难过的事情,VKRemove

Function 1

python VKRemove.py -lp xxx.a

返回这个静态库里面包含的平台

This library contains:i386 armv7 x86_64 arm64

Function 2

python VKRemove.py -lb xxx.a

返回这个静态库里面所有的库

...'View+MASAdditions.o', 'ViewController+MASAdditions.o', 'XuanWheelBluetoothManager.o'...

感觉很高端了对吧?

Function 3

python VKRemove.py -i XuanWheelSDK.a -rm FCFileManager HMSegmentedControl- JFMinimalNotification   UIView+Round UIImage+ImageEffects.o MAS

这会生成一个xxx.a.new,它包含了之前所有的平台,并且去掉了指定的所有第三方库.

感觉更高端了吧?

Function 4

python VKRemove.py -i XuanWheelSDK.a -from clear.txt

每次都输入那么长的命令太难过了,不如从文件输入吧~

当然咯,Function 3中的-是干什么用的,可以直接去Github上面看,虽然是英文的~