在Android系统中,凡是由Zygote孵化出来的进程,其标准输出(stdout)、标准错误(stderr)都被重定向到了/dev/null这个设备中。因此,任何输出到stdout和stderr的信息都会被忽略。而Android的应用程序,都是自Zygote进程孵化出来的,所以都不会有stdout和stderr输出,printf函数根本不起作用。

这通常没有什么问题,Android为了弥补没有stdout和stderr的缺陷,特别设计了自己的日志系统供开发者使用。但有,有时候我们写的程序会用到已有的一些共享代码,这些共享代码可以被编译到Android平台上,但是它们的日志却是输出到stdout和stderr上的。如果要将它们的日志都输出到logcat上,那么必须得修改原有代码中所有打印日志的部分,不过往往这样做费时费力,还容易出错。那么有没有什么办法可以不修改代码,又让它们的日志输出到logcat上呢?

Android系统原生自带了一个小工具,叫做logwrapper,其位于/system/bin目录下。它可以将指定程序输出到stdout和stderr上的信息转发到logcat上去。

命令的格式是:

logwrapper [-a] [-d] [-k] BINARY [ARGS...]

这里BINARY就是你要转发日志的应用程序,logwrapper会启一个子进程运行你的程序。而ARGS就是需要传递给你的应用程序的参数。

如果你的日志很长,不想全部打印出来的话,只关心程序刚启动之后一会或者程序结束前一会的状况,可以加上-a参数。加上之后,logwrapper只会打印其中之后的前4K和结束之前的前4K的日志。

如果你不想将程序的日志重定向到Amdrpod的日志系统,而是想重定向到内核日志的话,可以加上-k参数。

无论是向stdout的输出还是向stderr的输出,logwrapper转发到logcat中的日志,其Tag统一被设置成你自己的应用程序的名字,而输出级别都是“INFO”。

最后,拿个简单的例子实验一下。top命令的输出是打印到stdout上的,如果我们用logwrapper将其重定向一下,会是什么结果呢?

先用logwrapper将top启动起来:


这时候我们用ps命令来看看当前有哪些进程:


可以看到,这时有两个新增的进程,分别是logwrapper和top,并且top进程的父进程是logwrapper进程。

接着,我们用adb logcat连接上Android设备上的logcat,看看有什么结果:


果真top命令的输出被重定向到了logcat,并且级别是INFO(“I”),Tag是程序名(“top”)

更多相关文章

  1. Android中的多进程开发以及多进程的使用场景
  2. Android中实现跨进程通信(IPC)的方式(三)之观察者模式
  3. Android 应用程序查找设备的方法——以串口为例
  4. Android自带示例程序--Snake
  5. Android下如何调试程序
  6. Android Studio3.0开发JNI流程------在Android原程序添加自己类
  7. [原]Android应用程序线程消息循环模型分析
  8. 使用FlowDroid生成Android应用程序的函数调用图
  9. Android之A面试题④应用程序内部启动Activity过程(startActivity)

随机推荐

  1. Android 自动更新程序
  2. Unable to get view server version from
  3. Android初学者—listView用法
  4. android/java 计算大文件的sha1值
  5. Android 持久化技术(一)之SharedPreference
  6. Android OkHttp3简介和使用详解
  7. Android(安卓)EditText回车不换行
  8. Android自定义属性时format选项可以取用
  9. Android(安卓)复习_Task 与 Back Stack
  10. 赵雅智_名片夹(4)_Android中listview可折叠