OpenSSL构建android 脚本

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}"
相关推荐
TheNextByte12 小时前
iPhone存储空间已满?如何轻松释放iPhone空间?
android·ios·iphone
似霰10 小时前
AIDL Hal 开发笔记2----AIDL HAL 实例分析light hal
android·framework·hal
—Qeyser10 小时前
Flutter 颜色完全指南
android·flutter·ios
2501_9160088912 小时前
iOS 上架需要哪些准备,账号、Bundle ID、证书、描述文件、安装测试及上传
android·ios·小程序·https·uni-app·iphone·webview
摘星编程14 小时前
React Native for OpenHarmony 实战:DatePickerAndroid 日期选择器详解
android·react native·react.js
花卷HJ16 小时前
Android 沉浸式全屏实践:主题 + 状态栏文字颜色完整方案
android
花卷HJ17 小时前
Android 项目中 BaseActivity 封装实践(支持 ViewBinding、PermissionUtils动态权限、加载弹窗和跳转动画)
android
消失的旧时光-194318 小时前
Android 接入 Flutter(Add-to-App)最小闭环:10 分钟跑起第一个混合页面
android·flutter
城东米粉儿19 小时前
android StrictMode 笔记
android