AndroidNDK - 编译 openssl
# 一、简述
如果你想快速在项目中使用上 openssl,可以使用网上其他开发者提供好的预编译库:
OpenSSL(All)
:https://builds.viaduck.org/prebuilts/openssl/ (opens new window)OpenSSL(3.1.*)
:https://github.com/217heidai/openssl_for_android (opens new window)
以上的预编译库可能最低只支持 API 21(即 Android 5),如果你的项目需要支持 API 19(Android 4.4.x)及以下的话,就得自己编译 openssl 了,本篇主要记录本人编译 openssl 1.1.1
过程以及遇到的问题,可能对你有所帮助。
# 二、实战
首先到 openssl 官网或官方仓库中,找到你需要的版本(主要分为 3.x 和 1.x),下载链接如下:
- openssl 官网:https://www.openssl.org (opens new window)
- GitHub releases:https://github.com/openssl/openssl/releases (opens new window)
注意:建议不要直接 clone github 仓库(仓库上的最新代码可能存在 bug),要使用官方 release 出来的归档。
这里我就使用 1.x 中最新的的 1.1.1w 为例,点击 openssl-1.1.1w.tar.gz
下载后解压。
因为 openssl 官方目前没有提供 cmake 编译脚本,还是采用传统的 make 命令编译,所以我们需要编写一个 shell 脚本,命名为 build_openssl.sh
,与 openssl-1.1.1w
文件夹同级。
build_openssl.sh
文件内容如下:
#!/bin/bash
set -e
# GitLqr:执行 pwd 命令获取当前脚本所在目录路径,并赋值给 CRTDIR 变量
CRTDIR=$(pwd)
# GitLqr:拼接 openssl 源码目录路径
SRC_DIR=$CRTDIR/openssl-1.1.1w
# GitLqr:根据你当前的操作系统,使用对应的 NDK_PLATFORM 变量
# NDK_PLATFORM=darwin-x86_64
# NDK_PLATFORM=linux-x86_64
NDK_PLATFORM=windows-x86_64
# GitLqr:修改为你的 ndk 目录路径
export ANDROID_NDK_HOME=/c/Users/CharyLin/AppData/Local/Android/Sdk/ndk/21.1.6352462
# GitLqr:高版本 NDK 不再包含 gcc, 因此需要将 NDK 内置的 clang 加到入 PATH 环境变量中
export PATH=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/$NDK_PLATFORM/bin:$PATH
# GitLqr:编译 arm64 架构需要用到脚本
export PATH=$ANDROID_NDK_HOME/toolchains/aarch64-linux-android-4.9/prebuilt/$NDK_PLATFORM/bin:$PATH
# GitLqr:编译 arm 架构需要用到脚本
export PATH=$ANDROID_NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/$NDK_PLATFORM/bin:$PATH
cd $SRC_DIR
function build_onearch
{
echo ">> configure $ARCH"
# GitLqr:指定最低支持的 api 和 cpu 架构
./Configure $ARCH -D__ANDROID_API__=$API
# GitLqr:只生成 .a 静态库文件
# ./Configure $ARCH -D__ANDROID_API__=$API no-shared
echo "<< configure $ARCH"
make clean
make
make install
}
#ARCH=android-arm64
#API=21
#build_onearch
ARCH=android-arm
API=19
build_onearch
注意:Windows 系统下,文件路径是带有盘符的,例如:
C:/xxx
,而PATH
中多个环境变量路径又刚好使用冒号:
分割,为了避免不必要的麻烦,建议修改为/c/xxx
。
脚本内容不难理解,就是进入到 openssl 源码目录,执行 Configure
进行一些参数配置,然后执行 make
编译而已,请根据自己的情况,修改脚本中的变量值(例如:NDK_PLATFORM
、ANDROID_NDK_HOME
)。脚本中 ARCH
变量的值,需要根据当前项目情况编写,具体有哪些值,可以通过执行 ./Configure
查看,例如 Android 平台支持的架构有:
android-arm android-arm64 android-armeabi android-mips android-mips64
android-x86 android-x86_64 android64 android64-aarch64 android64-mips64
android64-x86_64
之后,运行 build_openssl.sh
,等待编译完成之后(每编译一个架构大约需要 10 分钟),就可以在 openssl-1.1.1w
目录下找到编译产物了:
libssl.so
/libssl.a
libcrypto.so
/libcrypto.a
# 三、踩坑
因为本人使用的是 Windows 系统,不像 Mac 或 Linux 那样,天然自带各种 shell 命令,所以在执行 build_openssl.sh
文件时遇到了一些阻碍,这里将踩过的坑记录一下。想要在 Windows 下执行 .sh
文件,需要用到 MinGW
环境,因为有安装过 Git,所以可以在 Git Bash
中执行,直接在文件管理器中右键菜单中,点击 Open Git Bash here
即可打开 Git Bash
容器,并自动 cd 到了当前目录:
注:如果右键菜单中没有
Open Git Bash here
选项,可以去开始菜单搜索Git Bash
运行,然后手动 cd 到.sh
文件所在目录。
# 1、make 错误:make: command not found
在 Git Bash
窗口中执行 ./build_openssl.sh
,报错:
./build_openssl.sh: line 32: make: command not found
这是因为 Git Bash
默认的 mingw64
环境中没有 make
工具,可以到如下地址,下载 make-4.4.1-without-guile-w32-bin.zip
文件。
make-4.4.1-without-guile-w32-bin.zip
:https://sourceforge.net/projects/ezwinports/files/ (opens new window)
将 make-4.4.1-without-guile-w32-bin.zip
压缩包中的所有文件拷贝到 \Git\mingw64
目录下,合并文件夹即可:
# 2、perl 错误:/usr/bin/env perl does work as command but not in perl script
在 Git Bash
窗口中执行 ./build_openssl.sh
,报错:
/usr/bin/env perl does work as command but not in perl script
- stackoverflow 上关于该问题的讨论:https://stackoverflow.com/questions/34791031/usr-bin-env-perl-does-work-as-command-but-not-in-perl-script (opens new window)
其实 Git Bash
是支持 perl
的,但是个别版本的 Git Bash
可能不支持 #!/usr/bin/env perl
命令,可以改用 #!/usr/bin/perl
来使用 perl
。在 openssl-1.1.1w
目录找到 Configure
文件,将第一行的 #!/usr/bin/env perl
删除,改为:
#!/usr/bin/perl
# 3、perl 错误:Can't locate Pod/Usage.pm in @INC
在 Git Bash
窗口中执行 ./build_openssl.sh
,报错:
Can't locate Pod/Usage.pm in @INC (you may need to install the Pod::Usage module) (@INC contains: . /usr/lib/perl5/site_perl /usr/share/perl5/site_perl /usr/lib/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib/perl5/core_perl /usr/share/perl5/core_perl) at configdata.pm line 15251.
BEGIN failed--compilation aborted at configdata.pm line 15251.
Compilation failed in require.
BEGIN failed--compilation aborted.
这是因为 Git Bash
默认自带的 perl
工具被精简过,缺少了一些文件,比如这里就找不到 Pod/Usage.pm
,所以解决该问题也简单,补全这些缺少的文件即可,到 strawberryperl
官网下载 strawberry-perl-xx.zip
文件:
- strawberryperl 官网:https://strawberryperl.com/releases.html (opens new window)
strawberry-perl-5.32.1.1-64bit.zip
:https://strawberryperl.com/download/5.32.1.1/strawberry-perl-5.32.1.1-64bit.zip (opens new window)
然后打开 strawberry-perl-xx.zip
压缩包,找到 \perl\lib\
目录下的 Pod
文件夹,将其拷贝到本机的 \Git\usr\lib\perl5\vendor_perl
目录下:
注:如果本地已经有 Pod 目录,那么合并即可。
经过上述几个填坑步骤之后,在 Git Bash
窗口中就可以顺利执行完 build_openssl.sh
了。😩😩😩
- 01
- Flutter - 危!3.24版本苹果审核被拒!11-13
- 02
- Flutter - 轻松搞定炫酷视差(Parallax)效果09-21
- 03
- Flutter - 轻松实现PageView卡片偏移效果09-08