服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - IOS - IOS 静态库打包流程简化详细介绍

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

2021-02-26 16:07zhouzhoujianquan IOS

这篇文章主要介绍了IOS 静态库打包流程简化详细介绍的相关资料,开发好的静态库后需要手动的合并.a文件,然后再拷贝相关的头文件,接着把静态库和头文件放在同一个文件里面打包发送给SDK的使用者,这里简化下流程,需要的朋

ios 静态库打包流程简化

在ios开发中,我们经常会遇到开发sdk的需求。开发好的静态库后需要手动的合并.a文件,然后再拷贝相关的头文件,接着把静态库和头文件放在同一个文件里面打包发送给sdk的使用者。本文将介绍如何使用脚本,简化这一连串的过程。为了照顾广大初学者,教程将会详细介绍打包的基本流程。

关于静态库和动态库区别,可以看我的另外一篇文章: ios静态库和framework区别

项目配置

新建一个名为testsdk的静态库工程
IOS 静态库打包流程简化详细介绍

然后点击target下边的加号按钮,添加新的target
IOS 静态库打包流程简化详细介绍

选择cross-platform,新建一个aggregate,命名为testsdkshell
IOS 静态库打包流程简化详细介绍

可以看到targets目录下多了一个新的target。
IOS 静态库打包流程简化详细介绍

点击targets->testsdkshell->build phases->+->new run script phases
IOS 静态库打包流程简化详细介绍

然后新建一个shell文件,命名为build_testsdk_script.sh
IOS 静态库打包流程简化详细介绍

添加shell文件后的工程如下
IOS 静态库打包流程简化详细介绍

然后把shell文件的目录写到刚才所建立的run script phases里面。
IOS 静态库打包流程简化详细介绍

编码完成后设置我们需要暴露出来的头文件,把需要暴露出来的头文件添加到copy files
IOS 静态库打包流程简化详细介绍

最后把博客最后的shell代码拷贝到build_testsdk_script.sh文件下,运行testsdkshell即可完成自动打包。
IOS 静态库打包流程简化详细介绍

这里可能存在的问题就是脚本没有运行的权限,在终端中切换到build_testsdk_script.sh所在目录,使用

sudo chmod +x build_testsdk_script.sh

对shell文件进行授权,再次运行即可。运行成功后,即可看到包打好了。文件的命名包括静态库名字,日期,git版本(我这里还没提交过代码,所以git版本获取不到),debug/release版本。

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

简化流程分析

开始编写脚本简化步骤,我们首先需要明确sdk需要注意的以下几点:

  1.     需要支持所有位数的设备,arm64 armv7 armv7s
  2.  需要可以配置debug和release版本
  3.     需要支持模拟器和真机

第一点我们需要注意的是配置文件里面的build active architecture only
IOS 静态库打包流程简化详细介绍
这个配置的作用是开发者可以设置xcode,仅编译生成满足当前插入的设备的处理器二进制文件。当前插入设备就是你正在用于调试的机器。在日常开发中为了提高编译的速度,我们可以把debug模式下的设置为yes,但是release模式下必须设置为no,否则打包上线的文件可能就会出问题了。

在开发sdk的时候,我们把所有的都设置为no,这样打包出来的文件就不会出问题了。

为了让脚本可以适配debug和relaese模式。我们使用xcode自带的配置变量${configuration}。在打包的时候,使用该变量即可。

打包时候修改这里决定是打什么版本
IOS 静态库打包流程简化详细介绍

打包模拟器静态库

?
1
2
3
4
5
6
7
8
#编译模拟器库文件
xcodebuild build -project ${proj} \
-scheme ${lib_static_name} \
-configuration ${configuration} \
-sdk iphonesimulator \
clean \
build \
configuration_build_dir=${iphone_simulator_dir}

打包真机库文件

?
1
2
3
4
5
6
7
8
#编译真机库文件
xcodebuild -project ${proj} \
-scheme ${lib_static_name} \
-configuration ${configuration} \
-sdk iphoneos \
clean \
build \
configuration_build_dir=${iphone_os_dir}

最后是把两个库文件合在一起

?
1
2
3
4
5
6
# 静态库文件
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文件分别拷贝出来,然后放到一个目录下面。那就继续写脚本,让脚本完成吧。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#拷贝头文件和.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的用户发放的时候总得使用压缩包。压缩也自动化算了。

?
1
2
3
4
5
6
7
#打包为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}

当然,你也可以继续写脚本。。。把压缩包自动发送给需要的人。。

脚本完整代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#!/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}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

原文链接:http://blog.csdn.net/zhouzhoujianquan/article/details/53192597

延伸 · 阅读

精彩推荐
  • IOS关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    daisy6092021-05-17
  • IOSIOS开发之字典转字符串的实例详解

    IOS开发之字典转字符串的实例详解

    这篇文章主要介绍了IOS开发之字典转字符串的实例详解的相关资料,希望通过本文能帮助到大家,让大家掌握这样的方法,需要的朋友可以参考下...

    苦练内功5832021-04-01
  • IOSIOS 屏幕适配方案实现缩放window的示例代码

    IOS 屏幕适配方案实现缩放window的示例代码

    这篇文章主要介绍了IOS 屏幕适配方案实现缩放window的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要...

    xiari5772021-06-01
  • IOS解析iOS开发中的FirstResponder第一响应对象

    解析iOS开发中的FirstResponder第一响应对象

    这篇文章主要介绍了解析iOS开发中的FirstResponder第一响应对象,包括View的FirstResponder的释放问题,需要的朋友可以参考下...

    一片枫叶4662020-12-25
  • IOSiOS通过逆向理解Block的内存模型

    iOS通过逆向理解Block的内存模型

    自从对 iOS 的逆向初窥门径后,我也经常通过它来分析一些比较大的应用,参考一下这些应用中某些功能的实现。这个探索的过程乐趣多多,不仅能满足自...

    Swiftyper12832021-03-03
  • IOSiOS 雷达效果实例详解

    iOS 雷达效果实例详解

    这篇文章主要介绍了iOS 雷达效果实例详解的相关资料,需要的朋友可以参考下...

    SimpleWorld11022021-01-28
  • IOSiOS中tableview 两级cell的展开与收回的示例代码

    iOS中tableview 两级cell的展开与收回的示例代码

    本篇文章主要介绍了iOS中tableview 两级cell的展开与收回的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    J_Kang3862021-04-22
  • IOSiOS布局渲染之UIView方法的调用时机详解

    iOS布局渲染之UIView方法的调用时机详解

    在你刚开始开发 iOS 应用时,最难避免或者是调试的就是和布局相关的问题,下面这篇文章主要给大家介绍了关于iOS布局渲染之UIView方法调用时机的相关资料...

    windtersharp7642021-05-04