iOS 静态库打包流程简化
Posted JoySeeDog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于iOS 静态库打包流程简化的主要内容,如果未能解决你的问题,请参考以下文章