OpenSSL für Android compilieren

Submitted by admin on So, 11.12.2016 - 12:00

Mit dem folgenden Skript kann man OpenSSL unter Android compilieren.

Voraussetzungen

  • Android Studio
  • In Android Studio -> SDK muss auch ndk installiert sein

mk-openssl-android.sh

#!/bin/sh

#######################################################################################
# prerequisites
# * Android Studio
# * You Android ndk (select this in Android Studio -> Android SDK)
#######################################################################################

# ==> Select latest version for security reasons
OPENSSL_VERSION="1.0.2h"
ANDROID_VERSION="23"
ABI_VERSION="4.9"

MY_HOME="/Users/myuser"

# ==> You _must_ change this!
cd "${MY_HOME}/Development/openssl" || exit 1

# Android Studio MacOS:
# ==> Need to be changed if not MacOS
NDK="${MY_HOME}/Library/Android/sdk/ndk-bundle"
export NDK

# ==> shared? Enable only if you need OpenSSL shared libraries
#OPENSSL_SHARED="shared"
OPENSSL_SHARED=""

if [ ! -f openssl-${OPENSSL_VERSION}.tar.gz ]; then
  wget https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz
fi

rm -rf "openssl-${OPENSSL_VERSION}"
tar xvf "openssl-${OPENSSL_VERSION}.tar.gz"
cd openssl-${OPENSSL_VERSION}

$NDK/build/tools/make-standalone-toolchain.sh --platform=android-${ANDROID_VERSION} --toolchain=arm-linux-androideabi-${ABI_VERSION} --install-dir=`pwd`/android-toolchain-arm

export TOOLCHAIN_PATH=`pwd`/android-toolchain-arm/bin
export TOOL=arm-linux-androideabi
export NDK_TOOLCHAIN_BASENAME=${TOOLCHAIN_PATH}/${TOOL}
export CC=$NDK_TOOLCHAIN_BASENAME-gcc
export CXX=$NDK_TOOLCHAIN_BASENAME-g++
export LINK=${CXX}
export LD=$NDK_TOOLCHAIN_BASENAME-ld
export AR=$NDK_TOOLCHAIN_BASENAME-ar
export RANLIB=$NDK_TOOLCHAIN_BASENAME-ranlib
export STRIP=$NDK_TOOLCHAIN_BASENAME-strip
export ARCH_FLAGS=""
export ARCH_LINK=""
export CPPFLAGS=" ${ARCH_FLAGS} -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
export CXXFLAGS=" ${ARCH_FLAGS} -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 -frtti -fexceptions "
export CFLAGS=" ${ARCH_FLAGS} -ffunction-sections -funwind-tables -fstack-protector -fno-strict-aliasing -finline-limit=64 "
export LDFLAGS=" ${ARCH_LINK} "

./Configure -fPIC -fPIE -pie android-armv7 --openssldir=/data/openssl ${OPENSSL_SHARED}

PATH=$TOOLCHAIN_PATH:$PATH make

DEST="apps/openssl"

arm-linux-androideabi-strip "$DEST"

arm-linux-androideabi-readelf -l "$DEST"

Es werden auch die richtigen Compilerflags gesetzt, damit das OpenSSL Executable position independent ist. Ansonsten verweigert Android in den aktuellen Versionen die Ausführung.

Installation

Mit adb wird das Binary in Android unter /data/openssl abgelegt. Weiterhin benötigt man aus dem OpenSSL Source Code noch die openssl.cnf, die ebenfalls nach /data/openssl zu kopieren ist.