IOS 静态库打包流程简化详细介绍
ios 静态库打包流程简化
在ios开发中,我们经常会遇到开发sdk的需求。开发好的静态库后需要手动的合并
.a
文件,然后再拷贝相关的头文件,接着把静态库和头文件放在同一个文件里面打包发送给sdk的使用者。本文将介绍如何使用脚本,简化这一连串的过程。为了照顾广大初学者,教程将会详细介绍打包的基本流程。
关于静态库和动态库区别,可以看我的另外一篇文章: ios静态库和framework区别
项目配置
新建一个名为testsdk
的静态库工程
然后点击target
下边的加号按钮,添加新的target
选择cross-platform
,新建一个aggregate
,命名为testsdkshell
可以看到targets
目录下多了一个新的target。
点击targets
->testsdkshell
->build phases
->+
->new run script phases
然后新建一个shell文件,命名为build_testsdk_script.sh
添加shell
文件后的工程如下
然后把shell文件的目录写到刚才所建立的run script phases
里面。
编码完成后设置我们需要暴露出来的头文件,把需要暴露出来的头文件添加到copy files
最后把博客最后的shell代码拷贝到build_testsdk_script.sh
文件下,运行testsdkshell
即可完成自动打包。
这里可能存在的问题就是脚本没有运行的权限,在终端中切换到build_testsdk_script.sh
所在目录,使用
sudo chmod +x build_testsdk_script.sh
对shell文件进行授权,再次运行即可。运行成功后,即可看到包打好了。文件的命名包括静态库名字,日期,git版本(我这里还没提交过代码,所以git版本获取不到),debug/release版本。
简化流程分析
开始编写脚本简化步骤,我们首先需要明确sdk需要注意的以下几点:
- 需要支持所有位数的设备,
arm64 armv7 armv7s
- 需要可以配置debug和release版本
- 需要支持模拟器和真机
第一点我们需要注意的是配置文件里面的build active architecture only
。
这个配置的作用是开发者可以设置xcode,仅编译生成满足当前插入的设备的处理器二进制文件。当前插入设备就是你正在用于调试的机器。在日常开发中为了提高编译的速度,我们可以把debug模式下的设置为yes
,但是release模式下必须设置为no
,否则打包上线的文件可能就会出问题了。
在开发sdk的时候,我们把所有的都设置为no
,这样打包出来的文件就不会出问题了。
为了让脚本可以适配debug和relaese模式。我们使用xcode自带的配置变量${configuration}
。在打包的时候,使用该变量即可。
打包时候修改这里决定是打什么版本
打包模拟器静态库
#编译模拟器库文件 xcodebuild build -project ${proj} \ -scheme ${lib_static_name} \ -configuration ${configuration} \ -sdk iphonesimulator \ clean \ build \ configuration_build_dir=${iphone_simulator_dir}
打包真机库文件
#编译真机库文件 xcodebuild -project ${proj} \ -scheme ${lib_static_name} \ -configuration ${configuration} \ -sdk iphoneos \ clean \ build \ configuration_build_dir=${iphone_os_dir}
最后是把两个库文件合在一起
# 静态库文件 lib_name=lib${lib_static_name}.a #合并模拟器文件和真机文件 lipo -create ${iphone_os_dir}/${lib_name} ${iphone_simulator_dir}/${lib_name} -output ${temp_dir}/${lib_name} lipo -info ${lib_name}
这样就完成了基本的编译合并工作,但是对于一个很懒的程序员来说,这还不够,这样我还需要把头文件合.a
文件分别拷贝出来,然后放到一个目录下面。那就继续写脚本,让脚本完成吧。
#拷贝头文件和.a文件到同一目录下 ##建立sdk目录 pushd ${temp_dir} if [[ -d ${lib_static_name} ]]; then rm -fr ${lib_static_name} fi mkdir -p ${lib_static_name} ##拷贝.a和头文件 cp -fr ${lib_name} ${lib_static_name} rm -fr ${lib_name} cp -f ${iphone_simulator_dir}/include/${lib_static_name}/* ${lib_static_name}
虽然放到了同一个文件夹,可我给使用sdk的用户发放的时候总得使用压缩包。压缩也自动化算了。
#打包为zip文件 package_date=`date '+%y%m%d%h'` git_version=`git log --abbrev-commit|head -1|cut -d' ' -f 2` sdk_zip_name=ios_${lib_static_name}_${package_date}_${git_version}_${configuration}.zip zip -qr ${sdk_zip_name} ${lib_static_name}
当然,你也可以继续写脚本。。。把压缩包自动发送给需要的人。。
脚本完整代码
#!/bin/sh # build_testsdk_script.sh # testsdk # # created by jianquan on 2016/11/16. # copyright © 2016年 joyseedog. all rights reserved. proj=${project_name}.xcodeproj lib_static_name=testsdk #把项目名改为自己的即可使用 temp_dir=~/xcodetesttempbuild#打包出来的文件的目录,可以自己定义 iphone_os_dir=${temp_dir}/${configuration}-iphoneos iphone_simulator_dir=${temp_dir}/${configuration}-iphonesimulator #创建真机库文件目录 if [[ ! -d ${iphone_os_dir} ]]; then mkdir -p ${iphone_os_dir} fi #创建模拟器库文件目录 if [[ ! -d ${iphone_simulator_dir} ]]; then mkdir -p ${iphone_simulator_dir} fi #编译真机库文件 xcodebuild -project ${proj} \ -scheme ${lib_static_name} \ -configuration ${configuration} \ -sdk iphoneos \ clean \ build \ configuration_build_dir=${iphone_os_dir} # -archivepath ${iphone_os_dir} #编译模拟器库文件 xcodebuild build -project ${proj} \ -scheme ${lib_static_name} \ -configuration ${configuration} \ -sdk iphonesimulator \ clean \ build \ configuration_build_dir=${iphone_simulator_dir} # -archivepath ${iphone_simulator_dir} # 静态库文件 lib_name=lib${lib_static_name}.a #合并模拟器文件和真机文件 lipo -create ${iphone_os_dir}/${lib_name} ${iphone_simulator_dir}/${lib_name} -output ${temp_dir}/${lib_name} lipo -info ${lib_name} #拷贝头文件和.a文件到同一目录下 ##建立sdk目录 pushd ${temp_dir} if [[ -d ${lib_static_name} ]]; then rm -fr ${lib_static_name} fi mkdir -p ${lib_static_name} ##拷贝.a和头文件 cp -fr ${lib_name} ${lib_static_name} rm -fr ${lib_name} cp -f ${iphone_simulator_dir}/include/${lib_static_name}/* ${lib_static_name} #打包为zip文件 package_date=`date '+%y%m%d%h'` git_version=`git log --abbrev-commit|head -1|cut -d' ' -f 2` sdk_zip_name=ios_${lib_static_name}_${package_date}_${git_version}_${configuration}.zip zip -qr ${sdk_zip_name} ${lib_static_name}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
上一篇: Xcode8 更新解决模拟器找不到的方法
下一篇: IOS10 隐私权限设置实例详解