【问题标题】:Android 5 - Redirect stdout to logcatAndroid 5 - 将标准输出重定向到 logcat
【发布时间】:2019-02-16 03:24:44
【问题描述】:

我正在尝试在 Android 上运行一些 GMock/GTest 测试。这些都运行良好,但没有输出,因为 GMock 记录到标准输出。

我尝试了以下方法,但没有成功(可能是因为它适用于 Dalvik VM,而他们已经在 Android 5 中取消了它):

$ adb shell stop
$ adb shell setprop log.redirect-stdio true
$ adb shell start

log.redirect-stdio设置为true时,stdio仍然没有输出到logcat。

我还尝试使用std::cout.rdbuf 自定义几个streambuf 实现以尝试使用__android_log_print 将stdout 定向到logcat,但这些都没有向logcat 打印任何内容。

有没有人成功地将标准输出重定向到 Android 5 中的 logcat?

如果需要,我可以添加更多细节(例如我尝试过的streambuf 实现)。

【问题讨论】:

    标签: android stdout logcat googletest android-5.0-lollipop


    【解决方案1】:

    这并不是解决将 stdout 重定向到 logcat 问题的真正解决方案,但我建议将其作为一种解决方法,以防它对某人有所帮助。

    您可以将标准输出重定向到文件:

    freopen("/data/data/com.your.package/files/out.txt", "w", stdout);
    ... // Call GMock which prints to the file instead
    fclose(stdout)
    

    然后我们可以cat 文件查看记录的测试结果。遗憾的是,Android 没有tail,因此日志不能很好地实时使用。 (除非你擅长发送垃圾邮件cat

    【讨论】:

    • 如果你真的想在 logcat 中使用它,你可以通过将它指向你读取的管道并代理到另一个线程/进程中的日志来做到这一点,就像过去工作的旧功能一样。
    【解决方案2】:

    用旧的 Java 方式来做:(但我使用的是 kotlin,谁能推荐一个更简洁的版本?)

    documentation: System.setOut()

    import java.io.OutputStream
    import java.io.PrintStream
    
    private const val TAG = "MyActivity"
    class LogcatOutputStream: OutputStream(){
        private var line_buffer: StringBuilder = StringBuilder()
        override fun write(b: Int){
            when(b){
                '\n'.toInt() -> {
                    Log.i(TAG, line_buffer.toString())
                    line_buffer.setLength(0)
                }
                else -> line_buffer.append(b.toChar())
            }
        }
    }
    
    // put this somewhere in the code, like onCreate() as shown
    class MainActivity: Activity(){
        override fun onCreate(savedInstanceState: Bundle?){
            // some other code
    
            PrintStream(LoggerOutputStream()).let{
                System.setOut(it)
                System.setErr(it)
            }
    
            // some other code
        }
    }
    
    // result:
    println("Hello World") // which is effectively System.out.println in Java
    // with have the below output in logcat
    I/MyActivity(<pid>): Hello World
    // as a reminder, you can filter logcat by tags
    adb logcat MyActivity:D
    // to only show logs tagged with 'MyActivity' (same value as 'TAG' above)
    

    【讨论】:

      猜你喜欢
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-26
      • 2016-04-26
      相关资源
      最近更新 更多