【问题标题】:How to compile OpenSSL 1.1.1 for Android如何为 Android 编译 OpenSSL 1.1.1
【发布时间】:2019-03-14 00:11:11
【问题描述】:

有谁知道或有一个脚本可以在 Linux 机器上使用 Android NDK18 预编译 OpenSSL 1.1.1? 这个脚本:https://github.com/david-hoze/build-openssl-android 仅适用于 NDK17b 的 1.1.0.h,只是切换数字不起作用。 BRGDS 马库斯

【问题讨论】:

    标签: android openssl


    【解决方案1】:

    这适用于 Debian Windows 子系统:

    #!/bin/sh
    
    ANDROID_NDK=~/android-ndk-r18b
    OPENSSL_VERSION=1.1.1a
    
    API_LEVEL=23
    
    BUILD_DIR=/tmp/openssl_android_build
    OUT_DIR=/tmp/openssl_android
    
    BUILD_TARGETS="armeabi armeabi-v7a arm64-v8a x86 x86_64"
    
    if [ ! -d openssl-${OPENSSL_VERSION} ]
    then
            if [ ! -f openssl-${OPENSSL_VERSION}.tar.gz ]
            then
                    wget https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz || exit 128
            fi
            tar xzf openssl-${OPENSSL_VERSION}.tar.gz || exit 128
    fi
    
    cd openssl-${OPENSSL_VERSION} || exit 128
    
    
    ##### Prepare Files #####
    sed -i 's/.*-mandroid.*//' Configurations/15-android.conf
    patch -p1 -N <<EOP
    --- old/Configurations/unix-Makefile.tmpl       2018-09-11 14:48:19.000000000 +0200
    +++ new/Configurations/unix-Makefile.tmpl       2018-10-18 09:06:27.282007245 +0200
    @@ -43,12 +43,17 @@
          # will return the name from shlib(\$libname) with any SO version number
          # removed.  On some systems, they may therefore return the exact same
          # string.
    -     sub shlib {
    +     sub shlib_simple {
              my \$lib = shift;
              return () if \$disabled{shared} || \$lib =~ /\\.a$/;
    -         return \$unified_info{sharednames}->{\$lib}. \$shlibvariant. '\$(SHLIB_EXT)';
    +
    +         if (windowsdll()) {
    +             return \$lib . '\$(SHLIB_EXT_IMPORT)';
    +         }
    +         return \$lib .  '\$(SHLIB_EXT_SIMPLE)';
          }
    -     sub shlib_simple {
    +
    +       sub shlib {
              my \$lib = shift;
              return () if \$disabled{shared} || \$lib =~ /\\.a$/;
    
    EOP
    
    ##### remove output-directory #####
    rm -rf $OUT_DIR
    
    ##### export ndk directory. Required by openssl-build-scripts #####
    export ANDROID_NDK
    
    ##### build-function #####
    build_the_thing() {
            TOOLCHAIN=$ANDROID_NDK/toolchains/$TC_NAME/prebuilt/linux-x86_64
            export PATH=$TOOLCHAIN/$TRIBLE/bin:$TOOLCHAIN/bin:"$PATH"
            make clean
            ./Configure $SSL_TARGET $OPTIONS -fuse-ld="$TOOLCHAIN/$TRIBLE/bin/ld" "-gcc-toolchain $TOOLCHAIN" && \
            make && \
            make install DESTDIR=$DESTDIR || exit 128
    }
    
    ##### set variables according to build-tagret #####
    for build_target in $BUILD_TARGETS
    do
            case $build_target in
            armeabi)
                    TRIBLE="arm-linux-androideabi"
                    TC_NAME="arm-linux-androideabi-4.9"
                    OPTIONS="--target=armv5te-linux-androideabi -mthumb -fPIC -latomic -D__ANDROID_API__=$API_LEVEL"
                    DESTDIR="/tmp/$BUILD_DIR/armeabi"
                    SSL_TARGET="android-arm"
            ;;
            armeabi-v7a)
                    TRIBLE="arm-linux-androideabi"
                    TC_NAME="arm-linux-androideabi-4.9"
                    OPTIONS="--target=armv7a-linux-androideabi -Wl,--fix-cortex-a8 -fPIC -D__ANDROID_API__=$API_LEVEL"
                    DESTDIR="/tmp/$BUILD_DIR/armeabi-v7a"
                    SSL_TARGET="android-arm"
            ;;
            x86)
                    TRIBLE="i686-linux-android"
                    TC_NAME="x86-4.9"
                    OPTIONS="-fPIC -D__ANDROID_API__=${API_LEVEL}"
                    DESTDIR="/tmp/$BUILD_DIR/x86"
                    SSL_TARGET="android-x86"
            ;;
            x86_64)
                    TRIBLE="x86_64-linux-android"
                    TC_NAME="x86_64-4.9"
                    OPTIONS="-fPIC -D__ANDROID_API__=${API_LEVEL}"
                    DESTDIR="/tmp/$BUILD_DIR/x86_64"
                    SSL_TARGET="android-x86_64"
            ;;
            arm64-v8a)
                    TRIBLE="aarch64-linux-android"
                    TC_NAME="aarch64-linux-android-4.9"
                    OPTIONS="-fPIC -D__ANDROID_API__=${API_LEVEL}"
                    DESTDIR="/tmp/$BUILD_DIR/arm64-v8a"
                    SSL_TARGET="android-arm64"
            ;;
            esac
    
            rm -rf $DESTDIR
            build_the_thing
    #### copy libraries and includes to output-directory #####
            mkdir -p $OUT_DIR/inc/$build_target
            cp -R $DESTDIR/usr/local/include/* $OUT_DIR/inc/$build_target
            mkdir -p $OUT_DIR/lib/$build_target
            cp -R $DESTDIR/usr/local/lib/*.so $OUT_DIR/lib/$build_target
    done
    
    echo Success

    【讨论】:

      【解决方案2】:

      针对 OpenSSL 1.1.1b / Android NDK R19C 更​​新:

      #!/bin/sh
      
      ANDROID_NDK=~/android-ndk-r19c
      OPENSSL_VERSION=1.1.1b
      
      API_LEVEL=23
      
      BUILD_DIR=/tmp/openssl_android_build
      OUT_DIR=/tmp/openssl_android
      
      BUILD_TARGETS="armeabi armeabi-v7a arm64-v8a x86 x86_64"
      
      if [ ! -d openssl-${OPENSSL_VERSION} ]
      then
          if [ ! -f openssl-${OPENSSL_VERSION}.tar.gz ]
          then
              wget https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz || exit 128
          fi
          tar xzf openssl-${OPENSSL_VERSION}.tar.gz || exit 128
      fi
      
      cd openssl-${OPENSSL_VERSION} || exit 128
      
      
      ##### Prepare Files #####
      sed -i 's/.*-mandroid.*//' Configurations/15-android.conf
      patch -p1 -N <<EOP
      --- old/Configurations/unix-Makefile.tmpl   2018-09-11 14:48:19.000000000 +0200
      +++ new/Configurations/unix-Makefile.tmpl   2018-10-18 09:06:27.282007245 +0200
      @@ -43,12 +43,17 @@
            # will return the name from shlib(\$libname) with any SO version number
            # removed.  On some systems, they may therefore return the exact same
            # string.
      -     sub shlib {
      +     sub shlib_simple {
                my \$lib = shift;
                return () if \$disabled{shared} || \$lib =~ /\\.a$/;
      -         return \$unified_info{sharednames}->{\$lib}. \$shlibvariant. '\$(SHLIB_EXT)';
      +
      +         if (windowsdll()) {
      +             return \$lib . '\$(SHLIB_EXT_IMPORT)';
      +         }
      +         return \$lib .  '\$(SHLIB_EXT_SIMPLE)';
            }
      -     sub shlib_simple {
      +     
      +   sub shlib {
                my \$lib = shift;
                return () if \$disabled{shared} || \$lib =~ /\\.a$/;
      
      EOP
      
      ##### remove output-directory #####
      rm -rf $OUT_DIR
      
      ##### export ndk directory. Required by openssl-build-scripts #####
      export ANDROID_NDK
      
      ##### build-function #####
      build_the_thing() {
          TOOLCHAIN=$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64
          export PATH=$TOOLCHAIN/$TRIBLE/bin:$TOOLCHAIN/bin:"$PATH"
      echo $PATH
          make clean
          #./Configure $SSL_TARGET $OPTIONS -fuse-ld="$TOOLCHAIN/$TRIBLE/bin/ld" "-gcc-toolchain $TOOLCHAIN" && \
          ./Configure $SSL_TARGET $OPTIONS -fuse-ld="$TOOLCHAIN/$TRIBLE/bin/ld" && \
          make && \
          make install DESTDIR=$DESTDIR || exit 128
      }
      
      ##### set variables according to build-tagret #####
      for build_target in $BUILD_TARGETS
      do
          case $build_target in
          armeabi)
              TRIBLE="arm-linux-androideabi"
              TC_NAME="arm-linux-androideabi-4.9"
              #OPTIONS="--target=armv5te-linux-androideabi -mthumb -fPIC -latomic -D__ANDROID_API__=$API_LEVEL"
              OPTIONS="--target=armv5te-linux-androideabi -mthumb -fPIC -latomic -D__ANDROID_API__=$API_LEVEL"
              DESTDIR="/tmp/$BUILD_DIR/armeabi"
              SSL_TARGET="android-arm"
          ;;
          armeabi-v7a)
              TRIBLE="arm-linux-androideabi"
              TC_NAME="arm-linux-androideabi-4.9"
              OPTIONS="--target=armv7a-linux-androideabi -Wl,--fix-cortex-a8 -fPIC -D__ANDROID_API__=$API_LEVEL"
              DESTDIR="/tmp/$BUILD_DIR/armeabi-v7a"
              SSL_TARGET="android-arm"
          ;;
          x86)
              TRIBLE="i686-linux-android"
              TC_NAME="x86-4.9"
              OPTIONS="-fPIC -D__ANDROID_API__=${API_LEVEL}"
              DESTDIR="/tmp/$BUILD_DIR/x86"
              SSL_TARGET="android-x86"
          ;;
          x86_64)
              TRIBLE="x86_64-linux-android"
              TC_NAME="x86_64-4.9"
              OPTIONS="-fPIC -D__ANDROID_API__=${API_LEVEL}"
              DESTDIR="/tmp/$BUILD_DIR/x86_64"
              SSL_TARGET="android-x86_64"
          ;;
          arm64-v8a)
              TRIBLE="aarch64-linux-android"
              TC_NAME="aarch64-linux-android-4.9"
              OPTIONS="-fPIC -D__ANDROID_API__=${API_LEVEL}"
              DESTDIR="/tmp/$BUILD_DIR/arm64-v8a"
              SSL_TARGET="android-arm64"
          ;;
          esac
      
          rm -rf $DESTDIR
          build_the_thing
      #### copy libraries and includes to output-directory #####
          mkdir -p $OUT_DIR/inc/$build_target
          cp -R $DESTDIR/usr/local/include/* $OUT_DIR/inc/$build_target
          mkdir -p $OUT_DIR/lib/$build_target
          cp -R $DESTDIR/usr/local/lib/*.so $OUT_DIR/lib/$build_target
      done
      
      echo Success
      

      【讨论】:

      • 工作完美!我用的是ndk r19c,api级别28,openssl 1.1.1c。对于 MacOS,我需要将 'linux-x86_64' 更改为 'darwin-x86_64'。
      • 这太棒了,我可以构建库,但 libcrypto 抛出错误失败:dlopen 失败:加载时无法找到 API 22(Android 5)上引用的符号“__register_atfork”
      • 或许您可以尝试将脚本中的 API Level 设置为 22。但最终 22 已过时并且与较新的版本不兼容。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-31
      • 2020-05-29
      • 1970-01-01
      • 2020-01-20
      • 1970-01-01
      • 1970-01-01
      • 2019-06-29
      相关资源
      最近更新 更多