Android framework學習筆記 -- Google tracing的研究

最近使用systrace做性能測試,在systrace上統計紅綠燈,因爲數到眼殘,所以做了個自動數幀的工具。
主要做法是修改chrome tracing的源碼

話說tracing這麼好用,不出個cmdline真不合理。

tracing on github

幸運的看到了一段代碼

/*./tracing/tracing/extras/android/android_auditor.html*/
pushFramesAndJudgeJank_: function()

一看就知道是在判斷幀的狀態
然後就加了統計代碼

var redFrame = 0;
var yellowFrame = 0;
var greenFrame = 0;

app.process.frames.forEach(function(frame) {
    if (frame.totalDuration > EXPECTED_FRAME_TIME_MS * 2) {    // 紅幀
        badFramesObserved += 2;
        frame.perfClass = FRAME_PERF_CLASS.TERRIBLE
        redFrame += 1;  
    } else if (frame.totalDuration > EXPECTED_FRAME_TIME_MS 
        || frameMissedDeadline(frame)) {    // 黃幀
        badFramesObserved++;
        frame.perfClass = FRAME_PERF_CLASS.BAD;
        yellowFrame += 1;
    } else {    // 綠幀
        frame.perfClass = FRAME_PERF_CLASS.GOOD;
        greenFrame += 1;
    }
});

最後用log輸出

console.log("%d %d %d",redFrame,yellowFrame,greenFrame);

後面又要搞自動化,就是吧js裏面的東西打出來
有四個思路

  • 用nodejs運行,將結果寫文件
  • html5寫文件
  • 重定向log
  • 建本地服務器,用post提交數據

nodejs的很簡單,下了node-webkit的源碼,然後建了個helloword的工程,發現打不開,突然就想到tracing這個東西跟chrome有很強關係,於是用火狐打開trace2html生成的html發現打不開,應該就是隻有chrome能解析systrace的數據

html5的沒怎麼嘗試,因爲寫文件會寫到chrome的安裝目錄上的,無法寫到html文件所在的目錄(安全機制,這個限制是必須的),即使寫出來用法也很奇怪

建本地服務器,這個應該是可以的,感覺就複雜了點,而且流程太多也不好,容易出bug

重定向一開始以爲沒希望,到google查了一下還真有這個用法
用下面的命令可以將許多log包括控制檯的log輸出到錯誤輸出流上

google-chrome --enable-logging=stderr

很奇葩的是錯誤輸出流的重定向好像有點問題
象如下的代碼就輸出不了,以後還得研究下,

google-chrome --enable-logging=stderr $1 2>&1 | grep "\[Frame\]"  > log

後來用nodejs移植了tracing,主要用了vm.runInThisContext,來運行tracing的各個模塊,nodejs和javascript有好多不兼容多東西,坑死爹了.

改代碼時用到的一坨正則,匹配html中的js代碼

sed -n '/<script */,/<\/script>/p' base/base.js sed -e 'a#"progressMeter.update"#"}"#g' \
    -e 'i#"progressMeter.update"#"if(tr.silent == false) {"#g' \
    -e 's#"progressMeter.update"#"console.log"#g' tracing/importer/import.js

trace抓下來的數據是壓縮過的,用下面命令可解壓

zlib-flate -uncompress < trace >out

發現了一個極好多正則表達式

echo "asdfkjasldjkf\"shiner\"df" | sed 's/\(.*\)"\(.*\)"\(.*\)/\2/g'

開始port到windows上了,用的還是nodejs
因爲用到的同步執行命令要求node最新版,所以用下面的命令來安裝最新的工具

curl --silent --location https://deb.nodesource.com/setup_0.12 | sudo bash -

自動化打包的功能,先了解先 Node.js - Zip/Unzip a folder 只能說windows的cmd去屎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章