如何在 WSL 中基于 Android NDK r21d 编译 OpenSSL 1.1.1i

# 简介

最近公司项目需要将部分安全方面的功能从 Java 层移植到 C/C++ 层, 以便增强软件包的安全性, 因此涉及到了 OpenSSL 的移植.

起初以为这个需求挺常见的, 解决方案应该比较普遍/成熟, 后来实践起来发现用各种不同的工具链组合起来就会遇到各种不同的 Bug ...

在搜索过各种论坛/社区/文档之间后, 终于找到了一个比较符合项目现状的方案, 逐步操作下来确实可以成功编译出需要的产物, 特此记录一下.

# 准备操作系统:

Microsoft Store 中安装 WSL Ubuntu 20

# 准备工作空间:

在命令行窗口中通过 wslubuntu 进入 WSL 操作系统后, 创建工作空间:

cd ~
mkdir workspace
cd workspace

# 下载适用于 Linux 的 Android NDK r21d

wget https://dl.google.com/android/repository/android-ndk-r21d-linux-x86_64.zip
unzip android-ndk-r21d-linux-x86_64

Android NDK 下载源:

# 下载 OpenSSL 1.1.1i 源码

wget https://www.openssl.org/source/openssl-1.1.1i.tar.gz
tar zxf openssl-1.1.1i.tar.gz

OpenSSL 下载源:

# 交叉编译 OpenSSL 1.1.1i with Android NDK r21d

https://wiki.openssl.org/index.php/Android 上的的步骤已经过时了. (#7578 (opens new window))

参考 https://github.com/openssl/openssl/blob/master/NOTES-Android.md (opens new window) . 针对高版本的 Android NDK 需要执行以下指令:

# 高版本 NDK 不再包含 gcc, 因此需要将 Android NDK 内置的 clang 纳入 PATH 环境变量
export ANDROID_NDK_HOME=$PWD/android-ndk-r21d
export PATH=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin:$PASH
export PATH=$ANDROID_NDK_HOME/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin:$PATH

cd openssl-1.1.1i

# 清理 make 产物, 以免受缓存影响导致编译出错
make clean 
# 生成最低支持 api 到 21 的 arm64 架构的 Makefile
./Configure android-arm64 -D__ANDROID_API__=21
# 执行编译
make

指令执行完毕时在 ~/workspace/openssl-1.1.1i/ 目录下找到 libssl.a, libcrypto.so 等产物即可视为交叉编译成功.

另外通过执行 ./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

# 参考