阅读 362

iOS拆分,合并静态库以压缩打包空间

需求:拆分iOS中体积较大的第三方静态库以实现软件瘦身.


阅读前提:

  • 了解各种架构的静态库含义
  • 了解如何使用Terminal

简书地址 : 拆分iOS静态库

博客地址 : 拆分iOS静态库

掘金地址 : 拆分iOS静态库


基本介绍

一般静态库中支持真机和模拟器多种CPU架构,比如(armv6, armv7,armv7s, arm64, i386, x86_64)。

但比如APP打包上架时可能希望更小的安装包,所以我们可以对项目中的静态库进行拆分,因为对用户而言只是使用真机环境,所以包含模拟器的静态库其实是多余的。

注意:APP上架时不能包含i386、x86_64的架构, 否则将编译将报错.

静态库基本操作

1. 查看静态库信息

首先在Terminal中进入当前静态库所在的位置,然后使用下面指令查看当前静态库包含的架构的信息

lipo -info ./xxx.a
复制代码

此时终端会显示类似如下语句, 即该静态库包含的所有架构信息

Architectures in the fat file: ./xxx.a are: i386 x86_64 armv7 arm64 
复制代码

2. 拆分静态库

使用以下命令可以实现将xxx.a中的armv7架构分离为新的 xxx_armv7.a 静态库(该静态库只包含armv7架构).

lipo ./xxx.a -thin armv7 -output xxx_armv7.a 
复制代码

3. 合并静态库

使用下面命令可实现将xxx_armv7.a与xxx_arm64.a合并为一个新的静态库new.a.

lipo -create xxx_armv7.a xxx_arm64.a -output new.a
复制代码

附: 利用脚本实现剥离整个文件夹下的所有静态库

例如,如下实现了将libs文件夹下所有文件剥离为只包含arm64的静态库(覆盖之前文件)

如有其它需求可稍作改动

以下是apart.sh脚本文件中的所有内容,该脚本将当前目录下的Libs文件夹中所有静态库剥离为只包含arm64的静态库并替换原先静态库.

set -x

# Make all libs to arm64
cd libs
for file in `ls`
do
  lipo $file -thin arm64 -output $file
done
cd ..
复制代码

而我们只需要在该脚本所在路径使用以下命令

./apart.sh
复制代码

如果libs中有的静态库已经只是arm64会跑错,可忽略(错误信息:must be a fat file when the -thin option is specified)

注意:脚本所在路径下必须包含名为libs的文件夹,并将静态库放入其中.否则请根据需求自行修改脚本文件.

评论