// Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //go:build android // +build android package main /* To view the log output run: adb logcat GoLog:I *:S */ // Android redirects stdout and stderr to /dev/null. // As these are common debugging utilities in Go, // we redirect them to logcat. // // Unfortunately, logcat is line oriented, so we must buffer. /* #cgo LDFLAGS: -landroid -llog #include #include #include */ import "C" import ( "bufio" "os" "unsafe" log "github.com/sirupsen/logrus" ) var ( ctag = C.CString("cloak") ) type infoWriter struct{} func (infoWriter) Write(p []byte) (n int, err error) { cstr := C.CString(string(p)) C.__android_log_write(C.ANDROID_LOG_INFO, ctag, cstr) C.free(unsafe.Pointer(cstr)) return len(p), nil } func lineLog(f *os.File, priority C.int) { const logSize = 1024 // matches android/log.h. r := bufio.NewReaderSize(f, logSize) for { line, _, err := r.ReadLine() str := string(line) if err != nil { str += " " + err.Error() } cstr := C.CString(str) C.__android_log_write(priority, ctag, cstr) C.free(unsafe.Pointer(cstr)) if err != nil { break } } } func log_init() { log.SetOutput(infoWriter{}) r, w, err := os.Pipe() if err != nil { panic(err) } os.Stderr = w go lineLog(r, C.ANDROID_LOG_ERROR) r, w, err = os.Pipe() if err != nil { panic(err) } os.Stdout = w go lineLog(r, C.ANDROID_LOG_INFO) }