go all: 支持在Android上进行本地构建

xiozqbni  于 4个月前  发布在  Go
关注(0)|答案(7)|浏览(124)

你使用的Go版本是什么( go version )?

$ go version
go version go1.16.7 android/arm64

这个问题在最新版本中是否会重现?

你正在使用什么操作系统和处理器架构( go env )?

go env 输出

$ go env
GO111MODULE=""
GOARCH="arm64"
GOBIN=""
GOCACHE="/data/data/com.termux/files/home/.cache/go-build"
GOENV="/data/data/com.termux/files/home/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="arm64"
GOHOSTOS="android"
GOINSECURE=""
GOMODCACHE="/data/data/com.termux/files/home/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="android"
GOPATH="/data/data/com.termux/files/home/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/data/data/com.termux/files/usr/lib/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/data/data/com.termux/files/usr/lib/go/pkg/tool/android_arm64"
GOVCS=""
GOVERSION="go1.16.7"
GCCGO="gccgo"
AR="ar"
CC="aarch64-linux-android-clang"
CXX="aarch64-linux-android-clang++"
CGO_ENABLED="1"
GOMOD="/data/data/com.termux/files/home/Applications/go/src/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/data/data/com.termux/files/usr/tmp/go-build2204854682=/tmp/go-build -gno-record-gcc-switches"

你做了什么?

./make.bash

你期望看到什么?

Installed Go for android/arm64 in /data/data/com.termux/files/home/Applications/go
Installed commands in /data/data/com.termux/files/home/Applications/go/bin

你看到了什么?

Building Go cmd/dist using /data/data/com.termux/files/usr/lib/go. (go1.16.7 android/arm64)
Building Go toolchain1 using /data/data/com.termux/files/usr/lib/go.
Building Go bootstrap cmd/go (go_bootstrap) using Go toolchain1.
Building Go toolchain2 using go_bootstrap and Go toolchain1.
Building Go toolchain3 using go_bootstrap and Go toolchain2.
Building packages and commands for android/arm64.
# runtime/cgo
/data/data/com.termux/files/usr/bin/ld: /system/lib64/liblog.so: unknown type [0x13] section `.relr.dyn'
/data/data/com.termux/files/usr/bin/ld: skipping incompatible /system/lib64/liblog.so when searching for -llog
/data/data/com.termux/files/usr/bin/ld: /system/lib64/liblog.so: unknown type [0x13] section `.relr.dyn'
/data/data/com.termux/files/usr/bin/ld: skipping incompatible /system/lib64/liblog.so when searching for -llog
/data/data/com.termux/files/usr/bin/ld: cannot find -llog
/data/data/com.termux/files/usr/bin/ld: /system/lib64/liblog.so: unknown type [0x13] section `.relr.dyn'
/data/data/com.termux/files/usr/bin/ld: skipping incompatible /system/lib64/liblog.so when searching for -llog
/data/data/com.termux/files/usr/bin/ld: /system/lib64/liblog.so: unknown type [0x13] section `.relr.dyn'
/data/data/com.termux/files/usr/bin/ld: skipping incompatible /system/lib64/liblog.so when searching for -llog
clang-12: error: linker command failed with exit code 1 (use -v to see invocation)
go tool dist: FAILED: /data/data/com.termux/files/home/Applications/go/pkg/tool/android_arm64/go_bootstrap install -gcflags=all= -ldflags=all= std cmd: exit status 2
s3fp2yjn

s3fp2yjn1#

这看起来像是Android链接器/data/data/com.termux/files/usr/bin/ld在读取Android库/system/lib64/liblog.so时出现的问题。我不知道Termux是什么,但如果问题是Android链接器无法读取Android库,我认为我们不能在Go中解决这个问题。
Go 1.16是否有效?它在runtime/cgo包中有与-llog相同的使用。这种使用是在Go 1.4中添加的。

xzlaal3s

xzlaal3s2#

我的天啊。你是对的。这是Android 12开发者预览4中的一个回归问题。这里有一个neofetch

OS: Android 12 aarch64
Host: google Pixel 3
Kernel: 4.9.270-gc51c7b10ee52-ab7522847
Uptime: 5 days, 1 hour, 38 mins
Packages: 109 (dpkg), 1 (pkg)
Shell: bash 5.1.8
CPU: Qualcomm SDM845 (8) @ 1.766GHz
Memory: 2690MiB / 3579MiB

Termux是一个为Android设计的终端模拟器:https://github.com/termux/termux-app
谷歌长期以来一直在努力禁止执行任意代码,看起来他们终于翻转了开关。这里是来自Termux的最新更新

由于在Android上构建Go将不再可能,它是否会从Go的支持中被删除,还是Go将继续支持到Android 11?

hjzp0vay

hjzp0vay3#

CC @hyangah 查看一下

