iOS 制作包含静态库的动态库

  • 制作起因
    公司目前有个swift项目用到了组件化,也是我第一个用组件化的项目,都在摸索中一步步行进中....在项目快结束的时候发现个问题,分享功能无法实现,原因是项目中有个AXSDK工具模块,然后各个项目子模块都依赖了AXSDK模块。最初实现分享功能的想法是AXSDK引用分享相关库,然后这样就能实现各个子模块要做分享功能都能做到,但事实永远不尽如人意....


    iOS 制作包含静态库的动态库_第1张图片
    引用友盟分享SDK相关文件
验证本地时报错

如上图,验证本地时不通过,后来查了下原因,是因为QQ微信微博那几个文件是.a静态库,而cocoapods在最新版本上是不支持.a静态库文件依赖了,脑袋疼....
后来机缘巧合得知了可通过制作一个动态库,将.a等相关静态库文件拖入,对外显示为动态库的方式可行

  • 理论功底

    • 动态库和静态库介绍

      首先静态库和动态库都是以二进制提供代码复用的代码库
      静态库 常见的是 .a
      动态库常见的是 .dll(windows),.dylib(mac),so(linux)
      framework(in Apple): Framework 是Cocoa/Cocoa Touch程序中使用的一种资源打包方式,可以将代码文件、头文件、资源文件、说明文档等集中在一起,方便开发者使用。也就是说我们的 framework其实是资源打包的方式,和静态库动态库的本质是没有关系的
      
    • 静态库和动态库的区别

      静态库: 链接时会被完整的复制到可执行文件中,所以如果两个程序都用了某个静态库,那么每个二进制可执行文件里面其实都含有这份静态库的代码
      动态库: 链接时不复制,在程序启动后用dyld加载,然后再决议符号,所以理论上动态库只用存在一份,好多个程序都可以动态链接到这个动态库上面,达到了节省内存(不是磁盘是内存中只有一份动态库),还有另外一个好处,由于动态库并不绑定到可执行程序上,所以我们想升级这个动态库就很容易,windows和linux上面一般插件和模块机制都是这样实现的。
      But我们的苹果爸爸在iOS平台上规定不允许存在动态库,并且所有的 IPA 都需要经过苹果爸爸的私钥加密后才能用,基本你用了动态库也会因为签名不对无法加载,(越狱和非 APP store 除外)。于是就把开发者自己开发动态库掐死在幻想中。
      直到有一天,苹果爸爸的iOS升级到了8,iOS出现了APP Extension,swift编程语言也诞生了,由于iOS主APP需要和Extension共享代码,Swift语言的机制也只能有动态库,于是苹果爸爸尴尬了,不过这难不倒我们的苹果爸爸,毕竟我是爸爸,规则是我来定,我想怎样就怎样,于是提出了一个概念Embedded Framework,这种动态库允许APP和APP Extension共享代码,但是这份动态库的生命被限定在一个APP进程内。简单点可以理解为被阉割的动态库。
      

  • 制作步骤图示

    iOS 制作包含静态库的动态库_第2张图片

    iOS 制作包含静态库的动态库_第3张图片

    iOS 制作包含静态库的动态库_第4张图片
    https://developer.umeng.com/sdk/ios

    iOS 制作包含静态库的动态库_第5张图片


    iOS 制作包含静态库的动态库_第6张图片

    在Build Phases里添加以下脚本,真机和模拟器都Build一遍之后就会在工程目录下生成Products文件夹
if [ "${ACTION}" = "build" ]
then
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}.framework
DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework
SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
#ditto "${DEVICE_DIR}/Headers" "${INSTALL_DIR}/Headers"
lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"
open "${DEVICE_DIR}"
open "${SRCROOT}/Products"
fi
iOS 制作包含静态库的动态库_第7张图片
添加相关依赖库
添加相关依赖库
iOS 制作包含静态库的动态库_第8张图片
选择模拟器或者 Generic iOS Device 运行编译就会生成对应版本的 Framework 了
iOS 制作包含静态库的动态库_第9张图片
这个就是合并后的最终framework包了
iOS 制作包含静态库的动态库_第10张图片
验证
iOS 制作包含静态库的动态库_第11张图片
创建并配置podspec文件

iOS 制作包含静态库的动态库_第12张图片
发布到pod上

成功上传
  • 参考http://www.cocoachina.com/ios/20170427/19136.html 、
    https://www.jianshu.com/p/0026d82784c8 、
    https://www.cnblogs.com/zhanglinfeng/p/5774033.html

你可能感兴趣的:(iOS 制作包含静态库的动态库)