diff --git a/Dockerfile.android b/Dockerfile.android new file mode 100644 index 0000000..17bd918 --- /dev/null +++ b/Dockerfile.android @@ -0,0 +1,245 @@ +FROM debian:stretch + +ARG THREADS=1 +ARG ANDROID_NDK_REVISION=21d +ARG ANDROID_NDK_HASH=bcf4023eb8cb6976a4c7cff0a8a8f145f162bf4d +ARG ANDROID_SDK_REVISION=4333796 +ARG ANDROID_SDK_HASH=92ffee5a1d98d856634e8b71132e8a95d96c83a63fde1099be3d86df3106def9 +ARG QT_VERSION=5.15.2 + +WORKDIR /opt/android +ENV WORKDIR=/opt/android + +ENV ANDROID_NATIVE_API_LEVEL=28 +ENV ANDROID_API=android-${ANDROID_NATIVE_API_LEVEL} +ENV ANDROID_CLANG=aarch64-linux-android${ANDROID_NATIVE_API_LEVEL}-clang +ENV ANDROID_CLANGPP=aarch64-linux-android${ANDROID_NATIVE_API_LEVEL}-clang++ +ENV ANDROID_NDK_ROOT=${WORKDIR}/android-ndk-r${ANDROID_NDK_REVISION} +ENV ANDROID_SDK_ROOT=${WORKDIR}/tools +ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 +ENV PATH=${JAVA_HOME}/bin:${PATH} +ENV PREFIX=${WORKDIR}/prefix +ENV TOOLCHAIN_DIR=${ANDROID_NDK_ROOT}/toolchains/llvm/prebuilt/linux-x86_64 + +RUN apt-get update \ + && apt-get install -y ant automake build-essential ca-certificates-java file gettext git libc6 libncurses5 \ + libssl-dev libstdc++6 libtinfo5 libtool libz1 openjdk-8-jdk-headless openjdk-8-jre-headless pkg-config python3 \ + unzip wget + +RUN wget -q https://dl.google.com/android/repository/sdk-tools-linux-${ANDROID_SDK_REVISION}.zip \ + && unzip -q sdk-tools-linux-${ANDROID_SDK_REVISION}.zip \ + && rm -f sdk-tools-linux-${ANDROID_SDK_REVISION}.zip + +RUN wget -q https://dl.google.com/android/repository/android-ndk-r${ANDROID_NDK_REVISION}-linux-x86_64.zip \ + && unzip -q android-ndk-r${ANDROID_NDK_REVISION}-linux-x86_64.zip \ + && rm -f android-ndk-r${ANDROID_NDK_REVISION}-linux-x86_64.zip + +RUN cd ${ANDROID_SDK_ROOT} && echo y | ./bin/sdkmanager "platform-tools" "platforms;${ANDROID_API}" "tools" > /dev/null +RUN cp -r ${WORKDIR}/platforms ${WORKDIR}/platform-tools ${ANDROID_SDK_ROOT} + +ENV HOST_PATH=${PATH} +ENV PATH=${TOOLCHAIN_DIR}/aarch64-linux-android/bin:${TOOLCHAIN_DIR}/bin:${PATH} + +ARG ZLIB_VERSION=1.2.11 +ARG ZLIB_HASH=c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1 +RUN wget -q https://zlib.net/zlib-${ZLIB_VERSION}.tar.gz \ + && tar -xzf zlib-${ZLIB_VERSION}.tar.gz \ + && rm zlib-${ZLIB_VERSION}.tar.gz \ + && cd zlib-${ZLIB_VERSION} \ + && CC=${ANDROID_CLANG} CXX=${ANDROID_CLANGPP} ./configure --prefix=${PREFIX} --static \ + && make -j${THREADS} \ + && make -j${THREADS} install \ + && rm -rf $(pwd) + +RUN git clone git://code.qt.io/qt/qt5.git -b ${QT_VERSION} --depth 1 \ + && cd qt5 \ + && perl init-repository --module-subset=default,-qtwebengine \ + && PATH=${HOST_PATH} ./configure -v -developer-build -release \ + -xplatform android-clang \ + -android-ndk-platform ${ANDROID_API} \ + -android-ndk ${ANDROID_NDK_ROOT} \ + -android-sdk ${ANDROID_SDK_ROOT} \ + -android-ndk-host linux-x86_64 \ + -no-dbus \ + -opengl es2 \ + -no-use-gold-linker \ + -no-sql-mysql \ + -opensource -confirm-license \ + -android-arch arm64-v8a \ + -prefix ${PREFIX} \ + -nomake tools -nomake tests -nomake examples \ + -skip qtwebengine \ + -skip qtserialport \ + -skip qtconnectivity \ + -skip qttranslations \ + -skip qtpurchasing \ + -skip qtgamepad -skip qtscript -skip qtdoc \ + -no-warnings-are-errors \ + && sed -i '213,215d' qtbase/src/3rdparty/pcre2/src/sljit/sljitConfigInternal.h \ + && PATH=${HOST_PATH} make -j${THREADS} \ + && PATH=${HOST_PATH} make -j${THREADS} install \ + && cd qttools/src/linguist/lrelease \ + && ../../../../qtbase/bin/qmake \ + && PATH=${HOST_PATH} make -j${THREADS} install \ + && cd ../../../.. \ + && rm -rf $(pwd) + +ARG ICONV_VERSION=1.16 +ARG ICONV_HASH=e6a1b1b589654277ee790cce3734f07876ac4ccfaecbee8afa0b649cf529cc04 +RUN wget -q http://ftp.gnu.org/pub/gnu/libiconv/libiconv-${ICONV_VERSION}.tar.gz \ + && echo "${ICONV_HASH} libiconv-${ICONV_VERSION}.tar.gz" | sha256sum -c \ + && tar -xzf libiconv-${ICONV_VERSION}.tar.gz \ + && rm -f libiconv-${ICONV_VERSION}.tar.gz \ + && cd libiconv-${ICONV_VERSION} \ + && CC=${ANDROID_CLANG} CXX=${ANDROID_CLANGPP} ./configure --build=x86_64-linux-gnu --host=aarch64 --prefix=${PREFIX} --disable-rpath \ + && make -j${THREADS} \ + && make -j${THREADS} install + +ARG BOOST_VERSION=1_74_0 +ARG BOOST_VERSION_DOT=1.74.0 +ARG BOOST_HASH=83bfc1507731a0906e387fc28b7ef5417d591429e51e788417fe9ff025e116b1 +RUN wget -q https://dl.bintray.com/boostorg/release/${BOOST_VERSION_DOT}/source/boost_${BOOST_VERSION}.tar.bz2 \ + && echo "${BOOST_HASH} boost_${BOOST_VERSION}.tar.bz2" | sha256sum -c \ + && tar -xf boost_${BOOST_VERSION}.tar.bz2 \ + && rm -f boost_${BOOST_VERSION}.tar.bz2 \ + && cd boost_${BOOST_VERSION} \ + && PATH=${HOST_PATH} ./bootstrap.sh --prefix=${PREFIX} \ + && PATH=${TOOLCHAIN_DIR}/bin:${HOST_PATH} ./b2 --build-type=minimal link=static runtime-link=static \ + --with-chrono --with-date_time --with-filesystem --with-program_options --with-regex --with-serialization \ + --with-system --with-thread --with-locale --build-dir=android --stagedir=android toolset=clang threading=multi \ + threadapi=pthread target-os=android -sICONV_PATH=${PREFIX} \ + cflags='--target=aarch64-linux-android' \ + cxxflags='--target=aarch64-linux-android' \ + linkflags='--target=aarch64-linux-android --sysroot=${ANDROID_NDK_ROOT}/platforms/${ANDROID_API}/arch-arm64 ${ANDROID_NDK_ROOT}/sources/cxx-stl/llvm-libc++/libs/arm64-v8a/libc++_shared.so -nostdlib++' \ + install -j${THREADS} \ + && rm -rf $(pwd) + +ARG OPENSSL_VERSION=1.1.1g +ARG OPENSSL_HASH=ddb04774f1e32f0c49751e21b67216ac87852ceb056b75209af2443400636d46 +RUN wget -q https://www.openssl.org/source/openssl-${OPENSSL_VERSION}.tar.gz \ + && tar -xzf openssl-${OPENSSL_VERSION}.tar.gz \ + && rm openssl-${OPENSSL_VERSION}.tar.gz \ + && cd openssl-${OPENSSL_VERSION} \ + && ANDROID_NDK_HOME=${ANDROID_NDK_ROOT} ./Configure CC=${ANDROID_CLANG} CXX=${ANDROID_CLANGPP} \ + android-arm64 no-asm no-shared --static \ + --with-zlib-include=${PREFIX}/include --with-zlib-lib=${PREFIX}/lib \ + --prefix=${PREFIX} --openssldir=${PREFIX} \ + && sed -i 's/CNF_EX_LIBS=-ldl -pthread//g;s/BIN_CFLAGS=-pie $(CNF_CFLAGS) $(CFLAGS)//g' Makefile \ + && ANDROID_NDK_HOME=${ANDROID_NDK_ROOT} make -j${THREADS} \ + && make -j${THREADS} install \ + && rm -rf $(pwd) + +ARG ZMQ_VERSION=v4.3.3 +ARG ZMQ_HASH=04f5bbedee58c538934374dc45182d8fc5926fa3 +RUN git clone https://github.com/zeromq/libzmq.git -b ${ZMQ_VERSION} --depth 1 \ + && cd libzmq \ + && git checkout ${ZMQ_HASH} \ + && ./autogen.sh \ + && CC=${ANDROID_CLANG} CXX=${ANDROID_CLANGPP} ./configure --prefix=${PREFIX} --host=aarch64-linux-android \ + --enable-static --disable-shared \ + && make -j${THREADS} \ + && make -j${THREADS} install \ + && rm -rf $(pwd) + +ARG SODIUM_VERSION=1.0.18 +ARG SODIUM_HASH=4f5e89fa84ce1d178a6765b8b46f2b6f91216677 +RUN set -ex \ + && git clone https://github.com/jedisct1/libsodium.git -b ${SODIUM_VERSION} --depth 1 \ + && cd libsodium \ + && test `git rev-parse HEAD` = ${SODIUM_HASH} || exit 1 \ + && ./autogen.sh \ + && CC=${ANDROID_CLANG} CXX=${ANDROID_CLANGPP} ./configure --prefix=${PREFIX} --host=aarch64-linux-android --enable-static --disable-shared \ + && make -j${THREADS} install \ + && rm -rf $(pwd) + +RUN git clone -b libgpg-error-1.38 --depth 1 git://git.gnupg.org/libgpg-error.git \ + && cd libgpg-error \ + && git reset --hard 71d278824c5fe61865f7927a2ed1aa3115f9e439 \ + && ./autogen.sh \ + && CC=${ANDROID_CLANG} CXX=${ANDROID_CLANGPP} ./configure --host=aarch64-linux-android --prefix=${PREFIX} --disable-rpath --disable-shared --enable-static --disable-doc --disable-tests \ + && PATH=${TOOLCHAIN_DIR}/bin:${HOST_PATH} make -j${THREADS} \ + && make -j${THREADS} install \ + && rm -rf $(pwd) + +RUN git clone -b libgcrypt-1.8.5 --depth 1 git://git.gnupg.org/libgcrypt.git \ + && cd libgcrypt \ + && git reset --hard 56606331bc2a80536db9fc11ad53695126007298 \ + && ./autogen.sh \ + && CC=${ANDROID_CLANG} CXX=${ANDROID_CLANGPP} ./configure --host=aarch64-linux-android --prefix=${PREFIX} --with-gpg-error-prefix=${PREFIX} --disable-shared --enable-static --disable-doc --disable-tests \ + && PATH=${TOOLCHAIN_DIR}/bin:${HOST_PATH} make -j${THREADS} \ + && make -j${THREADS} install \ + && rm -rf $(pwd) + +RUN cd tools \ + && wget -q http://dl-ssl.google.com/android/repository/tools_r25.2.5-linux.zip \ + && unzip -q tools_r25.2.5-linux.zip \ + && rm -f tools_r25.2.5-linux.zip \ + && echo y | ${ANDROID_SDK_ROOT}/tools/android update sdk --no-ui --all --filter build-tools-28.0.3 + +RUN git clone -b v3.19.7 --depth 1 https://github.com/Kitware/CMake \ + && cd CMake \ + && git reset --hard 22612dd53a46c7f9b4c3f4b7dbe5c78f9afd9581 \ + && PATH=${HOST_PATH} ./bootstrap \ + && PATH=${HOST_PATH} make -j${THREADS} \ + && PATH=${HOST_PATH} make -j${THREADS} install \ + && rm -rf $(pwd) + +RUN git clone -b v1.6.35 --depth 1 https://github.com/glennrp/libpng.git && \ + cd libpng && \ + git reset --hard c17d164b4467f099b4484dfd4a279da0bc1dbd4a \ + && CC=${ANDROID_CLANG} CXX=${ANDROID_CLANGPP} ./configure --with-zlib-prefix="${PREFIX}" --host=aarch64-linux-android --prefix=${PREFIX} --disable-shared --enable-static \ + && PATH=${TOOLCHAIN_DIR}/bin:${HOST_PATH} make -j${THREADS} \ + && make -j${THREADS} install \ + && rm -rf $(pwd) + +# @TODO: don't hardcode ANDROID_PLATFORM +RUN git clone -b v4.0.2 --depth 1 https://github.com/fukuchi/libqrencode.git && \ + cd libqrencode && \ + git reset --hard 59ee597f913fcfda7a010a6e106fbee2595f68e4 && \ + CC=${ANDROID_CLANG} CXX=${ANDROID_CLANGPP} cmake \ + -DCMAKE_TOOLCHAIN_FILE="${ANDROID_NDK_ROOT}/build/cmake/android.toolchain.cmake" \ + -DANDROID_PLATFORM="28" \ + -DBUILD_SHARED_LIBS=OFF \ + -DARCH="armv8-a" \ + -DANDROID_ABI="arm64-v8a" \ + -DANDROID_TOOLCHAIN=clang \ + -DCMAKE_PREFIX_PATH="${PREFIX}" \ + -DPNG_PNG_INCLUDE_DIR="${PREFIX}/include/libpng16/" \ + -DPNG_LIBRARY="${PREFIX}/lib/libqtlibpng_arm64-v8a.a" \ + -DICONV_LIBRARY=/opt/android/prefix/lib/libiconv.a \ + -DICONV_INCLUDE_DIR=/opt/android/prefix/include/ \ + -DCMAKE_INSTALL_PREFIX="${PREFIX}" && \ + make -j$THREADS && \ + make -j$THREADS install && \ + rm -rf $(pwd) + +RUN ls -al && uname -a + +# @TODO: switch to Release +CMD set -ex \ + && cd /wowlet \ + && mkdir -p build/Android/release \ + && cd build/Android/release \ + && E=1 cmake \ + -DCMAKE_TOOLCHAIN_FILE="${ANDROID_NDK_ROOT}/build/cmake/android.toolchain.cmake" \ + -DCMAKE_PREFIX_PATH="${PREFIX}" \ + -DCMAKE_FIND_ROOT_PATH="${PREFIX}" \ + -DCMAKE_BUILD_TYPE=Release \ + -DARCH="armv8-a" \ + -DANDROID_NATIVE_API_LEVEL=${ANDROID_NATIVE_API_LEVEL} \ + -DANDROID_ABI="arm64-v8a" \ + -DANDROID_TOOLCHAIN=clang \ + -DBoost_USE_STATIC_RUNTIME=ON \ + -DLRELEASE_PATH="${PREFIX}/bin" \ + -DQT_ANDROID_APPLICATION_BINARY="wowlet" \ + -DWITH_SCANNER=ON \ + -DUSE_DEVICE_TREZOR=OFF \ + -DUSE_SINGLE_BUILDDIR=ON \ + -DMANUAL_SUBMODULES=1 \ + -DUSE_SINGLE_BUILDDIR=ON \ + -DQML=ON \ + -DANDROID=ON \ + ../../.. \ + && PATH=${HOST_PATH} make generate_translations_header \ + && make -j${THREADS} -C src \ + && make -j${THREADS} apk