Gomobile 工具链已过时,仅在 Android Studio 中

Gomobile toolchain out of date, only in Android Studio

我正在使用最新的 gomobile、Go 和 Android Studio 版本。

当我 运行 来自终端的 gradle 任务时,它们按预期工作并构建正确的二进制文件,但是在 Android Studio 中我收到一个错误:

bin/gomobile: toolchain out of date, run `gomobile init`

当然我已经重新运行 gomobile init 很多次了,没有任何变化。我的假设是 Android Studio 正在使用一些我无法识别的配置。

我很欣赏这是一个边缘案例问题,但如果有人能指出正确的方向,那将会很有帮助。

TLDR; ./gradlew myproj:bind 在终端中工作正常,在 Android Studio 中失败。

这似乎是 gomobile 的错误信息,见于 cmd/gomobile/env.go#L69-L83:

// Find gomobilepath.
gopath := goEnv("GOPATH")
for _, p := range filepath.SplitList(gopath) {
    gomobilepath = filepath.Join(p, "pkg", "gomobile")
    if _, err := os.Stat(gomobilepath); buildN || err == nil {
        break
    }
}

verpath := filepath.Join(gomobilepath, "version")
installedVersion, err := ioutil.ReadFile(verpath)
if !bytes.Equal(installedVersion, version) {
    return nil, errors.New("toolchain out of date, run `gomobile init`")
}

因此请仔细检查本地会话和 Android Studio 会话之间 GOPATH 的值。
例如,请参阅 this old (2015) thread 以了解这些评论是否仍然适用。

我已经弄清楚了这个问题,以防其他人遇到问题;

  1. 看起来,至少对我来说,Gradle 插件没有考虑 GO bin 的位置。相反,它使用;

    查找 gobin
            gobin, err := exec.LookPath("go")
    

我安装了很多 Go 版本(出于各种原因),所以我强制 gobin 失败了。为了发现这一点,我在 env.go 文件中添加了调试日志。通常,在尝试调试时文件上的日志记录不是最清楚的。