From 24e14565b34b82ac0b1ec74d24c7cbeed13b50cc Mon Sep 17 00:00:00 2001 From: Hammed Abass Date: Wed, 15 Jul 2026 01:35:10 +0200 Subject: [PATCH] fix(android): package native core for x86_64 --- .github/workflows/shared-kmp.yml | 5 ++- androidApp/build.gradle.kts | 58 ++++++++++++++++++++++++++++++-- shared/build.gradle.kts | 2 +- 3 files changed, 61 insertions(+), 4 deletions(-) diff --git a/.github/workflows/shared-kmp.yml b/.github/workflows/shared-kmp.yml index b057b98..de5d103 100644 --- a/.github/workflows/shared-kmp.yml +++ b/.github/workflows/shared-kmp.yml @@ -63,7 +63,7 @@ jobs: - name: Install Rust toolchain uses: dtolnay/rust-toolchain@stable with: - targets: aarch64-apple-darwin,aarch64-linux-android + targets: aarch64-apple-darwin,aarch64-linux-android,x86_64-linux-android - name: Cache Cargo uses: actions/cache@v4 @@ -96,3 +96,6 @@ jobs: - name: Run shared JVM tests run: ./gradlew :shared:jvmTest --no-daemon --stacktrace + + - name: Verify Android native libraries + run: ./gradlew :androidApp:verifyDebugVnidropLibraries --no-daemon --stacktrace diff --git a/androidApp/build.gradle.kts b/androidApp/build.gradle.kts index 0930536..f1e992c 100644 --- a/androidApp/build.gradle.kts +++ b/androidApp/build.gradle.kts @@ -1,4 +1,34 @@ +import org.gradle.api.DefaultTask +import org.gradle.api.file.RegularFileProperty +import org.gradle.api.provider.SetProperty +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.InputFile +import org.gradle.api.tasks.PathSensitive +import org.gradle.api.tasks.PathSensitivity +import org.gradle.api.tasks.TaskAction import org.jetbrains.kotlin.gradle.dsl.JvmTarget +import java.util.zip.ZipFile + +abstract class VerifyVnidropLibrariesTask : DefaultTask() { + @get:InputFile + @get:PathSensitive(PathSensitivity.RELATIVE) + abstract val apk: RegularFileProperty + + @get:Input + abstract val requiredLibraries: SetProperty + + @TaskAction + fun verify() { + ZipFile(apk.get().asFile).use { archive -> + val missing = requiredLibraries.get().filter { path -> + archive.getEntry(path)?.size?.takeIf { it > 0L } == null + } + check(missing.isEmpty()) { + "Debug APK has missing or empty VniDrop libraries: ${missing.joinToString()}" + } + } + } +} plugins { alias(libs.plugins.androidApplication) @@ -37,7 +67,10 @@ android { excludes += "/META-INF/{AL2.0,LGPL2.1}" } jniLibs { - pickFirsts += "lib/arm64-v8a/libvnidrop.so" + pickFirsts += setOf( + "lib/arm64-v8a/libvnidrop.so", + "lib/x86_64/libvnidrop.so", + ) } } buildTypes { @@ -52,12 +85,33 @@ android { sourceSets { getByName("debug") { jniLibs.srcDir(project(":shared").layout.buildDirectory.dir("intermediates/rust/aarch64-linux-android/debug")) + jniLibs.srcDir(project(":shared").layout.buildDirectory.dir("intermediates/rust/x86_64-linux-android/debug")) } } } tasks.configureEach { if (name == "mergeDebugJniLibFolders" || name == "mergeDebugNativeLibs") { - dependsOn(":shared:copyAndroidAndroidArm64Debug") + dependsOn( + ":shared:copyAndroidAndroidArm64Debug", + ":shared:copyAndroidAndroidX64Debug", + ) } } + +val verifyDebugVnidropLibraries = tasks.register("verifyDebugVnidropLibraries") { + group = "verification" + description = "Verifies that the debug APK packages VniDrop for every supported Android ABI." + dependsOn("assembleDebug") + apk.set(layout.buildDirectory.file("outputs/apk/debug/androidApp-debug.apk")) + requiredLibraries.set( + setOf( + "lib/arm64-v8a/libvnidrop.so", + "lib/x86_64/libvnidrop.so", + ), + ) +} + +tasks.named("check") { + dependsOn(verifyDebugVnidropLibraries) +} diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index bbad793..05ee35a 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -184,7 +184,7 @@ val hostCargoTargets = buildSet { cargo { packageDirectory = layout.projectDirectory.dir("../crates/vnidrop") publishJvmArtifacts = true - androidTargetsToBuild.set(setOf(RustAndroidTarget.Arm64)) + androidTargetsToBuild.set(setOf(RustAndroidTarget.Arm64, RustAndroidTarget.X64)) builds.jvm { variants { // Desktop distributions are built per host. Do not publish disabled