CentOS 7 编译安卓 arm64-v8a 版 OpenSSL 动态库(.so)

完整教程:

本教程基于 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.81gcc ≥ 4.8.5perl ≥ 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.solibcrypto.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

六、常见问题排查

  1. 报错:No such file or directory(编译器路径)
    → 检查 CC 变量路径是否正确,或 NDK 解压不完整(重新解压 NDK)。
  2. 编译慢/卡死
    → 减小 make -j 后的核心数(如从 -j4 改为 -j2),或服务器内存不足(建议至少 2G 内存)。
  3. 报错:undefined reference to xxx
    → 确保 --sysroot 参数指向 $TOOLCHAIN/sysroot,且未遗漏 -DANDROID 宏定义。
  4. 库体积过大
    → 在 Configure 中增加 no-srp no-psk no-rsa 等参数,禁用更多非必需算法。

最终成果

编译完成后,/opt/openssl-android/arm64/lib/ 下的 libssl.solibcrypto.so 可直接用于安卓 arm64-v8a 架构项目,无冗余依赖,兼容安卓 5.0+ 系统。

相关推荐
柯南二号2 小时前
【大前端】【Android】用 Python 脚本模拟点击 Android APP —— 全面技术指南
android·前端·python
龚礼鹏2 小时前
图像显示框架六——SurfaceFlinger的初始化以及任务调度(基于Android 15源码分析)
android
壮哥_icon2 小时前
Android 使用 PackageInstaller 实现静默安装,并通过 BroadcastReceiver 自动重启应用
android·gitee·android-studio·android系统
ベadvance courageouslyミ2 小时前
系统编程之进程
linux·进程·pcb结构体
松涛和鸣2 小时前
29、Linux进程核心概念与编程实战:fork/getpid全解析
linux·运维·服务器·网络·数据结构·哈希算法
ao_lang2 小时前
MySQL的存储过程和触发器
android·数据库·mysql
WebCsDn_TDCode2 小时前
Android Studio使用教程
android·android studio
小蜜蜂嗡嗡2 小时前
Android studio配置忽略文件
android·ide·android studio
南棱笑笑生3 小时前
20251211给飞凌OK3588-C开发板适配Rockchip原厂的Buildroot【linux-6.1】系统时适配adb【type-C0】
linux·c语言·adb·rockchip