您好,登錄后才能下訂單哦!
android手機上的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貌似現在還未提供。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。