From c85c4fb6c190c722734c6745b9f91829b3ba29b1 Mon Sep 17 00:00:00 2001 From: R4SAS Date: Thu, 27 Jan 2022 17:39:30 +0300 Subject: [PATCH] [jni] switch to build from sources (#32) --- .github/workflows/android.yml | 17 ++++- .gitmodules | 21 +++--- app/build.gradle | 4 +- app/jni/Android.mk | 28 ++++---- app/jni/Application.mk | 4 +- app/jni/boost | 2 +- app/jni/build_boost.sh | 128 ++++++++++++++++++++++++++++++++++ app/jni/build_miniupnpc.sh | 89 +++++++++++++++++++++++ app/jni/build_openssl.sh | 95 +++++++++++++++++++++++++ app/jni/miniupnp | 2 +- app/jni/openssl | 2 +- 11 files changed, 358 insertions(+), 34 deletions(-) create mode 100755 app/jni/build_boost.sh create mode 100755 app/jni/build_miniupnpc.sh create mode 100755 app/jni/build_openssl.sh diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml index 8860dc6..982ef92 100644 --- a/.github/workflows/android.yml +++ b/.github/workflows/android.yml @@ -9,6 +9,10 @@ jobs: - uses: actions/checkout@v2 with: submodules: 'recursive' + - name: Install rename tool + run: | + sudo apt-get update + sudo apt-get install rename - name: Setup JDK 1.8 uses: actions/setup-java@v1 with: @@ -17,10 +21,19 @@ jobs: uses: maxim-lobanov/setup-android-tools@v1 with: packages: | - build-tools;28.0.3 + build-tools;29.0.3 platforms;android-29 - ndk;20.0.5594570 + ndk;21.4.7075529 cache: true + - name: Build required modules + run: | + export ANDROID_SDK_ROOT=$ANDROID_HOME + export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/21.4.7075529 + pushd app/jni + ./build_boost.sh + ./build_openssl.sh + ./build_miniupnpc.sh + popd - name: Build with Gradle run: ./gradlew --no-daemon assembleDebug - name: Upload artifacts diff --git a/.gitmodules b/.gitmodules index f543b2e..919c43c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,17 +1,16 @@ +[submodule "android-ifaddrs"] + path = app/jni/android-ifaddrs + url = https://github.com/PurpleI2P/android-ifaddrs.git [submodule "i2pd"] path = app/jni/i2pd url = https://github.com/PurpleI2P/i2pd.git branch = openssl -[submodule "boost"] - path = app/jni/boost - url = https://github.com/PurpleI2P/Boost-for-Android-Prebuilt.git - branch = boost-1_72_0 -[submodule "openssl"] - path = app/jni/openssl - url = https://github.com/PurpleI2P/OpenSSL-for-Android-Prebuilt.git [submodule "miniupnp"] path = app/jni/miniupnp - url = https://github.com/PurpleI2P/MiniUPnP-for-Android-Prebuilt.git -[submodule "android-ifaddrs"] - path = app/jni/android-ifaddrs - url = https://github.com/PurpleI2P/android-ifaddrs.git + url = https://github.com/miniupnp/miniupnp.git +[submodule "openssl"] + path = app/jni/openssl + url = https://github.com/openssl/openssl.git +[submodule "boost"] + path = app/jni/boost + url = https://github.com/moritz-wundke/Boost-for-Android.git diff --git a/app/build.gradle b/app/build.gradle index 83973f0..92c4f55 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,7 +13,7 @@ android { defaultConfig { applicationId "org.purplei2p.i2pd" targetSdkVersion 29 - minSdkVersion 14 + minSdkVersion 16 versionCode 24000 versionName "2.40.0" setProperty("archivesBaseName", archivesBaseName + "-" + versionName) @@ -28,7 +28,7 @@ android { externalNativeBuild { ndkBuild { arguments "NDK_MODULE_PATH:=${rootProject.projectDir}/app/jni" - arguments "-j3" + arguments "-j${Runtime.getRuntime().availableProcessors()}" } } } diff --git a/app/jni/Android.mk b/app/jni/Android.mk index 19a54c4..777258c 100644 --- a/app/jni/Android.mk +++ b/app/jni/Android.mk @@ -30,49 +30,49 @@ include $(BUILD_SHARED_LIBRARY) LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := boost_system -LOCAL_SRC_FILES := $(BOOST_PATH)/boost-1_72_0/$(TARGET_ARCH_ABI)/lib/libboost_system.a -LOCAL_EXPORT_C_INCLUDES := $(BOOST_PATH)/boost-1_72_0/include +LOCAL_SRC_FILES := $(BOOST_PATH)/out/$(TARGET_ARCH_ABI)/libboost_system.a +LOCAL_EXPORT_C_INCLUDES := $(BOOST_PATH)/out/include include $(PREBUILT_STATIC_LIBRARY) LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := boost_date_time -LOCAL_SRC_FILES := $(BOOST_PATH)/boost-1_72_0/$(TARGET_ARCH_ABI)/lib/libboost_date_time.a -LOCAL_EXPORT_C_INCLUDES := $(BOOST_PATH)/boost-1_72_0/include +LOCAL_SRC_FILES := $(BOOST_PATH)/out/$(TARGET_ARCH_ABI)/libboost_date_time.a +LOCAL_EXPORT_C_INCLUDES := $(BOOST_PATH)/out/include include $(PREBUILT_STATIC_LIBRARY) LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := boost_filesystem -LOCAL_SRC_FILES := $(BOOST_PATH)/boost-1_72_0/$(TARGET_ARCH_ABI)/lib/libboost_filesystem.a -LOCAL_EXPORT_C_INCLUDES := $(BOOST_PATH)/boost-1_72_0/include +LOCAL_SRC_FILES := $(BOOST_PATH)/out/$(TARGET_ARCH_ABI)/libboost_filesystem.a +LOCAL_EXPORT_C_INCLUDES := $(BOOST_PATH)/out/include include $(PREBUILT_STATIC_LIBRARY) LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := boost_program_options -LOCAL_SRC_FILES := $(BOOST_PATH)/boost-1_72_0/$(TARGET_ARCH_ABI)/lib/libboost_program_options.a -LOCAL_EXPORT_C_INCLUDES := $(BOOST_PATH)/boost-1_72_0/include +LOCAL_SRC_FILES := $(BOOST_PATH)/out/$(TARGET_ARCH_ABI)/libboost_program_options.a +LOCAL_EXPORT_C_INCLUDES := $(BOOST_PATH)/out/include include $(PREBUILT_STATIC_LIBRARY) LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := crypto -LOCAL_SRC_FILES := $(OPENSSL_PATH)/openssl-1.1.1k-clang/$(TARGET_ARCH_ABI)/lib/libcrypto.a -LOCAL_EXPORT_C_INCLUDES := $(OPENSSL_PATH)/openssl-1.1.1k-clang/include +LOCAL_SRC_FILES := $(OPENSSL_PATH)/out/$(TARGET_ARCH_ABI)/libcrypto.a +LOCAL_EXPORT_C_INCLUDES := $(OPENSSL_PATH)/out/include include $(PREBUILT_STATIC_LIBRARY) LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := ssl -LOCAL_SRC_FILES := $(OPENSSL_PATH)/openssl-1.1.1k-clang/$(TARGET_ARCH_ABI)/lib/libssl.a -LOCAL_EXPORT_C_INCLUDES := $(OPENSSL_PATH)/openssl-1.1.1k-clang/include +LOCAL_SRC_FILES := $(OPENSSL_PATH)/out/$(TARGET_ARCH_ABI)/libssl.a +LOCAL_EXPORT_C_INCLUDES := $(OPENSSL_PATH)/out/include LOCAL_STATIC_LIBRARIES := crypto include $(PREBUILT_STATIC_LIBRARY) LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := miniupnpc -LOCAL_SRC_FILES := $(MINIUPNP_PATH)/miniupnpc-2.1/$(TARGET_ARCH_ABI)/lib/libminiupnpc.a -LOCAL_EXPORT_C_INCLUDES := $(MINIUPNP_PATH)/miniupnpc-2.1/include +LOCAL_SRC_FILES := $(MINIUPNP_PATH)/miniupnpc/out/$(TARGET_ARCH_ABI)/libminiupnpc.a +LOCAL_EXPORT_C_INCLUDES := $(MINIUPNP_PATH)/miniupnpc/out/include include $(PREBUILT_STATIC_LIBRARY) diff --git a/app/jni/Application.mk b/app/jni/Application.mk index 7627e3a..f34595f 100644 --- a/app/jni/Application.mk +++ b/app/jni/Application.mk @@ -9,10 +9,10 @@ ifeq ($(TARGET_ARCH_ABI),armeabi-v7a) APP_CPPFLAGS += -DANDROID_ARM7A endif +IFADDRS_PATH = $(NDK_MODULE_PATH)/android-ifaddrs BOOST_PATH = $(NDK_MODULE_PATH)/boost -OPENSSL_PATH = $(NDK_MODULE_PATH)/openssl MINIUPNP_PATH = $(NDK_MODULE_PATH)/miniupnp -IFADDRS_PATH = $(NDK_MODULE_PATH)/android-ifaddrs +OPENSSL_PATH = $(NDK_MODULE_PATH)/openssl # don't change me I2PD_SRC_PATH = $(NDK_MODULE_PATH)/i2pd diff --git a/app/jni/boost b/app/jni/boost index 93de572..ccfc74f 160000 --- a/app/jni/boost +++ b/app/jni/boost @@ -1 +1 @@ -Subproject commit 93de5720b8841569f25abe9fe498348582e002c4 +Subproject commit ccfc74f1c9ceb35d304294d4f1ed3abff43d2e01 diff --git a/app/jni/build_boost.sh b/app/jni/build_boost.sh new file mode 100755 index 0000000..bdd43af --- /dev/null +++ b/app/jni/build_boost.sh @@ -0,0 +1,128 @@ +#!/bin/bash + +set -e + +BOOST_VERSION=1.74.0 +BOOST_VERSION_SUFFIX=1_74 +BOOST_LIBS=date_time,filesystem,program_options,system + +REMOVE_BOOST_LIBS_SUFFIX_x86_64=-clang-mt-x64-${BOOST_VERSION_SUFFIX} +REMOVE_BOOST_LIBS_SUFFIX_ARM64=-clang-mt-a64-${BOOST_VERSION_SUFFIX} +REMOVE_BOOST_LIBS_SUFFIX_x86=-clang-mt-x32-${BOOST_VERSION_SUFFIX} +REMOVE_BOOST_LIBS_SUFFIX_ARM=-clang-mt-a32-${BOOST_VERSION_SUFFIX} + +function build_one { + echo "Configuring and building..." + CXXFLAGS="-std=c++14" \ + NCPU=$(nproc) \ + ./build-android.sh \ + --boost=${BOOST_VERSION} \ + --arch=${CPU} \ + --target-version=${API} \ + --with-libraries=${BOOST_LIBS} \ + ${ANDROID_NDK_HOME} + + case "${CPU}" in + x86_64) + mkdir -p out/{x86_64,include} + cp build/out/x86_64/lib/*.a out/${CPU} + rename 's/'${REMOVE_BOOST_LIBS_SUFFIX_x86_64}'//' out/x86_64/*.a + cp -r build/out/x86_64/include/boost-${BOOST_VERSION_SUFFIX}/boost out/include + + ;; + arm64-v8a) + mkdir -p out/{arm64-v8a,include} + cp build/out/arm64-v8a/lib/*.a out/${CPU} + rename 's/'${REMOVE_BOOST_LIBS_SUFFIX_ARM64}'//' out/arm64-v8a/*.a + cp -r build/out/arm64-v8a/include/boost-${BOOST_VERSION_SUFFIX}/boost out/include + ;; + x86) + mkdir -p out/{x86,include} + cp build/out/x86/lib/*.a out/${CPU} + rename 's/'${REMOVE_BOOST_LIBS_SUFFIX_x86}'//' out/x86/*.a + cp -r build/out/x86/include/boost-${BOOST_VERSION_SUFFIX}/boost out/include + ;; + armeabi-v7a) + mkdir -p out/{armeabi-v7a,include} + cp build/out/armeabi-v7a/lib/*.a out/${CPU} + rename 's/'${REMOVE_BOOST_LIBS_SUFFIX_ARM}'//' out/armeabi-v7a/*.a + cp -r build/out/armeabi-v7a/include/boost-${BOOST_VERSION_SUFFIX}/boost out/include + ;; + *) + mkdir -p out/{x86_64,arm64-v8a,x86,armeabi-v7a,include} + + cp build/out/x86_64/lib/*.a out/x86_64 + rename 's/'${REMOVE_BOOST_LIBS_SUFFIX_x86_64}'//' out/x86_64/*.a + + cp build/out/arm64-v8a/lib/*.a out/arm64-v8a + rename 's/'${REMOVE_BOOST_LIBS_SUFFIX_ARM64}'//' out/arm64-v8a/*.a + + cp build/out/x86/lib/*.a out/x86 + rename 's/'${REMOVE_BOOST_LIBS_SUFFIX_x86}'//' out/x86/*.a + + cp build/out/armeabi-v7a/lib/*.a out/armeabi-v7a + rename 's/'${REMOVE_BOOST_LIBS_SUFFIX_ARM}'//' out/armeabi-v7a/*.a + + cp -r build/out/arm64-v8a/include/boost-${BOOST_VERSION_SUFFIX}/boost out/include + ;; + esac +} + +function checkPreRequisites { + + if ! [ -d "boost" ] || ! [ "$(ls -A boost)" ]; then + echo -e "\033[31mFailed! Submodule 'boost' not found!\033[0m" + echo -e "\033[31mTry to run: 'git submodule update --init'\033[0m" + exit + fi + + if [ -z "$ANDROID_NDK_HOME" -a "$ANDROID_NDK_HOME" == "" ]; then + echo -e "\033[31mFailed! ANDROID_NDK_HOME is empty. Run 'export ANDROID_NDK_HOME=[PATH_TO_NDK]'\033[0m" + exit + fi +} + +checkPreRequisites + +cd boost +rm -rf out + +function build { + for arg in "$@"; do + case "${arg}" in + x86_64) + API=21 + TARGET=x86_64 + build_one + ;; + arm64) + API=21 + CPU=arm64-v8a + build_one + ;; + x86) + API=16 + CPU=x86 + build_one + ;; + arm) + API=16 + CPU=armeabi-v7a + build_one + ;; + all) + API=16 + CPU=x86_64,arm64-v8a,x86,armeabi-v7a + build_one + ;; + *) + ;; + esac + done +} + +if (( $# == 0 )); then + build all +else + build $@ +fi diff --git a/app/jni/build_miniupnpc.sh b/app/jni/build_miniupnpc.sh new file mode 100755 index 0000000..fa19c32 --- /dev/null +++ b/app/jni/build_miniupnpc.sh @@ -0,0 +1,89 @@ +#!/bin/bash + +set -e + + +function build_one { + mkdir -p out/${CPU} + cd out/${CPU} + + cmake \ + -DANDROID_NATIVE_API_LEVEL=${API} \ + -DANDROID_ABI=${CPU} \ + -DCMAKE_BUILD_TYPE=Release \ + -DANDROID_NDK=${ANDROID_NDK_HOME} \ + -DCMAKE_TOOLCHAIN_FILE=${ANDROID_NDK_HOME}/build/cmake/android.toolchain.cmake \ + ../.. + + echo "Building..." + cmake --build . -- libminiupnpc-static + + cd ../.. + + if [[ -n 'out/include' ]]; then + mkdir -p out/include/miniupnpc + cp include/* out/include/miniupnpc + fi +} + +function checkPreRequisites { + + if ! [ -d "miniupnp" ] || ! [ "$(ls -A miniupnp)" ]; then + echo -e "\033[31mFailed! Submodule 'miniupnp' not found!\033[0m" + echo -e "\033[31mTry to run: 'git submodule update --init'\033[0m" + exit + fi + + if [ -z "$ANDROID_SDK_ROOT" -a "$ANDROID_SDK_ROOT" == "" ]; then + echo -e "\033[31mFailed! ANDROID_SDK_ROOT is empty. Run 'export ANDROID_SDK_ROOT=[PATH_TO_NDK]'\033[0m" + exit + fi + + if [ -z "$ANDROID_NDK_HOME" -a "$ANDROID_NDK_HOME" == "" ]; then + echo -e "\033[31mFailed! ANDROID_NDK_HOME is empty. Run 'export ANDROID_NDK_HOME=[PATH_TO_NDK]'\033[0m" + exit + fi +} + +checkPreRequisites + +cd miniupnp/miniupnpc +rm -rf out + +# add cmake from Android SDK to PATH +PATH=$ANDROID_SDK_ROOT/cmake/3.10.2.4988404/bin:$PATH + +function build { + for arg in "$@"; do + case "${arg}" in + x86_64) + API=21 + CPU=x86_64 + build_one + ;; + arm64) + API=21 + CPU=arm64-v8a + build_one + ;; + arm) + API=16 + CPU=armeabi-v7a + build_one + ;; + x86) + API=16 + CPU=x86 + build_one + ;; + *) + ;; + esac + done +} + +if (( $# == 0 )); then + build x86_64 arm64 arm x86 +else + build $@ +fi diff --git a/app/jni/build_openssl.sh b/app/jni/build_openssl.sh new file mode 100755 index 0000000..8ba0092 --- /dev/null +++ b/app/jni/build_openssl.sh @@ -0,0 +1,95 @@ +#!/bin/bash + +set -e + + +function build_one { + mkdir -p out/${CPU} + + echo "Configuring..." + ./Configure \ + ${TARGET} \ + no-shared \ + no-ssl3 \ + no-comp \ + no-hw \ + no-engine \ + no-tests \ + --prefix="$PWD/output" \ + -D__ANDROID_API__=${API} + + echo "Building..." + make -j $(nproc) + + make install_sw + + cp output/lib/*.a out/${CPU} + + if [[ -n 'out/include' ]]; then + mkdir -p out/include + cp -r output/include/openssl out/include + fi + + rm -rf output + make clean +} + +function checkPreRequisites { + + if ! [ -d "openssl" ] || ! [ "$(ls -A openssl)" ]; then + echo -e "\033[31mFailed! Submodule 'openssl' not found!\033[0m" + echo -e "\033[31mTry to run: 'git submodule update --init'\033[0m" + exit + fi + + if [ -z "$ANDROID_NDK_HOME" -a "$ANDROID_NDK_HOME" == "" ]; then + echo -e "\033[31mFailed! ANDROID_NDK_HOME is empty. Run 'export ANDROID_NDK_HOME=[PATH_TO_NDK]'\033[0m" + exit + fi +} + +checkPreRequisites + +cd openssl +rm -rf out + +PATH=$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH + +function build { + for arg in "$@"; do + case "${arg}" in + x86_64) + API=21 + CPU=x86_64 + TARGET=android-x86_64 + build_one + ;; + arm64) + API=21 + CPU=arm64-v8a + TARGET=android-arm64 + build_one + ;; + arm) + API=16 + CPU=armeabi-v7a + TARGET=android-arm + build_one + ;; + x86) + API=16 + CPU=x86 + TARGET=android-x86 + build_one + ;; + *) + ;; + esac + done +} + +if (( $# == 0 )); then + build x86_64 arm64 arm x86 +else + build $@ +fi diff --git a/app/jni/miniupnp b/app/jni/miniupnp index dd9bad8..6576eb6 160000 --- a/app/jni/miniupnp +++ b/app/jni/miniupnp @@ -1 +1 @@ -Subproject commit dd9bad896ba8ff49c3399e5c1624643a0b667e50 +Subproject commit 6576eb611b670c4841cc65095914275d6be008b2 diff --git a/app/jni/openssl b/app/jni/openssl index 794e05f..ac3cef2 160000 --- a/app/jni/openssl +++ b/app/jni/openssl @@ -1 +1 @@ -Subproject commit 794e05ffb80651e7f60ee179792c93470edf8934 +Subproject commit ac3cef223a4c61d6bee34527b6d4c8c6432494a7