Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions src/main/kotlin/dev/matrix/agp/rust/AndroidRustExtension.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,16 @@ open class AndroidRustExtension : AndroidRustConfiguration() {
var minimumSupportedRustVersion = ""
var modules = mutableMapOf<String, AndroidRustModule>()

/**
* 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()
}
Expand Down
18 changes: 11 additions & 7 deletions src/main/kotlin/dev/matrix/agp/rust/AndroidRustPlugin.kt
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ class AndroidRustPlugin : Plugin<Project> {
else -> null
}

val rustAbiSet = resolveAbiList(project, rustConfiguration.targets)
val rustAbiSet = resolveAbiList(project, rustConfiguration.targets, extension)
allRustAbiSet.addAll(rustAbiSet)

for (rustAbi in rustAbiSet) {
Expand Down Expand Up @@ -102,9 +102,15 @@ class AndroidRustPlugin : Plugin<Project> {
}
}

private fun resolveAbiList(project: Project, requested: Collection<String>): Collection<Abi> {
private fun resolveAbiList(project: Project, requested: Collection<String>, extension: AndroidRustExtension): Collection<Abi> {
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
Expand All @@ -115,11 +121,9 @@ class AndroidRustPlugin : Plugin<Project> {
"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 {
Expand Down