Gradle构建Git依赖时如何读取local.properties中的SDK/NDK配置?
问题描述
- 在
settings.gradle.kts中通过Git仓库引入WireGuard依赖:sourceControl { gitRepository(URI("https://github.com/WireGuard/wireguard-android.git")) { producesModule("com.wireguard.android:tunnel") } } - 配置依赖从master分支拉取构建:
dependencies { implementation(libs.wireguard) { version { branch = "master" } } } - 同步项目时触发
SDK is not defined和NDK is not defined错误,推测是WireGuard依赖构建时未读取本地local.properties里的配置:sdk.dir=/Users/username/Library/Android/sdk ndk.dir=/Users/username/Library/Android/sdk/ndk
解决方案
方法一:用系统环境变量传递路径
Gradle构建会优先读取ANDROID_SDK_ROOT和ANDROID_NDK_ROOT环境变量,直接设置就能让依赖构建识别到路径:
- macOS/Linux:终端执行(或者加到
~/.bashrc/~/.zshrc里永久生效):export ANDROID_SDK_ROOT=/Users/username/Library/Android/sdk export ANDROID_NDK_ROOT=/Users/username/Library/Android/sdk/ndk - Windows:在系统环境变量里添加两个变量:
- 变量名
ANDROID_SDK_ROOT,值填你的SDK路径 - 变量名
ANDROID_NDK_ROOT,值填你的NDK路径
- 变量名
设置完重启IDE,重新同步Gradle就行。
方法二:在settings.gradle里显式传参给Git依赖
在settings.gradle.kts的gitRepository闭包里,通过onResolve读取本地配置并传递给依赖构建:
sourceControl { gitRepository(URI("https://github.com/WireGuard/wireguard-android.git")) { producesModule("com.wireguard.android:tunnel") onResolve { repo -> val localProps = file("local.properties") if (localProps.exists()) { val props = Properties() props.load(localProps.inputStream()) val sdkPath = props.getProperty("sdk.dir") val ndkPath = props.getProperty("ndk.dir") // 把路径作为Gradle参数传给依赖构建 repo.withArguments("-Pandroid.sdk.dir=$sdkPath", "-Pandroid.ndk.dir=$ndkPath") } } } }
这段代码会读取你本地的local.properties,把SDK和NDK路径通过参数传给WireGuard的构建流程,确保它能找到对应目录。
方法三:复制local.properties到依赖构建目录
如果前两种方法没用,可以直接把本地的local.properties复制到WireGuard依赖的拉取目录里。在settings.gradle.kts中配置:
sourceControl { gitRepository(URI("https://github.com/WireGuard/wireguard-android.git")) { producesModule("com.wireguard.android:tunnel") onCheckout { _, checkoutDir -> val localProps = file("local.properties") if (localProps.exists()) { localProps.copyTo(checkoutDir.resolve("local.properties"), overwrite = true) } } } }
onCheckout会在依赖代码拉取完成后执行,把你的local.properties复制到依赖根目录,这样构建时就能读取到配置了。
内容的提问来源于stack exchange,提问作者crizzis
相关产品推荐
相关产品推荐

