# 简介
最近公司项目需要将部分安全方面的功能从 Java
层移植到 C/C++
层, 以便增强软件包的安全性, 因此涉及到了 OpenSSL
的移植.
起初以为这个需求挺常见的, 解决方案应该比较普遍/成熟, 后来实践起来发现用各种不同的工具链组合起来就会遇到各种不同的 Bug ...
在搜索过各种论坛/社区/文档之间后, 终于找到了一个比较符合项目现状的方案, 逐步操作下来确实可以成功编译出需要的产物, 特此记录一下.
# 准备操作系统:
在 Microsoft Store
中安装 WSL Ubuntu 20
# 准备工作空间:
在命令行窗口中通过 wsl
或 ubuntu
进入 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
下载源:
- 官网下载地址: https://developer.android.google.cn/ndk/downloads?hl=zh-cn (opens new window)
- 历史版本下载地址: https://developer.android.google.cn/ndk/downloads/revision_history (opens new window)
# 下载 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 官网下载地址: https://www.openssl.org/source/ (opens new window)
- 历史版本下载地址: https://github.com/openssl/openssl/releases (opens new window)
# 交叉编译 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