源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

IOS 静态库打包流程简化详细介绍

  • 时间:2022-10-28 10:13 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:IOS 静态库打包流程简化详细介绍
[b]IOS 静态库打包流程简化[/b] [quote] 在iOS开发中,我们经常会遇到开发SDK的需求。开发好的静态库后需要手动的合并[code].a[/code]文件,然后再拷贝相关的头文件,接着把静态库和头文件放在同一个文件里面打包发送给SDK的使用者。本文将介绍如何使用脚本,简化这一连串的过程。为了照顾广大初学者,教程将会详细介绍打包的基本流程。 [/quote] 关于静态库和动态库区别,可以看我的另外一篇文章: [url=http://www.1sucai.cn/article/100959.htm]iOS静态库和Framework区别[/url] [b]项目配置[/b] 新建一个名为[code]TestSDK[/code]的静态库工程 [img]http://files.jb51.net/file_images/article/201612/201612231035501.png[/img] 然后点击[code]Target[/code]下边的加号按钮,添加新的Target [img]http://files.jb51.net/file_images/article/201612/201612231035502.png[/img] 选择[code]Cross-platform[/code],新建一个[code]Aggregate[/code],命名为[code]TestSDKShell[/code] [img]http://files.jb51.net/file_images/article/201612/201612231035503.png[/img] 可以看到[code]TARGETS[/code]目录下多了一个新的Target。 [img]http://files.jb51.net/file_images/article/201612/201612231035504.png[/img] 点击[code]TARGETS[/code]->[code]TestSDKShell[/code]->[code]Build Phases[/code]->[code]+[/code]->[code]New Run Script Phases[/code] [img]http://files.jb51.net/file_images/article/201612/201612231035505.png[/img] 然后新建一个Shell文件,命名为[code]build_TestSDK_script.sh[/code] [img]http://files.jb51.net/file_images/article/201612/201612231035506.png[/img] 添加[code]Shell[/code]文件后的工程如下 [img]http://files.jb51.net/file_images/article/201612/201612231035507.png[/img] 然后把shell文件的目录写到刚才所建立的[code]Run Script Phases[/code]里面。 [img]http://files.jb51.net/file_images/article/201612/201612231035508.png[/img] 编码完成后设置我们需要暴露出来的头文件,把需要暴露出来的头文件添加到[code]Copy Files[/code] [img]http://files.jb51.net/file_images/article/201612/201612231035509.png[/img] 最后把博客最后的shell代码拷贝到[code]build_TestSDK_script.sh[/code]文件下,运行[code]TestSDKShell[/code]即可完成自动打包。 [img]http://files.jb51.net/file_images/article/201612/2016122310355010.png[/img] 这里可能存在的问题就是脚本没有运行的权限,在终端中切换到[code]build_TestSDK_script.sh[/code]所在目录,使用 [code]sudo chmod +x build_TestSDK_script.sh[/code] 对shell文件进行授权,再次运行即可。运行成功后,即可看到包打好了。文件的命名包括静态库名字,日期,Git版本(我这里还没提交过代码,所以Git版本获取不到),Debug/Release版本。 [img]http://files.jb51.net/file_images/article/201612/2016122310355011.png[/img] 简化流程分析 开始编写脚本简化步骤,我们首先需要明确SDK需要注意的以下几点: [list=1] [*]    需要支持所有位数的设备,[code]arm64 armv7 armv7s[/code][/*] [*] 需要可以配置Debug和Release版本[/*] [*]    需要支持模拟器和真机[/*] [/list] 第一点我们需要注意的是配置文件里面的[code]Build Active Architecture Only[/code]。 [img]http://files.jb51.net/file_images/article/201612/2016122310355012.png[/img] 这个配置的作用是开发者可以设置Xcode,仅编译生成满足当前插入的设备的处理器二进制文件。当前插入设备就是你正在用于调试的机器。在日常开发中为了提高编译的速度,我们可以把Debug模式下的设置为[code]YES[/code],但是Release模式下必须设置为[code]NO[/code],否则打包上线的文件可能就会出问题了。 在开发SDK的时候,我们把所有的都设置为[code]NO[/code],这样打包出来的文件就不会出问题了。 为了让脚本可以适配Debug和Relaese模式。我们使用Xcode自带的配置变量[code]${CONFIGURATION}[/code]。在打包的时候,使用该变量即可。 打包时候修改这里决定是打什么版本 [img]http://files.jb51.net/file_images/article/201612/2016122310355013.png[/img] 打包模拟器静态库
#编译模拟器库文件
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}
这样就完成了基本的编译合并工作,但是对于一个很懒的程序员来说,这还不够,这样我还需要把头文件合[code].a[/code]文件分别拷贝出来,然后放到一个目录下面。那就继续写脚本,让脚本完成吧。
#拷贝头文件和.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}
当然,你也可以继续写脚本。。。把压缩包自动发送给需要的人。。 [b]脚本完整代码[/b]
#!/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}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部