「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战」
问题来源
在开发iOS SDK的时候肯定会出现兼容各种CPU架构的情况, 好比你现在开发了一个SDK,在模拟器的架构下需要不需要兼容呢? 那真机呢? 需要兼容吗? 那么两种情况都兼容的话, 该如何处理呢? 其实系统是有这种架构合并的命令的, 那就是今天要说的lipo命令了.
还有一种情况, 就是想为你的SDK瘦身, 简单来说就是 SDK 不需要这么多架构, 如果移除一部分的架构后, 那么app的打包文件就会小很多, 也是一种优化的方案, 如何处理也再今天的文章里面了
前置知识
在进行lipo命令前, 必须知道iOS CUP架构有又哪几种, 而相对应的设备又是哪些呢? 给大家一张图进行查看, 这个不用记忆, 遇到了翻出来看看就好了
iOS 模拟器的架构是根据你的mac电脑走的, 所以不在上图中 一般而言模拟器的架构是:
i386:iphone5/iphone5c以下的模拟器
x86_64:iPhone5s以上的模拟器
总结一下就是:
模拟器32位处理器 --- i386
模拟器64位处理器 --- x86_64
真机32位处理器 --- armv7/armv7s
真机64位处理器 --- arm64/arm64e
解决办法
lipo 是一个在 MacOSX 中处理通用程序(Universal Binaries)的工具。
我们使用lipo 命令来查看整合静态库
- 查看静态库支持的CPU架构(-info)
lipo -info libname.a(或者libname.framework/libname)
- 查看 fat_header、fat_arch
lipo -detailed_info libname.a(或者libname.framework/libname)
- 合并静态库
lipo -create 静态库存放路径1 静态库存放路径2 ... -output 整合后存放的路径
lipo -create libname-armv7.a libname-armv7s.a libname-i386.a -output libname.a
framework 合并(例util.framework)
lipo -create arm7/util.framework/util i386/util.framework/util -output util.framework
- 静态库拆分
lipo 静态库源文件路径 -thin CPU架构名称 -output 拆分后文件存放路径
架构名为armv7/armv7s/arm64等,与lipo -info 输出的架构名一致
lipo libname.a -thin armv7 -output libname-armv7.a
- 移除指定CPU架构
lipo -remove CPU架构名称 静态库源文件路径 -output 输出拆除指定架构后的文件路劲
lipo -remove armv7 libname.a -output libname_tmp.a
结语
当然上述仅仅是lipo命令常用的一些方法, 很有很多强大的功能, 如果你有什么好的想法, 请评论区告诉我把