From bd89f3b24f47092b2daa729c294bd1a5a82133cb Mon Sep 17 00:00:00 2001 From: xz-dev Date: Wed, 19 Nov 2025 22:57:25 +0800 Subject: [PATCH] fix: Return all intersecting ABIs instead of just one The original logic had a critical bug: even when multiple ABIs were in the intersection, it would only return a single ABI based on priority (arm64 > x86_64 > first). This caused APKs to only contain one architecture's native libraries, leading to 'library not found' errors on other architectures. Changes: - Return all intersecting ABIs instead of selecting one - Add disableAbiOptimization option for full control - Properly pass extension parameter to resolveAbiList This maintains IDE optimization (only build what's needed for deployment) while ensuring all necessary architectures are built. Fixes: https://github.com/MatrixDev/GradleAndroidRustPlugin/issues/3 --- .../matrix/agp/rust/AndroidRustExtension.kt | 10 ++++++++++ .../dev/matrix/agp/rust/AndroidRustPlugin.kt | 18 +++++++++++------- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/main/kotlin/dev/matrix/agp/rust/AndroidRustExtension.kt b/src/main/kotlin/dev/matrix/agp/rust/AndroidRustExtension.kt index 9438d77..dddc433 100644 --- a/src/main/kotlin/dev/matrix/agp/rust/AndroidRustExtension.kt +++ b/src/main/kotlin/dev/matrix/agp/rust/AndroidRustExtension.kt @@ -11,6 +11,16 @@ open class AndroidRustExtension : AndroidRustConfiguration() { var minimumSupportedRustVersion = "" var modules = mutableMapOf() + /** + * Disable IDE ABI injection optimization. + * When true, all requested ABIs will be built regardless of IDE deployment target. + * When false (default), only the IDE target ABI will be built to speed up development builds. + * + * Set to true if you experience "library not found" errors when running from Android Studio. + * See: https://github.com/MatrixDev/GradleAndroidRustPlugin/issues/3 + */ + var disableAbiOptimization = false + fun module(name: String, configure: AndroidRustModule.() -> Unit) { modules.getOrPut(name, ::AndroidRustModule).configure() } diff --git a/src/main/kotlin/dev/matrix/agp/rust/AndroidRustPlugin.kt b/src/main/kotlin/dev/matrix/agp/rust/AndroidRustPlugin.kt index 6bfba4e..84f3960 100644 --- a/src/main/kotlin/dev/matrix/agp/rust/AndroidRustPlugin.kt +++ b/src/main/kotlin/dev/matrix/agp/rust/AndroidRustPlugin.kt @@ -61,7 +61,7 @@ class AndroidRustPlugin : Plugin { else -> null } - val rustAbiSet = resolveAbiList(project, rustConfiguration.targets) + val rustAbiSet = resolveAbiList(project, rustConfiguration.targets, extension) allRustAbiSet.addAll(rustAbiSet) for (rustAbi in rustAbiSet) { @@ -102,9 +102,15 @@ class AndroidRustPlugin : Plugin { } } - private fun resolveAbiList(project: Project, requested: Collection): Collection { + private fun resolveAbiList(project: Project, requested: Collection, extension: AndroidRustExtension): Collection { val requestedAbi = Abi.fromRustNames(requested) + // If optimization is disabled, build all requested ABIs + if (extension.disableAbiOptimization) { + return requestedAbi + } + + // Otherwise, use IDE ABI injection optimization for faster development builds val injectedAbi = Abi.fromInjectedBuildAbi(project) if (injectedAbi.isEmpty()) { return requestedAbi @@ -115,11 +121,9 @@ class AndroidRustPlugin : Plugin { "ABIs requested by IDE ($injectedAbi) are not supported by the build config ($requested)" } - return when { - intersectionAbi.contains(Abi.Arm64) -> listOf(Abi.Arm64) - intersectionAbi.contains(Abi.X86_64) -> listOf(Abi.X86_64) - else -> listOf(intersectionAbi.first()) - } + // Return all intersecting ABIs, not just one + // The original logic only returned a single ABI which caused deployment issues + return intersectionAbi.toList() } private fun mergeRustConfigurations(vararg configurations: AndroidRustConfiguration?): AndroidRustConfiguration {