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
第一點我們需要注意的是配置文件裡面的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}
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!