iOS Framework 支持Bitcode

书接上文:iOS Framework你的想法
Xcode版本:Version 11.4.1 (11E503a)

1. 工程设置

  • Mach-O Type -> Static Library (我用的是这个)
  • Deployment Postprocessing -> YES
  • Strip Style -> Debugging Symbols
  • Other C Flags -> -fembed-bitcode
  • Edit Scheme -> Run -> Release
  • Enable Bitcode -> YES (脑补重复三遍)

2. 编译库

2.1 编译两步走:

1. Generic iOS Device
2. 随便一个模拟器

2.2 合并库

两个编译完成后,合并两个framework为一个,网上可以搜一下编译带合并的脚本,这里给大家提供一个拙劣的合并脚本,将下面内容保存为.sh文件:

#!/bin/bash

#真机编译的framework路径粘贴到这里(「show in finder」你懂得)如:xx/xx/Build/Products/Release-iphoneos
I_FMK_DIR=(替换-1)

#模拟器编译的framework路径粘贴到这里(「show in finder」你懂得)如:xx/xx/Build/Products/Release-iphonesimulator
S_FMK_DIR=(替换-2)

#framework的名字没有后缀,举个栗子:Shit.framework 这里写:Shit
FMK_NAME=(替换-3)

#顾名思义全名,Shit.framework
FMK_FULL_NAME=${FMK_NAME}.framework

#用于真机的库Fat文件
I_FMK_OBJ=${I_FMK_DIR}/${FMK_FULL_NAME}/${FMK_NAME}

#用于模拟器的库Fat文件
S_FMK_OBJ=${S_FMK_DIR}/${FMK_FULL_NAME}/${FMK_NAME}

echo ">>>  Start...."
# 删除当前目录中的framework
echo ">>>  delete current framework"
rm -rf ./${FMK_FULL_NAME}

sleep 2

#拷贝一个份,作为最终使用的 xx.framework
echo ">>>  copy framework..."
cp -R ${I_FMK_DIR}/* ./${FMK_FULL_NAME}

sleep 1

#查看支持的架构
echo ">>> lookup framework archs:"
lipo -info ${I_FMK_OBJ}
lipo -info ${S_FMK_OBJ}

# 2020-10-23,XCode12编译模拟的静态库会支持 arm64,合并时会出错,可以移除模拟器编译的arm64
lipo ${S_FMK_OBJ} -remove arm64 ${S_FMK_OBJ}

#开始合并,将最终Fat文件输出到当前目录的 xx.framework目录下
echo ">>> merge ${FMK_FULL_NAME}..."
lipo -create ${I_FMK_OBJ} ${S_FMK_OBJ} -output ./${FMK_FULL_NAME}/${FMK_NAME}

sleep 1

#查看合并后的架构
echo ">>> lookup the final framework archs:"
lipo -info ./${FMK_FULL_NAME}/${FMK_NAME}

echo ">>> Done"
  • 将三处要替换的地方换成真实数据
  • 可以将多余的注释空行删掉,这里是为了方便查看
  • 最开始的「#!/bin/bash」不要删掉
  • 将脚本保存到桌面的某个文件夹,然后进入该文件夹执行:sh ./xx.sh

3.怎么看是否支持了Bitcode

可以使用以下任意一种,有统计行数则说明ok了:
1. otool -arch i386 -l xx | grep __LLVM | wc -l
2. otool -arch i386 -l xx | grep __bitcode | wc -l

-arch:用来指定cpu架构,i386、x86_64、armv7、arm64等
-l:用来指定你的库的Fat文件,就是xx.framework目录下的同名文件xx

4. 使用framework

鼠标拖进去到工程即可,其中在Target -> General -> Framewoks, Libraries, and Embedded Content下找到你的framework右边会有三个选项:
1. Do Not Embed
2. Embed & Sign
3. Embed Without Signing

通常如果你是静态framework,即:Mach-O Type -> Static Library使用「Do Not Embed」就可以了,如果使用Embed打包时会有如下错误:

Found an unexpected Mach-O header code: 0x72613c21

stackoverflow有关于这个的讨论,意思是说:

  1. 是否「Embed」
    (静态库无需「Embed」)运行:file xxx.framework/xxx,如果输出:
  • current ar archive -> Do Not Embed
  • Mach-O dynamically linked shared library -> 「Embed」
  1. 签名
    「Embed」的情况下,运行:codesign -dv xxx.framework,如果输出:
  • code object is not signed at all -> Embed & Sign
  • anything else: already signed -> Embed Without Signin

感谢您的时间

你可能感兴趣的:(iOS Framework 支持Bitcode)