You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 19:05:11