diff --git a/.github/workflows/publish-android.yaml b/.github/workflows/publish-android.yaml index 2d7ba16d..c4467883 100644 --- a/.github/workflows/publish-android.yaml +++ b/.github/workflows/publish-android.yaml @@ -25,16 +25,10 @@ jobs: distribution: temurin java-version: 17 - - name: "Set default Rust version to 1.77.1" - run: rustup default 1.77.1 - - - name: "Install Rust Android targets" - run: rustup target add x86_64-linux-android aarch64-linux-android armv7-linux-androideabi - - name: "Build bdk-android library" run: | cd bdk-android - ./gradlew buildAndroidLib + bash ./scripts/build-linux-x86_64.sh - name: "Publish to Maven Central" env: diff --git a/.github/workflows/test-android.yaml b/.github/workflows/test-android.yaml index 9101a9da..2403c8de 100644 --- a/.github/workflows/test-android.yaml +++ b/.github/workflows/test-android.yaml @@ -37,16 +37,10 @@ jobs: distribution: temurin java-version: 17 - - name: "Set default Rust version to 1.77.1" - run: rustup default 1.77.1 - - - name: "Install Rust Android targets" - run: rustup target add x86_64-linux-android aarch64-linux-android armv7-linux-androideabi - - name: "Build Android library" run: | cd bdk-android - ./gradlew buildAndroidLib --console=plain + bash ./scripts/build-linux-x86_64.sh # There are currently no unit tests for bdk-android (see the tests in bdk-jvm instead) and the # integration tests require the macOS image which is not working with the older NDK version we diff --git a/bdk-android/build.gradle.kts b/bdk-android/build.gradle.kts index f2b1b52f..00c0beaa 100644 --- a/bdk-android/build.gradle.kts +++ b/bdk-android/build.gradle.kts @@ -3,7 +3,6 @@ plugins { id("org.jetbrains.kotlin.android").version("1.9.23").apply(false) id("org.gradle.maven-publish") id("org.gradle.signing") - id("org.bitcoindevkit.plugins.generate-android-bindings").apply(false) id("io.github.gradle-nexus.publish-plugin").version("1.1.0").apply(true) } diff --git a/bdk-android/justfile b/bdk-android/justfile index b5522ff0..489fa2e5 100644 --- a/bdk-android/justfile +++ b/bdk-android/justfile @@ -1,8 +1,11 @@ default: just --list -build: - ./gradlew buildAndroidLib +build-linux: + bash ./scripts/build-linux-x86_64.sh + +build-macos: + bash ./scripts/build-macos-aarch64.sh clean: rm -rf ../bdk-ffi/target/ diff --git a/bdk-android/lib/build.gradle.kts b/bdk-android/lib/build.gradle.kts index 96d960ae..4e240092 100644 --- a/bdk-android/lib/build.gradle.kts +++ b/bdk-android/lib/build.gradle.kts @@ -8,9 +8,6 @@ plugins { id("org.jetbrains.kotlin.android") id("org.gradle.maven-publish") id("org.gradle.signing") - - // Custom plugin to generate the native libs and bindings file - id("org.bitcoindevkit.plugins.generate-android-bindings") } android { @@ -19,7 +16,6 @@ android { defaultConfig { minSdk = 24 - targetSdk = 34 testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles("consumer-rules.pro") } @@ -106,15 +102,6 @@ afterEvaluate { } } } - - // This is required because we must ensure the moveNativeAndroidLibs task is executed after - // the mergeReleaseJniLibFolders (hard requirement introduced by our upgrade to Gradle 8.7) - tasks.named("mergeReleaseJniLibFolders") { - dependsOn(":lib:moveNativeAndroidLibs") - } - tasks.named("mergeDebugJniLibFolders") { - dependsOn(":lib:moveNativeAndroidLibs") - } } signing { @@ -128,8 +115,3 @@ signing { useInMemoryPgpKeys(signingKeyId, signingKey, signingPassword) sign(publishing.publications) } - -// This task dependency ensures that we build the bindings binaries before running the tests -tasks.withType { - dependsOn("buildAndroidLib") -} diff --git a/bdk-android/scripts/build-linux-x86_64.sh b/bdk-android/scripts/build-linux-x86_64.sh new file mode 100644 index 00000000..d524e026 --- /dev/null +++ b/bdk-android/scripts/build-linux-x86_64.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +if [ -z "$ANDROID_NDK_ROOT" ]; then + echo "Error: ANDROID_NDK_ROOT is not defined in your environment" + exit 1 +fi + +PATH="$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/linux-x86_64/bin:$PATH" +CFLAGS="-D__ANDROID_MIN_SDK_VERSION__=24" +AR="llvm-ar" +LIB_NAME="libbdkffi.so" +COMPILATION_TARGET_ARM64_V8A="aarch64-linux-android" +COMPILATION_TARGET_X86_64="x86_64-linux-android" +COMPILATION_TARGET_ARMEABI_V7A="armv7-linux-androideabi" +RESOURCE_DIR_ARM64_V8A="arm64-v8a" +RESOURCE_DIR_X86_64="x86_64" +RESOURCE_DIR_ARMEABI_V7A="armeabi-v7a" + +# Move to the Rust library directory +cd ../bdk-ffi/ || exit +rustup default 1.77.1 +rustup target add $COMPILATION_TARGET_ARM64_V8A $COMPILATION_TARGET_ARMEABI_V7A $COMPILATION_TARGET_X86_64 + +# Build the binaries +# The CC and CARGO_TARGET__LINUX_ANDROID_LINKER environment variables must be declared on the same line as the cargo build command +CC="aarch64-linux-android24-clang" CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER="aarch64-linux-android24-clang" cargo build --profile release-smaller --target $COMPILATION_TARGET_ARM64_V8A +CC="x86_64-linux-android24-clang" CARGO_TARGET_X86_64_LINUX_ANDROID_LINKER="x86_64-linux-android24-clang" cargo build --profile release-smaller --target $COMPILATION_TARGET_X86_64 +CC="armv7a-linux-androideabi24-clang" CARGO_TARGET_ARMV7_LINUX_ANDROIDEABI_LINKER="armv7a-linux-androideabi24-clang" cargo build --profile release-smaller --target $COMPILATION_TARGET_ARMEABI_V7A + +# Copy the binaries to their respective resource directories +mkdir -p ../bdk-android/lib/src/main/jniLibs/$RESOURCE_DIR_ARM64_V8A/ +mkdir -p ../bdk-android/lib/src/main/jniLibs/$RESOURCE_DIR_ARMEABI_V7A/ +mkdir -p ../bdk-android/lib/src/main/jniLibs/$RESOURCE_DIR_X86_64/ +cp ./target/$COMPILATION_TARGET_ARM64_V8A/release-smaller/$LIB_NAME ../bdk-android/lib/src/main/jniLibs/$RESOURCE_DIR_ARM64_V8A/ +cp ./target/$COMPILATION_TARGET_ARMEABI_V7A/release-smaller/$LIB_NAME ../bdk-android/lib/src/main/jniLibs/$RESOURCE_DIR_ARMEABI_V7A/ +cp ./target/$COMPILATION_TARGET_X86_64/release-smaller/$LIB_NAME ../bdk-android/lib/src/main/jniLibs/$RESOURCE_DIR_X86_64/ + +# Generate Kotlin bindings using uniffi-bindgen +cargo run --bin uniffi-bindgen generate --library ./target/$COMPILATION_TARGET_ARM64_V8A/release-smaller/$LIB_NAME --language kotlin --out-dir ../bdk-android/lib/src/main/kotlin/ --no-format diff --git a/bdk-android/scripts/build-macos-aarch64.sh b/bdk-android/scripts/build-macos-aarch64.sh new file mode 100644 index 00000000..516bda6b --- /dev/null +++ b/bdk-android/scripts/build-macos-aarch64.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +if [ -z "$ANDROID_NDK_ROOT" ]; then + echo "Error: ANDROID_NDK_ROOT is not defined in your environment" + exit 1 +fi + +PATH="$ANDROID_NDK_ROOT/toolchains/llvm/prebuilt/darwin-x86_64/bin:$PATH" +CFLAGS="-D__ANDROID_MIN_SDK_VERSION__=24" +AR="llvm-ar" +LIB_NAME="libbdkffi.so" +COMPILATION_TARGET_ARM64_V8A="aarch64-linux-android" +COMPILATION_TARGET_X86_64="x86_64-linux-android" +COMPILATION_TARGET_ARMEABI_V7A="armv7-linux-androideabi" +RESOURCE_DIR_ARM64_V8A="arm64-v8a" +RESOURCE_DIR_X86_64="x86_64" +RESOURCE_DIR_ARMEABI_V7A="armeabi-v7a" + +# Move to the Rust library directory +cd ../bdk-ffi/ || exit +rustup default 1.77.1 +rustup target add $COMPILATION_TARGET_ARM64_V8A $COMPILATION_TARGET_ARMEABI_V7A $COMPILATION_TARGET_X86_64 + +# Build the binaries +# The CC and CARGO_TARGET__LINUX_ANDROID_LINKER environment variables must be declared on the same line as the cargo build command +CC="aarch64-linux-android24-clang" CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER="aarch64-linux-android24-clang" cargo build --profile release-smaller --target $COMPILATION_TARGET_ARM64_V8A +CC="x86_64-linux-android24-clang" CARGO_TARGET_X86_64_LINUX_ANDROID_LINKER="x86_64-linux-android24-clang" cargo build --profile release-smaller --target $COMPILATION_TARGET_X86_64 +CC="armv7a-linux-androideabi24-clang" CARGO_TARGET_ARMV7_LINUX_ANDROIDEABI_LINKER="armv7a-linux-androideabi24-clang" cargo build --profile release-smaller --target $COMPILATION_TARGET_ARMEABI_V7A + +# Copy the binaries to their respective resource directories +mkdir -p ../bdk-android/lib/src/main/jniLibs/$RESOURCE_DIR_ARM64_V8A/ +mkdir -p ../bdk-android/lib/src/main/jniLibs/$RESOURCE_DIR_ARMEABI_V7A/ +mkdir -p ../bdk-android/lib/src/main/jniLibs/$RESOURCE_DIR_X86_64/ +cp ./target/$COMPILATION_TARGET_ARM64_V8A/release-smaller/$LIB_NAME ../bdk-android/lib/src/main/jniLibs/$RESOURCE_DIR_ARM64_V8A/ +cp ./target/$COMPILATION_TARGET_ARMEABI_V7A/release-smaller/$LIB_NAME ../bdk-android/lib/src/main/jniLibs/$RESOURCE_DIR_ARMEABI_V7A/ +cp ./target/$COMPILATION_TARGET_X86_64/release-smaller/$LIB_NAME ../bdk-android/lib/src/main/jniLibs/$RESOURCE_DIR_X86_64/ + +# Generate Kotlin bindings using uniffi-bindgen +cargo run --bin uniffi-bindgen generate --library ./target/$COMPILATION_TARGET_ARM64_V8A/release-smaller/$LIB_NAME --language kotlin --out-dir ../bdk-android/lib/src/main/kotlin/ --no-format diff --git a/bdk-android/settings.gradle.kts b/bdk-android/settings.gradle.kts index cf43879b..3ddd6f3d 100644 --- a/bdk-android/settings.gradle.kts +++ b/bdk-android/settings.gradle.kts @@ -1,7 +1,6 @@ rootProject.name = "bdk-android" include(":lib") -includeBuild("plugins") pluginManagement { repositories {