完整教程:
本教程基于 CentOS 7 环境,编译适配安卓 5.0+(API 21)的 OpenSSL 1.1.1w 动态库(arm64-v8a 架构),全程避坑,步骤可直接落地。
一、环境准备
1. 基础依赖(已验证满足的可跳过)
确保 CentOS 7 安装以下工具:
bash
# 安装核心依赖
yum install -y wget make gcc gcc-c++ perl patch unzip
验证依赖(可选):
bash
make --version && gcc --version && perl --version
要求:make ≥ 3.81、gcc ≥ 4.8.5、perl ≥ 5.16(CentOS 7 默认版本均满足)。
2. 下载并解压 Android NDK
选择 NDK r21e(适配 CentOS 7,且兼容安卓 5.0+):
bash
# 下载 NDK(若下载慢,可手动上传到 /tmp 目录)
wget https://dl.google.com/android/repository/android-ndk-r21e-linux-x86_64.zip -O /tmp/android-ndk-r21e-linux-x86_64.zip
# 解压到 /opt 目录(权限稳定,避免路径问题)
mkdir -p /opt
unzip /tmp/android-ndk-r21e-linux-x86_64.zip -d /opt
# 简化 NDK 路径(避免层级过深)
mv /opt/android-ndk-r21e /opt/
二、编译步骤(核心)
1. 配置环境变量(关键)
执行以下命令,统一设置编译环境变量(终端临时生效,关闭终端需重新执行):
bash
# NDK 核心路径
export ANDROID_NDK_HOME=/opt/android-ndk-r21e
export NDK_PATH=$ANDROID_NDK_HOME
# 编译架构(arm64-v8a)
export ARCH=arm64
export CPU=armv8-a
export TARGET=aarch64-linux-android
export API=21 # 安卓最低支持版本(5.0)
# NDK 工具链路径
export TOOLCHAIN=$NDK_PATH/toolchains/llvm/prebuilt/linux-x86_64
# 编译产物输出目录
export OUTPUT=/opt/openssl-android/$ARCH
mkdir -p $OUTPUT
# 强制指定交叉编译工具(核心:避免路径拼接错误)
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
export AR=$TOOLCHAIN/bin/$TARGET-ar
export LD=$TOOLCHAIN/bin/$TARGET-ld
export RANLIB=$TOOLCHAIN/bin/$TARGET-ranlib
export STRIP=$TOOLCHAIN/bin/$TARGET-strip
# 验证工具路径(确保无报错)
ls $CC
2. 下载并解压 OpenSSL 源码
选择 OpenSSL 1.1.1w(LTS 长期支持版本,稳定适配安卓):
bash
# 下载源码
wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz -O /tmp/openssl-1.1.1w.tar.gz
# 解压到临时目录
tar -zxvf /tmp/openssl-1.1.1w.tar.gz -C /tmp
# 进入源码目录
cd /tmp/openssl-1.1.1w
3. 清理残留配置(首次编译可跳过,重试必执行)
bash
make distclean
rm -rf configdata.pm Makefile include/openssl/opensslconf.h
4. 配置 OpenSSL 编译参数
使用通用 Linux 配置 + 安卓宏定义(避开 OpenSSL 安卓脚本的 gcc 依赖问题):
bash
./Configure linux-generic64 \
--prefix=$OUTPUT \ # 产物安装路径
--openssldir=$OUTPUT \ # 配置文件路径
shared \ # 编译动态库(.so)
no-ssl3 \ # 禁用不安全的 SSL3
no-comp \ # 禁用压缩(减小库体积)
no-hw \ # 禁用硬件加速(避免架构兼容问题)
no-engine \ # 禁用引擎(非必需)
no-weak-ssl-ciphers \ # 禁用弱密码套件
--sysroot=$TOOLCHAIN/sysroot \ # 安卓系统根目录
-fPIC \ # 位置无关代码(安卓必需)
-DANDROID \ # 标识安卓平台
-D__ANDROID_API__=$API \ # 指定安卓最低版本
-pie -fPIE \ # 安卓要求 PIE 模式
CC="$CC" \ # 手动指定 C 编译器
CXX="$CXX" \ # 手动指定 C++ 编译器
AR="$AR" \ # 手动指定静态库打包工具
LD="$LD" \ # 手动指定链接器
RANLIB="$RANLIB" \ # 手动指定索引工具
STRIP="$STRIP" # 手动指定符号清理工具
✅ 配置成功标志:终端输出最后一行显示 Configured for linux-generic64.,无报错。
5. 编译并安装
bash
# 编译(-j2 表示用 2 核编译,根据服务器核心数调整,如 4 核写 -j4)
make -j2
# 安装产物到 $OUTPUT 目录
make install
✅ 编译成功标志:无 error: 报错,终端最后输出 Installing shared libraries 等提示。
三、验证编译结果
1. 查看产物目录
bash
ls -l $OUTPUT/lib/
预期输出(核心动态库):
-rwxr-xr-x 1 root root 580216 月 日 时:分 libssl.so
-rwxr-xr-x 1 root root 3825104 月 日 时:分 libcrypto.so
lrwxrwxrwx 1 root root 11 月 日 时:分 libssl.so.1.1 -> libssl.so
lrwxrwxrwx 1 root root 13 月 日 时:分 libcrypto.so.1.1 -> libcrypto.so
2. 验证库架构(关键)
bash
file $OUTPUT/lib/libssl.so
预期输出(确认是安卓 arm64 架构):
libssl.so: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, BuildID[sha1]=xxx, with debug_info, not stripped
四、产物说明与备份
1. 产物路径
- 动态库:
/opt/openssl-android/arm64/lib/libssl.so、libcrypto.so - 头文件:
/opt/openssl-android/arm64/include/openssl/(安卓项目编译时需引入)
2. 备份产物(可选)
bash
# 打包备份
tar -zcvf openssl-android-arm64-v8a.tar.gz /opt/openssl-android/arm64
五、扩展:编译其他架构(如 armeabi-v7a)
只需替换环境变量,重复上述编译步骤:
bash
# armeabi-v7a 环境变量
export ARCH=arm
export CPU=armv7-a
export TARGET=armv7a-linux-androideabi
export API=21
export TOOLCHAIN=$NDK_PATH/toolchains/llvm/prebuilt/linux-x86_64
export OUTPUT=/opt/openssl-android/$ARCH
export CC=$TOOLCHAIN/bin/$TARGET$API-clang
export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++
export AR=$TOOLCHAIN/bin/$TARGET-ar
export LD=$TOOLCHAIN/bin/$TARGET-ld
export RANLIB=$TOOLCHAIN/bin/$TARGET-ranlib
export STRIP=$TOOLCHAIN/bin/$TARGET-strip
六、常见问题排查
- 报错:No such file or directory(编译器路径)
→ 检查CC变量路径是否正确,或 NDK 解压不完整(重新解压 NDK)。 - 编译慢/卡死
→ 减小make -j后的核心数(如从-j4改为-j2),或服务器内存不足(建议至少 2G 内存)。 - 报错:undefined reference to xxx
→ 确保--sysroot参数指向$TOOLCHAIN/sysroot,且未遗漏-DANDROID宏定义。 - 库体积过大
→ 在Configure中增加no-srp no-psk no-rsa等参数,禁用更多非必需算法。
最终成果
编译完成后,/opt/openssl-android/arm64/lib/ 下的 libssl.so 和 libcrypto.so 可直接用于安卓 arm64-v8a 架构项目,无冗余依赖,兼容安卓 5.0+ 系统。