Skip to content

Commit 788dbe1

Browse files
authored
fix: Return all intersecting ABIs instead of just one (#11)
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: #3
1 parent 17ab999 commit 788dbe1

File tree

2 files changed

+21
-7
lines changed

2 files changed

+21
-7
lines changed

src/main/kotlin/dev/matrix/agp/rust/AndroidRustExtension.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,16 @@ open class AndroidRustExtension : AndroidRustConfiguration() {
1111
var minimumSupportedRustVersion = ""
1212
var modules = mutableMapOf<String, AndroidRustModule>()
1313

14+
/**
15+
* Disable IDE ABI injection optimization.
16+
* When true, all requested ABIs will be built regardless of IDE deployment target.
17+
* When false (default), only the IDE target ABI will be built to speed up development builds.
18+
*
19+
* Set to true if you experience "library not found" errors when running from Android Studio.
20+
* See: https://github.com/MatrixDev/GradleAndroidRustPlugin/issues/3
21+
*/
22+
var disableAbiOptimization = false
23+
1424
fun module(name: String, configure: AndroidRustModule.() -> Unit) {
1525
modules.getOrPut(name, ::AndroidRustModule).configure()
1626
}

src/main/kotlin/dev/matrix/agp/rust/AndroidRustPlugin.kt

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ abstract class AndroidRustPlugin @Inject constructor(
6565
else -> null
6666
}
6767

68-
val rustAbiSet = resolveAbiList(project, rustConfiguration.targets)
68+
val rustAbiSet = resolveAbiList(project, rustConfiguration.targets, extension)
6969
allRustAbiSet.addAll(rustAbiSet)
7070

7171
for (rustAbi in rustAbiSet) {
@@ -106,9 +106,15 @@ abstract class AndroidRustPlugin @Inject constructor(
106106
}
107107
}
108108

109-
private fun resolveAbiList(project: Project, requested: Collection<String>): Collection<Abi> {
109+
private fun resolveAbiList(project: Project, requested: Collection<String>, extension: AndroidRustExtension): Collection<Abi> {
110110
val requestedAbi = Abi.fromRustNames(requested)
111111

112+
// If optimization is disabled, build all requested ABIs
113+
if (extension.disableAbiOptimization) {
114+
return requestedAbi
115+
}
116+
117+
// Otherwise, use IDE ABI injection optimization for faster development builds
112118
val injectedAbi = Abi.fromInjectedBuildAbi(project)
113119
if (injectedAbi.isEmpty()) {
114120
return requestedAbi
@@ -119,11 +125,9 @@ abstract class AndroidRustPlugin @Inject constructor(
119125
"ABIs requested by IDE ($injectedAbi) are not supported by the build config ($requested)"
120126
}
121127

122-
return when {
123-
intersectionAbi.contains(Abi.Arm64) -> listOf(Abi.Arm64)
124-
intersectionAbi.contains(Abi.X86_64) -> listOf(Abi.X86_64)
125-
else -> listOf(intersectionAbi.first())
126-
}
128+
// Return all intersecting ABIs, not just one
129+
// The original logic only returned a single ABI which caused deployment issues
130+
return intersectionAbi.toList()
127131
}
128132

129133
private fun mergeRustConfigurations(vararg configurations: AndroidRustConfiguration?): AndroidRustConfiguration {

0 commit comments

Comments
 (0)