build_openssl_android_fixed.sh
bash
#!/bin/bash
# build_openssl_android_fixed.sh
# 配置变量
OPENSSL_SOURCE_DIR="/Users/longwei/CLionProjects/rabbitmq-c/openssl"
ANDROID_NDK="/Users/longwei/Library/Android/sdk/ndk/25.1.8937393"
API_LEVEL=21
OUTPUT_DIR="${OPENSSL_SOURCE_DIR}/android_libs"
echo "开始为 Android 构建 OpenSSL..."
echo "NDK 路径: ${ANDROID_NDK}"
echo "源码路径: ${OPENSSL_SOURCE_DIR}"
# 检查目录
if [ ! -d "${OPENSSL_SOURCE_DIR}" ]; then
echo "错误: OpenSSL 源码目录不存在: ${OPENSSL_SOURCE_DIR}"
exit 1
fi
if [ ! -d "${ANDROID_NDK}" ]; then
echo "错误: Android NDK 目录不存在: ${ANDROID_NDK}"
exit 1
fi
cd ${OPENSSL_SOURCE_DIR}
# 设置环境变量
export ANDROID_NDK_ROOT="${ANDROID_NDK}"
export ANDROID_NDK_HOME="${ANDROID_NDK}"
export PATH="${ANDROID_NDK}/toolchains/llvm/prebuilt/darwin-x86_64/bin:${PATH}"
echo "环境变量已设置"
echo "ANDROID_NDK_ROOT=${ANDROID_NDK_ROOT}"
echo "PATH 中包含 NDK 工具链"
# 支持的 ABI 列表
ABIS=("armeabi-v7a" "arm64-v8a" "x86" "x86_64")
# 创建输出目录
rm -rf ${OUTPUT_DIR}
mkdir -p ${OUTPUT_DIR}
for ABI in "${ABIS[@]}"; do
echo "=========================================="
echo "构建 OpenSSL for ${ABI}"
echo "=========================================="
# 创建每个 ABI 的构建目录
BUILD_DIR="${OPENSSL_SOURCE_DIR}/build_${ABI}"
rm -rf ${BUILD_DIR}
mkdir -p ${BUILD_DIR}
cd ${BUILD_DIR}
# 设置架构相关变量
case ${ABI} in
armeabi-v7a)
ARCH="arm"
ANDROID_ARCH="armv7a"
TARGET="android-arm"
;;
arm64-v8a)
ARCH="arm64"
ANDROID_ARCH="aarch64"
TARGET="android-arm64"
;;
x86)
ARCH="x86"
ANDROID_ARCH="i686"
TARGET="android-x86"
;;
x86_64)
ARCH="x86_64"
ANDROID_ARCH="x86_64"
TARGET="android-x86_64"
;;
*)
echo "未知的 ABI: ${ABI}"
continue
;;
esac
echo "目标平台: ${TARGET}"
echo "API 级别: ${API_LEVEL}"
# 检查是否需要切换到 OpenSSL 1.1.1(兼容性更好)
# 如果当前是 OpenSSL 3.x,建议切换到 1.1.1
cd ${OPENSSL_SOURCE_DIR}
# 检查当前分支
CURRENT_BRANCH=$(git branch --show-current)
echo "当前 OpenSSL 分支: ${CURRENT_BRANCH}"
# 如果是 3.x 版本,建议切换到 1.1.1
if [[ "${CURRENT_BRANCH}" == *"3."* ]] || [ "${CURRENT_BRANCH}" = "master" ]; then
echo "检测到 OpenSSL 3.x,切换到 1.1.1 版本以获得更好兼容性..."
git checkout OpenSSL_1_1_1u 2>/dev/null || git checkout tags/OpenSSL_1_1_1u
fi
cd ${BUILD_DIR}
# 配置 OpenSSL
echo "配置 OpenSSL..."
# 对于 OpenSSL 1.1.1,使用以下配置
if [[ $(cd ${OPENSSL_SOURCE_DIR} && git describe --tags 2>/dev/null) == *"1.1.1"* ]]; then
echo "使用 OpenSSL 1.1.1 配置"
# 设置交叉编译环境
export CC="${ANDROID_NDK}/toolchains/llvm/prebuilt/darwin-x86_64/bin/${ANDROID_ARCH}-linux-android${API_LEVEL}-clang"
export AR="${ANDROID_NDK}/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar"
export RANLIB="${ANDROID_NDK}/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib"
# 配置命令
${OPENSSL_SOURCE_DIR}/Configure ${TARGET} \
-D__ANDROID_API__=${API_LEVEL} \
no-shared \
no-ssl3 \
no-comp \
no-hw \
no-engine \
--prefix="${OUTPUT_DIR}/${ABI}" \
--openssldir="${OUTPUT_DIR}/${ABI}"
else
# 对于 OpenSSL 3.x,使用不同的配置
echo "使用 OpenSSL 3.x 配置"
# 配置命令
${OPENSSL_SOURCE_DIR}/Configure ${TARGET} \
-D__ANDROID_API__=${API_LEVEL} \
no-shared \
no-ssl3 \
no-comp \
no-engine \
--prefix="${OUTPUT_DIR}/${ABI}" \
--openssldir="${OUTPUT_DIR}/${ABI}"
fi
# 检查配置是否成功
if [ $? -ne 0 ]; then
echo "错误: OpenSSL 配置失败"
exit 1
fi
echo "配置成功,开始构建..."
# 构建
make depend
if [ $? -ne 0 ]; then
echo "错误: make depend 失败"
exit 1
fi
make -j$(sysctl -n hw.ncpu)
if [ $? -ne 0 ]; then
echo "错误: 构建失败"
exit 1
fi
# 安装
make install_sw
if [ $? -ne 0 ]; then
echo "错误: 安装失败"
exit 1
fi
echo "OpenSSL for ${ABI} 构建完成!"
echo "输出目录: ${OUTPUT_DIR}/${ABI}"
# 验证构建结果
echo "验证构建结果:"
ls -la "${OUTPUT_DIR}/${ABI}/lib/" 2>/dev/null || echo "警告: 库目录未生成"
cd ${OPENSSL_SOURCE_DIR}
done
echo "所有 ABI 的 OpenSSL 构建完成!"
echo "输出目录: ${OUTPUT_DIR}"
build_openssl_android_3.x_fixed.sh
bah
#!/bin/bash
# build_openssl_android_3.x_fixed.sh
# 配置变量
OPENSSL_SOURCE_DIR="/Users/longwei/CLionProjects/rabbitmq-c/openssl"
ANDROID_NDK="/Users/longwei/Library/Android/sdk/ndk/25.1.8937393"
API_LEVEL=21
OUTPUT_DIR="${OPENSSL_SOURCE_DIR}/android_libs_shared_3.x"
echo "开始为 Android 构建 OpenSSL 3.x (动态库)..."
echo "NDK 路径: ${ANDROID_NDK}"
echo "源码路径: ${OPENSSL_SOURCE_DIR}"
# 检查目录
if [ ! -d "${OPENSSL_SOURCE_DIR}" ]; then
echo "错误: OpenSSL 源码目录不存在: ${OPENSSL_SOURCE_DIR}"
exit 1
fi
if [ ! -d "${ANDROID_NDK}" ]; then
echo "错误: Android NDK 目录不存在: ${ANDROID_NDK}"
exit 1
fi
cd ${OPENSSL_SOURCE_DIR}
# 设置环境变量
export ANDROID_NDK_ROOT="${ANDROID_NDK}"
export ANDROID_NDK_HOME="${ANDROID_NDK}"
export PATH="${ANDROID_NDK}/toolchains/llvm/prebuilt/darwin-x86_64/bin:${PATH}"
# 确保使用 OpenSSL 3.x 版本
echo "检查 OpenSSL 版本..."
CURRENT_TAG=$(git describe --tags 2>/dev/null || echo "")
echo "当前 OpenSSL 标签: ${CURRENT_TAG}"
# 如果不是 3.x 版本,切换到最新稳定版
if [[ ! "${CURRENT_TAG}" =~ ^OpenSSL_3\. ]] && [[ ! "${CURRENT_TAG}" =~ ^openssl-3\. ]]; then
echo "切换到 OpenSSL 3.x 分支..."
# 获取最新的 3.x 标签
LATEST_3_TAG=$(git tag -l "openssl-3.*" | sort -V | tail -1)
if [ -n "${LATEST_3_TAG}" ]; then
git checkout ${LATEST_3_TAG}
else
# 或者使用 3.0 稳定分支
git checkout openssl-3.0.0 2>/dev/null || \
echo "警告: 无法切换到 OpenSSL 3.x 分支"
fi
fi
echo "使用 OpenSSL 版本: $(git describe --tags 2>/dev/null || echo '未知')"
# 支持的 ABI 列表
ABIS=("arm64-v8a" "armeabi-v7a") # arm64-v8a 优先
# 创建输出目录
rm -rf ${OUTPUT_DIR}
mkdir -p ${OUTPUT_DIR}
for ABI in "${ABIS[@]}"; do
echo "=========================================="
echo "构建 OpenSSL 3.x for ${ABI} (动态库)"
echo "=========================================="
# 创建每个 ABI 的构建目录
BUILD_DIR="${OPENSSL_SOURCE_DIR}/build_3.x_${ABI}"
rm -rf ${BUILD_DIR}
mkdir -p ${BUILD_DIR}
cd ${BUILD_DIR}
# 设置架构相关变量
case ${ABI} in
armeabi-v7a)
TARGET="android-arm"
ARCH="arm"
ANDROID_ARCH="armv7a"
;;
arm64-v8a)
TARGET="android-arm64"
ARCH="arm64"
ANDROID_ARCH="aarch64"
;;
x86)
TARGET="android-x86"
ARCH="x86"
ANDROID_ARCH="i686"
;;
x86_64)
TARGET="android-x86_64"
ARCH="x86_64"
ANDROID_ARCH="x86_64"
;;
*)
echo "跳过未知的 ABI: ${ABI}"
continue
;;
esac
echo "目标平台: ${TARGET}"
echo "API 级别: ${API_LEVEL}"
echo "构建类型: 动态库"
# 设置交叉编译环境
export CC="${ANDROID_NDK}/toolchains/llvm/prebuilt/darwin-x86_64/bin/${ANDROID_ARCH}-linux-android${API_LEVEL}-clang"
export AR="${ANDROID_NDK}/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ar"
export RANLIB="${ANDROID_NDK}/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-ranlib"
export STRIP="${ANDROID_NDK}/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-strip"
# OpenSSL 3.x 需要这些环境变量
export CROSS_COMPILE="${ANDROID_ARCH}-linux-android-"
export CROSS_COMPILE_DIR="${ANDROID_NDK}/toolchains/llvm/prebuilt/darwin-x86_64"
# 设置 CFLAGS
export CFLAGS="-fPIC -DOPENSSL_PIC -DOPENSSL_USE_IPV6=0"
echo "CC=${CC}"
echo "AR=${AR}"
# 配置 OpenSSL 3.x
echo "配置 OpenSSL 3.x (使用 shared 选项)..."
# OpenSSL 3.x 的配置命令
${OPENSSL_SOURCE_DIR}/Configure ${TARGET} \
-D__ANDROID_API__=${API_LEVEL} \
shared \ # 构建动态库
no-ssl3 \
no-comp \
no-hw \
no-engine \
--prefix="${OUTPUT_DIR}/${ABI}" \
--libdir=lib \
--openssldir="${OUTPUT_DIR}/${ABI}"
# 检查配置是否成功
if [ $? -ne 0 ]; then
echo "错误: OpenSSL 3.x 配置失败"
# 尝试使用简化的配置
echo "尝试简化配置..."
${OPENSSL_SOURCE_DIR}/Configure ${TARGET} \
-D__ANDROID_API__=${API_LEVEL} \
shared \
--prefix="${OUTPUT_DIR}/${ABI}"
fi
if [ $? -ne 0 ]; then
echo "错误: OpenSSL 配置完全失败"
echo "尝试清理配置缓存..."
make distclean 2>/dev/null || true
exit 1
fi
echo "配置成功,开始构建..."
# 构建
echo "执行 make..."
make -j$(sysctl -n hw.ncpu) build_libs
if [ $? -ne 0 ]; then
echo "错误: 构建失败"
echo "尝试重新配置..."
make clean 2>/dev/null || true
exit 1
fi
# 构建共享库
echo "构建共享库..."
make -j$(sysctl -n hw.ncpu) build_shared_libs
if [ $? -ne 0 ]; then
echo "警告: 共享库构建失败,尝试构建静态库"
# 继续安装静态库
fi
# 安装
echo "安装库文件..."
make install_sw install_ssldirs
if [ $? -ne 0 ]; then
echo "警告: 安装失败,尝试手动复制"
# 手动复制文件
mkdir -p "${OUTPUT_DIR}/${ABI}/lib"
mkdir -p "${OUTPUT_DIR}/${ABI}/include"
# 复制库文件
if [ -f "libssl.so" ] && [ -f "libcrypto.so" ]; then
cp libssl.so libcrypto.so "${OUTPUT_DIR}/${ABI}/lib/"
echo "手动复制了动态库文件"
elif [ -f "libssl.a" ] && [ -f "libcrypto.a" ]; then
cp libssl.a libcrypto.a "${OUTPUT_DIR}/${ABI}/lib/"
echo "复制了静态库文件"
fi
# 复制头文件
if [ -d "${OPENSSL_SOURCE_DIR}/include/openssl" ]; then
cp -r "${OPENSSL_SOURCE_DIR}/include/openssl" "${OUTPUT_DIR}/${ABI}/include/"
echo "复制了头文件"
fi
fi
echo "OpenSSL 3.x for ${ABI} 构建完成!"
echo "输出目录: ${OUTPUT_DIR}/${ABI}"
# 验证构建结果
echo "验证构建结果:"
echo "库文件:"
find "${OUTPUT_DIR}/${ABI}/lib" -type f \( -name "*.so" -o -name "*.a" \) 2>/dev/null | xargs ls -la 2>/dev/null || echo "未找到库文件"
echo "头文件:"
ls -la "${OUTPUT_DIR}/${ABI}/include/openssl/" 2>/dev/null | head -5
# 修复:检查库文件架构
echo "检查库文件架构:"
# 使用安全的方法检查 .so 文件
if [ -d "${OUTPUT_DIR}/${ABI}/lib" ]; then
for lib in "${OUTPUT_DIR}/${ABI}/lib/"*.so; do
# 检查文件是否存在(避免无匹配时原样输出)
if [ -f "$lib" ]; then
echo "检查 $lib:"
file "$lib" | grep -E "ELF|ARM"
fi
done
fi
cd ${OPENSSL_SOURCE_DIR}
done
echo "所有 ABI 的 OpenSSL 3.x 构建完成!"
echo "输出目录: ${OUTPUT_DIR}"