OpenSSL这个库,对于一个端上的sdk来说,算是一个比较大的库了,这里拿OpenSSL1.1.1在Android arm64来做说
全编译后libcrypto.a 4.7M, libssl.a 900多k,当然strip后会变小,我们这里就拿没strip的库来做大小对比
首先百度,Google, GitHub找一些别人裁剪的脚本进行尝试,有些是因为版本不一样,所以出错了,去掉不支持的选项后,编译或链接的时候会失败,并且每个地方搜到的脚本并不太一样,也不见得符合我们的需求。
说下我们的需求,我们使用OpenSSL主要是用来在curl中支持https协议,并且其他地方有用到md5的计算和aes的加解密算法,如果你和我们的需求差不多,那么我们可以一起往下看了。
在搜索脚本使用失败后,被逼无奈,找找OpenSSL的源码里面有没有相关的说明不?还真找到了
请一起看源码里面的INSTALL文件,里面有裁剪相关的说明
这里面应该是有几类裁剪
首先是直接列出来名字的,如:
no-afalgeng no-async no-autoalginit no-autoerrinit ...
当然,这里的选项并不都是裁剪模块相关的,比如
no-pic no-shared
这里的是编译选项,no-pic是无法编译成动态库,no-shared是不编译动态库,这里要根据自己的需求选择了。如果你想编译成动态库,或者把静态库最终链接成动态库no-pic是不能选择的。
no-threads Don't try to build with support for multi-threaded
applications.
是不使能多线程安全相关代码,我们升级到1.1.1的目的就是要使用其内部的线程安全功能,所以这个也不能选。
no-sock Don't build support for socket BIOs,
这个我们也不要选,这个是https中需要的。
这里面还有一个特殊的选项
no-deprecated
Don't build with support for any deprecated APIs. This is the
same as using "--api" and supplying the latest version
number.
是不编译过时的api,请不要使用这个选项,如果加上会导致一些其他软件的链接问题,比如ffmpeg3.4中,使用了一些比较低版本的接口,如果加上这个选项,会导致ffmpeg编译不过,我看了下,这些版本兼容的api都是一些宏定义,或者一些接口转化,对最后的体积大小几乎没有任何影响。
然后这部分我这边的config是
no-afalgeng no-async no-autoalginit no-autoerrinit no-capieng
no-cms no-dgram no-dynamic-engine no-engine no-ec no-ec2m no-filenames no-gost
no-hw-padlock no-nextprotoneg no-ocsp no-psk no-rfc3779 no-srp no-srtp no-ts
下面一类是
no-<prot>
Don't build support for negotiating the specified SSL/TLS
protocol (one of ssl, ssl3, tls, tls1, tls1_1, tls1_2,
tls1_3, dtls, dtls1 or dtls1_2). If "no-tls" is selected then
all of tls1, tls1_1, tls1_2 and tls1_3 are disabled.
Similarly "no-dtls" will disable dtls1 and dtls1_2. The
"no-ssl" option is synonymous with "no-ssl3". Note this only
affects version negotiation. OpenSSL will still provide the
methods for applications to explicitly select the individual
protocol versions.
这些是tls和ssl相关的,是我们https协议中需要的,我们肯定不能全部去掉,最好全部留着,并且经过测试,发现去掉一些后,体积并没有多大变化,还是都留着比较放心,兼容性会更好。
no-<alg>
Build without support for the specified algorithm, where
<alg> is one of: aria, bf, blake2, camellia, cast, chacha,
cmac, des, dh, dsa, ecdh, ecdsa, idea, md4, mdc2, ocb,
poly1305, rc2, rc4, rmd160, scrypt, seed, siphash, sm2, sm3,
sm4 or whirlpool. The "ripemd" algorithm is deprecated and
if used is synonymous with rmd160.
上来全部去掉,编译后发现有些算法是必须的,所以把它们去掉了
no-des no-dh no-sock
另外有个选项文档里面并没有提到
no-dso
这个选项不加的话,iOS的app可能会不通过审核,因为是一个动态加载动态库的支持,苹果是不允许的。
经过这样的裁剪Android arm64的库
2.9M libcrypto.a
752K libssl.a
还是小了不少的。并且可以正常使用。