iOS开发

OpenSSL编译成态链接库

2018-10-19  本文已影响214人  熊猫人和熊猫君

背景:ios 开发中使用openssl,以满足一些相对复杂的加密过程,在开发过程中都需要自己导入,一般导入为静态库[libcrypto.a,libcrypto.a]。但是某些特殊情况,需要把openssl打包为动态库framework,故有此文。

搜索前辈已经封装好的

pod search openssl

image.png
如上图能发现一堆二次封装,但是有两个问题。第一,这些封装的代码安全性有待考量,万一源代码被串改过,那么风险就大了;第二,大部分是静态库或者问题库,比如https://github.com/x2on/OpenSSL-for-iPhone ,虽然备注说自己是动态库,阅读其打包脚本也确实发现有类似的动态静态配置选项,但是实际检测下来无效,仅是支持了bitcode的静态framework(framework可以是动态库,也可以是静态库)。故此需要自己重新编译一个动态framework。

自己编译

1. 编译openssl的脚本

为了节省时间我们可以参考网上的开源库,编译openssl的脚本
参考对象:https://github.com/ganvinalix/GRKOpenSSLFramework
ps:为啥不直接用这个库,而是要升级替换,就是怕源码被作者串改,我们只需要利用其编译流程就好。

2.源代码

从官网下载源码替换GRKOpenSSLFramework里面的openssl源代码


源码.png

3.编译

按GRKOpenSSLFramework的脚本说编译,过程可能会长。


编译.png

ps:具体编译命令参考GRKOpenSSLFramework作者描述。

4.库合并

编译后的openssl.framework需要进行合并lib create 合并就好,是的支持真机与模拟器调试。
到这里一个自己编译的openssl.framework动态库就生成了,可以集成到目标工程去。

扩展

发布自己的openssl.framework到私有spec.可参考GRKOpenSSLFramework的spec.
https://github.com/CocoaPods/Specs/blob/9543734012238c33ea018af5a4381459c13f0916/Specs/b/0/b/GRKOpenSSLFramework/1.0.2.14.1/GRKOpenSSLFramework.podspec.json;具体流程发布私有库就不细说。
可查阅:https://www.jianshu.com/p/544746d11f52
ps:GRKOpenSSLFramework是使用的openssl,configer配置工具来编译动态库的,那种用xrun

涉及的相关命令

查看是否支持Bitcode

静态库:
otool -arch armv7 -lxxx.a | grep __bitcode | wc -l
framework:
otool -l openssl | grep __LLVM
https://blog.csdn.net/skylin19840101/article/details/72415279

库的合成

1.lipo -create /Users/xxxxxxx/Desktop/armv7/xxx.framework/xxx /Users/xxxxxxx/Desktop/arm64/xxx.framework/xxx -output /Users/xxxxxxx/Desktop/arm64andarmv7/xxx。chang这步操作就是将一个支持armv7的FrameWork 和 一个支持arm64的FrameWork 合并成了同时支持arm64、armv7的FrameWork。
2.注意,第一步的操作还木有结束,合包(Framework是合并里面的exec文件,然后将exec文件随意替换到之前的任意一个FrameWork中),也就是说你需要将你在第一步合并出来的exec文件替换到之前任意的一个FrameWork中的exec,一般来说exec文件的名字就是你的FrameWork的名字。

查看是否是动态库

file frame_name.framework/framework_name
如果有dynamic标记折为动态库

查看CPU类型支持

lipo -info frame_name.framework/framework_name

总结:出于安全问题需要自己编译openssl;出于组件化需要,减小对代码段的影响,需要把静态库的openssl编译为动态库;出于对包大小的影响也需要同时把openssll编译为支持bitcode。当然如果是简单的加密还是还是完全无比较导入这么复杂的库的,苹果sdk本就支持!

上一篇 下一篇

猜你喜欢

热点阅读