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+ 系统。

相关推荐
fengyehongWorld5 小时前
Linux logger命令
linux·运维·服务器
南知意-5 小时前
GitHub 6K Star! 一款完全免费的音乐播放器,爽听VIP歌曲!
linux·windows·开源·github·开源软件·mac
好好学习啊天天向上5 小时前
最新:ubuntu上源码安装llvm,还没有成功
linux·运维·ubuntu
TheNextByte15 小时前
Android USB文件传输无法使用?5种解决方法
android
Stestack5 小时前
ssh批量机器免密操作
linux·python·ssh
jerryinwuhan5 小时前
1231_linux_shell_1
linux
Guistar~~5 小时前
【Linux驱动开发IMX6ULL】使用NXP MfgTool 烧写系统到eMMC
linux·运维·驱动开发
啵啵啵啵哲6 小时前
【输入法】Ubuntu 22.04 终极输入法方案:Fcitx5 + 雾凇拼音 (Flatpak版)
linux·运维·ubuntu
quanyechacsdn6 小时前
Android Studio创建库文件用jitpack构建后使用implementation方式引用
android·ide·kotlin·android studio·implementation·android 库文件·使用jitpack
Y unes6 小时前
《uboot基础命令记录①》
linux·驱动开发·嵌入式硬件·mcu·ubuntu·uboot