likes
comments
collection
share

Android - 编译 openssl 踩坑之路

作者站长头像
站长
· 阅读数 58

一、简述

如果你想快速在项目中使用上 openssl,可以使用网上其他开发者提供好的预编译库:

以上的预编译库可能最低只支持 API 21(即 Android 5),如果你的项目需要支持 API 19(Android 4.4.x)及以下的话,就得自己编译 openssl 了,本篇主要记录本人编译 openssl 1.1.1 过程以及遇到的问题,可能对你有所帮助。

二、实战

首先到 openssl 官网或官方仓库中,找到你需要的版本(主要分为 3.x 和 1.x),下载链接如下:

注意:建议不要直接 clone github 仓库(仓库上的最新代码可能存在 bug),要使用官方 release 出来的归档。

这里我就使用 1.x 中最新的的 1.1.1w 为例,点击 openssl-1.1.1w.tar.gz 下载后解压。

Android - 编译 openssl 踩坑之路

因为 openssl 官方目前没有提供 cmake 编译脚本,还是采用传统的 make 命令编译,所以我们需要编写一个 shell 脚本,命名为 build_openssl.sh,与 openssl-1.1.1w 文件夹同级。

Android - 编译 openssl 踩坑之路

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_PLATFORMANDROID_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

Android - 编译 openssl 踩坑之路

之后,运行 build_openssl.sh,等待编译完成之后(每编译一个架构大约需要 10 分钟),就可以在 openssl-1.1.1w 目录下找到编译产物了:

  • libssl.so / libssl.a
  • libcrypto.so / libcrypto.a

Android - 编译 openssl 踩坑之路

三、踩坑

因为本人使用的是 Windows 系统,不像 Mac 或 Linux 那样,天然自带各种 shell 命令,所以在执行 build_openssl.sh 文件时遇到了一些阻碍,这里将踩过的坑记录一下。想要在 Windows 下执行 .sh 文件,需要用到 MinGW 环境,因为有安装过 Git,所以可以在 Git Bash 中执行,直接在文件管理器中右键菜单中,点击 Open Git Bash here 即可打开 Git Bash 容器,并自动 cd 到了当前目录:

Android - 编译 openssl 踩坑之路

注:如果右键菜单中没有 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

Android - 编译 openssl 踩坑之路

这是因为 Git Bash 默认的 mingw64 环境中没有 make 工具,可以到如下地址,下载 make-4.4.1-without-guile-w32-bin.zip 文件。

make-4.4.1-without-guile-w32-bin.zip 压缩包中的所有文件拷贝到 \Git\mingw64 目录下,合并文件夹即可:

Android - 编译 openssl 踩坑之路

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

其实 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.

Android - 编译 openssl 踩坑之路

这是因为 Git Bash 默认自带的 perl 工具被精简过,缺少了一些文件,比如这里就找不到 Pod/Usage.pm,所以解决该问题也简单,补全这些缺少的文件即可,到 strawberryperl 官网下载 strawberry-perl-xx.zip 文件:

然后打开 strawberry-perl-xx.zip 压缩包,找到 \perl\lib\ 目录下的 Pod 文件夹,将其拷贝到本机的 \Git\usr\lib\perl5\vendor_perl 目录下:

Android - 编译 openssl 踩坑之路

注:如果本地已经有 Pod 目录,那么合并即可。

经过上述几个填坑步骤之后,在 Git Bash 窗口中就可以顺利执行完 build_openssl.sh 了。😩😩😩

转载自:https://juejin.cn/post/7297225106204246057
评论
请登录