如何在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",和上面的编译命令一致。
验证步骤
- 用修改后的Go代码重新编译生成
.a或.so文件 - 替换Android Studio项目中对应的库文件
- 运行应用后,在Logcat的搜索框输入
GoNative(你定义的LOG_TAG),就能看到对应的日志了
内容的提问来源于stack exchange,提问作者sayed neiman
相关产品推荐
相关产品推荐

