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

如何在Android Studio Logcat中查看Go语言代码的日志输出

Go交叉编译Android后Logcat看不到日志的解决办法

问题根源

Go标准库的fmt、log输出默认走stdout/stderr,但Android系统不会自动把这两个流的内容转发到Logcat,所以你看不到这些日志。另外,之前的编译命令没链接Android日志库,就算重定向了也无法调用Logcat接口。

两种解决方法

方法一:重定向stdout/stderr到Logcat

直接把Go的标准输出/错误流替换成能写入Android日志的自定义Writer,这样原来的fmt.Println、log.Println代码不用改就能输出到Logcat。

Go代码示例:

package main

/*
#include <android/log.h>
#define LOG_TAG "GoNative"

void writeLog(int prio, const char* msg) {
    __android_log_write(prio, LOG_TAG, msg);
}
*/
import "C"
import (
    "os"
    "strings"
    "sync"
    "unsafe"
)

type androidLogWriter struct {
    priority C.int
}

func (w androidLogWriter) Write(p []byte) (n int, err error) {
    // 去掉换行和空白,避免空日志
    msg := strings.TrimSpace(string(p))
    if msg == "" {
        return len(p), nil
    }
    cMsg := C.CString(msg)
    defer C.free(unsafe.Pointer(cMsg))
    C.writeLog(w.priority, cMsg)
    return len(p), nil
}

var initLog sync.Once

func init() {
    initLog.Do(func() {
        // 把stdout映射到Logcat的INFO级别
        os.Stdout = &androidLogWriter{priority: C.ANDROID_LOG_INFO}
        // 把stderr映射到Logcat的ERROR级别
        os.Stderr = &androidLogWriter{priority: C.ANDROID_LOG_ERROR}
    })
}

// 你的导出函数示例
//export YourGoFunc
func YourGoFunc() {
    fmt.Println("这条fmt日志现在能在Logcat看到了")
    log.Println("这条log日志也会出现在Logcat里")
}

// 必须保留main函数,否则编译会报错
func main() {}

编译命令要加上链接日志库的参数-ldflags="-llog",同时指定Android的编译环境:

# 编译静态库(armeabi-v7a架构)
GOOS=android GOARCH=arm GOARM=7 go build -buildmode=c-archive -ldflags="-llog" -o foo.a

# 编译共享库
GOOS=android GOARCH=arm GOARM=7 go build -buildmode=c-shared -ldflags="-llog" -o C:\Users\Nems\TestingLogs1\armeabi-v7a\libfoo.so

方法二:直接调用Android Log接口

如果不想改标准输出,也可以封装自己的日志函数,直接调用Android的__android_log_write,在需要打日志的地方用这个函数代替fmt/log。

示例代码:

package main

/*
#include <android/log.h>
#define LOG_TAG "GoNative"
*/
import "C"
import "unsafe"

// LogInfo 输出INFO级别日志到Logcat
func LogInfo(msg string) {
    cMsg := C.CString(msg)
    defer C.free(unsafe.Pointer(cMsg))
    C.__android_log_write(C.ANDROID_LOG_INFO, C.LOG_TAG, cMsg)
}

// LogError 输出ERROR级别日志到Logcat
func LogError(msg string) {
    cMsg := C.CString(msg)
    defer C.free(unsafe.Pointer(cMsg))
    C.__android_log_write(C.ANDROID_LOG_ERROR, C.LOG_TAG, cMsg)
}

//export YourGoFunc
func YourGoFunc() {
    LogInfo("直接调用Android Log的INFO日志")
    LogError("直接调用Android Log的ERROR日志")
}

func main() {}

编译命令同样要加-ldflags="-llog",和上面的编译命令一致。

验证步骤

  1. 用修改后的Go代码重新编译生成.a或.so文件
  2. 替换Android Studio项目中对应的库文件
  3. 运行应用后,在Logcat的搜索框输入GoNative(你定义的LOG_TAG),就能看到对应的日志了

内容的提问来源于stack exchange,提问作者sayed neiman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 00:40:23