在 Kotlin DSL 中,ndk 的配置方式有所不同,取决于 Android Gradle 插件版本。ndk { abiFilters(…) } 在 Kotlin DSL 中实际上是 externalNativeBuild 的一部分,需要通过正确的上下文调用。
错误代码:
ndk {abiFilters("arm64-v8a")
}
直接调用 ndk,没有合适的上下文,可能会导致 Unresolved reference 错误。
修复方法
方法 1:在 defaultConfig 中配置 ABI 筛选器
abiFilters 通常是在 defaultConfig 块内设置的,你可以将代码调整如下:
android {defaultConfig {testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"ndk {abiFilters += "arm64-v8a"}}
}
或者,使用完整的 abiFilters 列表:
android {defaultConfig {testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"ndk {abiFilters += listOf("arm64-v8a", "armeabi-v7a", "x86", "x86_64")}}
}
方法 2:配置 splits.abi(更灵活的方式)
如果你希望控制 APK 的 ABI 分裂(例如生成特定 ABI 的 APK),可以使用 splits 配置:
android {splits {abi {enable = truereset()include("arm64-v8a", "armeabi-v7a", "x86", "x86_64")universalApk = false // 不生成通用 APK}}
}
方法 3:使用 externalNativeBuild
如果你的项目使用 CMake 或 ndk-build,可以在 externalNativeBuild 块中配置:
android {externalNativeBuild {cmake {abiFilters.addAll(listOf("arm64-v8a", "armeabi-v7a"))}}
}
总结
如果只是简单筛选 ABI,推荐方法 1,将 abiFilters 放在 defaultConfig 中。
如果需要更复杂的 ABI 分裂控制,使用方法 2。
如果项目使用 CMake 或 ndk-build,则选择方法 3