温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

logcat日志在网页上的实时输出(环形日志缓冲区的实现)

发布时间:2020-06-21 21:48:56 阅读:4165 作者:心如明镜 栏目:开发技术
开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

    android手机上的logcat会不断的打印出日志。我们想要实现这样一个目标:在网页上显示某个手机的logcat打印信息,就像这样:

logcat日志在网页上的实时输出(环形日志缓冲区的实现)

因为是logcat是动态实时不断打印的,所以,不论多大的缓存都会被撑爆。所以,必须使用环形缓冲区,覆盖和重用日志缓冲区。如果日志打印过快,显然会出现新旧日志堆叠的问题。但常规情形下,使用环形日志缓冲区,都能收到比较好的实测效果。

接收日志的装置(里边放置环形缓冲容器logs,是一个列表,环形是通过放置逻辑实现的):

public final class GetLogReceiver extends MultiLineReceiver {          // 五和:环形缓冲区的容量大小     private static final int MAX_LOG_COUNT = 3000;          private List<String> logs;          private int writePos = 0;          public GetLogReceiver() {         // 环形日志容器,留一条日志为空作为结束位置标识         logs = new ArrayList<String>(MAX_LOG_COUNT);                  for(int i=0; i<MAX_LOG_COUNT; i++) {             logs.add(null);         }     }      @Override     public boolean isCancelled() {         return false;     }      @Override     public void processNewLines(String[] lines) {         synchronized(logs) {              for(String line : lines) {                 if(!line.trim().equals("")) {                     logs.set(writePos, line);                     writePos++;                     writePos = writePos % MAX_LOG_COUNT;                 }             }                          logs.set(writePos, null);         }     }      public List<String> getNextBatchLogs(int start, int count) {         List<String> result = new ArrayList<String>();                  synchronized(logs) {             int firstReadPos = start % MAX_LOG_COUNT;                          for(int i=0; i<count; i++) {                 readPos = (firstReadPos + i)%MAX_LOG_COUNT;                 if (logs.get(readPos) != null) {                     result.add(logs.get(readPos));                 } else {                     break;                 }             }         }                  return result;     } } 

getNextBatchLogs提供了2个参数,一个是start,一个是count,前者表示网页开始读取日志的位置,后者表示网页想要读取日志的条数。通过这两个参数,网页可以通过ajax前向获取日志内容。

运行logcat的线程(核心代码):

public void run() {             while(true) {                 try {                     String serialNumber = device.getSerialNumber();                     String runLogcatCmd = "logcat -v time";                     device.executeShellCommand(runLogcatCmd,                             LogReceiverManager.getInstance().getLogReceiver(serialNumber));                 } catch (TimeoutException e) {                     e.printStackTrace();                 } catch (AdbCommandRejectedException e) {                     // 五和:表明手机被拔掉了                     break;                 } catch (IOException e) {                     // 五和:adb不稳定会抛此异常                     break;                 } catch (ShellCommandUnresponsiveException e) {                     e.printStackTrace();                 }                                  // 每间隔1秒重试一次                 try {                     Thread.sleep(1000);                 } catch (InterruptedException e) {                     e.printStackTrace();                 }                                  if (isKilled) {                     break;                 }             }         } 

这里,通过LogReceiverManager给每个手机维护一个日志缓存装置,通过serialNumber可以获取到GetLogReceiver对象。

原理很简单,实现还是有点精巧的,因为代码并不多,效果比较好。此logcat实时打印的功能,百度的MTC貌似现在还未提供。

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI

开发者交流群×