o7jaxewo

o7jaxewo4#

Go支持并可能会继续支持Android作为目标平台。
据我所知,Android主要不是一个开发者平台,大多数Android开发者并不在Android上构建。我也不确定是否有一个“标准”的开发环境。据我所知,在Android上构建并不是真正官方支持和测试的。

lkaoscv7

lkaoscv75#

在go/src/internal/testenv/testenv.go文件的第37行到第49行,我们可以看到以下代码:

funcHasGoBuild() bool {
    if os.Getenv("GO_GCFLAGS") != "" {
        // It's too much work to require every caller of the go command
        // to pass along "-gcflags="+os.Getenv("GO_GCFLAGS").
        // For now, if $GO_GCFLAGS is set, report that we simply can't
        // run go build.
        return false
    }
    switch runtime.GOOS {
    case "android", "js", "ios":
        return false
    }
    return true
}

这段代码定义了一个名为funcHasGoBuild()的函数,该函数返回一个布尔值。函数首先检查环境变量GO_GCFLAGS是否为空,如果不为空,则返回false,表示无法运行go build命令。接下来,函数根据不同的操作系统(如Android、JS和iOS)返回相应的布尔值。最后,如果没有满足上述条件的情况,函数返回true

omtl5h9j

omtl5h9j6#

-llog标志来自为termux交叉编译的golang。如果你想在termux中编译golang并能够成功使用它,你可能需要应用termux应用的all three patches
由于在Android上构建Go将不再可能,它是否会从Go的支持中被删除,还是Go将继续支持Android 11?
潜在的问题/缺点只发生在针对Android 11或更新版本的应用上。目前(以及可能在可预见的未来)termux的目标是Android 10。这对目前来说没问题,只是应用程序不允许通过playstore进行更新(并且会在某个时候被移除)。
golang本身无法与android >= 11兼容,因为问题在于一个应用程序(如termux)运行golang(" exec() s"),而不是golang本身。理论上,应该可以创建一个允许您在android >= 11上使用golang编译代码的android应用程序,但您将无法运行任何生成的二进制文件。

moiiocjp

moiiocjp7#

只有src-runtime-cgo-cgo.go.patchsrc-runtime-cgo-gcc_android.c.patch对我有效,但我能够构建go1.17

$ go version
go version go1.17 android/arm64

go env 输出

$ go env
GO111MODULE=""
GOARCH="arm64"
GOBIN=""
GOCACHE="/data/data/com.termux/files/home/.cache/go-build"
GOENV="/data/data/com.termux/files/home/.config/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="arm64"
GOHOSTOS="android"
GOINSECURE=""
GOMODCACHE="/data/data/com.termux/files/home/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="android"
GOPATH="/data/data/com.termux/files/home/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/data/data/com.termux/files/home/Applications/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/data/data/com.termux/files/home/Applications/go/pkg/tool/android_arm64"
GOVCS=""
GOVERSION="go1.17"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/dev/null"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/data/data/com.termux/files/usr/tmp/go-build2291608239=/tmp/go-build -gno-record-gcc-switches"

git diff 输出

diff --git a/src/runtime/cgo/cgo.go b/src/runtime/cgo/cgo.go
index 4d2caf6c4f..e2cece097a 100644
--- a/src/runtime/cgo/cgo.go
+++ b/src/runtime/cgo/cgo.go
@@ -15,7 +15,6 @@ package cgo
 #cgo darwin,arm64 LDFLAGS: -framework CoreFoundation
 #cgo dragonfly LDFLAGS: -lpthread
 #cgo freebsd LDFLAGS: -lpthread
-#cgo android LDFLAGS: -llog
 #cgo !android,linux LDFLAGS: -lpthread
 #cgo netbsd LDFLAGS: -lpthread
 #cgo openbsd LDFLAGS: -lpthread
diff --git a/src/runtime/cgo/gcc_android.c b/src/runtime/cgo/gcc_android.c
index 7ea213599d..3e6afc5b79 100644
--- a/src/runtime/cgo/gcc_android.c
+++ b/src/runtime/cgo/gcc_android.c
@@ -13,22 +13,12 @@ fatalf(const char* format, ...)
 {
 	va_list ap;
 
-	// Write to both stderr and logcat.
-	//
-	// When running from an .apk, /dev/stderr and /dev/stdout
-	// redirect to /dev/null. And when running a test binary
-	// via adb shell, it's easy to miss logcat.
-
 	fprintf(stderr, "runtime/cgo: ");
 	va_start(ap, format);
 	vfprintf(stderr, format, ap);
 	va_end(ap);
 	fprintf(stderr, "\n");
 
-	va_start(ap, format);
-	__android_log_vprint(ANDROID_LOG_FATAL, "runtime/cgo", format, ap);
-	va_end(ap);
-
 	abort();
 }

相关问题