從騰訊隨身測(cè)GT源碼看APP流暢度測(cè)試方法

騰訊之前分享過一篇測(cè)試流暢度原理的文章(http://mp.weixin.qq.com/s?__biz=MzA3NTYzODYzMg==&mid=208258190&idx=2&sn=22af4f01a6090599da3dca4c44f0f396&scene=2&from=timeline&isappinstalled=0#rd)
GT給出了流暢度的概念,之前普遍認(rèn)為測(cè)試流暢度的值是FPS位喂,但是根據(jù)GT的說法,如果一個(gè)頁面在靜止時(shí),他的FTP為0,但此時(shí)不能說其是不流暢的奄容。所以GT給出了流暢度概念泽铛。

從代碼來看其流暢度值為60減去1s內(nèi)的跳幀數(shù)。

下面看看具體工具是怎么做的
流暢度測(cè)試核心文件如下:

com.tencent.wstt.gt.plugin.smtools.SMDataService.java
?com.tencent.wstt.gt.plugin.smtools.SMLogService.java??

GT獲取跳幀信息是通過Choreographer輸出的log信息獲取的如贷,SMLogService就是負(fù)責(zé)從logcat中篩選這部分log信息
一次完整的跳幀日志如下圖:


?

protected void onHandleIntent(Intent intent) {
        try {
            String str = intent.getStringExtra("pid");//獲取被測(cè)app的pid,用于過濾logcat輸出的日志到踏,找到被測(cè)app的日志
            int pid = Integer.parseInt(str);
            List<String> args = new ArrayList<String>(Arrays.asList("logcat", "-v", "time", "Choreographer:I", "*:S"));//過濾編舞者輸出的log
            dumpLogcatProcess = RuntimeHelper.exec(args);
            reader = new BufferedReader(new InputStreamReader(dumpLogcatProcess.getInputStream()), 8192);
            String line;
            while ((line = reader.readLine()) != null && !killed) {//循環(huán)讀取跳幀日志
                // filter "The application may be doing too much work on its main thread."
                if (!line.contains("uch work on its main t")) {//過濾出跳幀日志
                    continue;
                }
                int pID = LogLine.newLogLine(line, false).getProcessId();
                if (pID != pid){
                    continue;
                }
                line = line.substring(50, line.length() - 71);
                Integer value = Integer.parseInt(line.trim());
                SMServiceHelper.getInstance().dataQueue.offer(value);//把解析出的數(shù)值添加到一個(gè)阻塞列表里杠袱。
            }
        } catch (IOException e) {
            Log.e(TAG, e.toString() + "unexpected exception");
        } finally {
            killProcess();
        }
    }

同時(shí),另一個(gè)核心的類SMDataService就是負(fù)責(zé)處理這些數(shù)據(jù).
線程dataCountThread負(fù)責(zé)從列表取出跳幀數(shù)據(jù)并求和窝稿。

private Thread dataCountThread = new Thread("SMDataCountThread") {
        @Override
        public void run() {
            while (!pause)
            {
                try {
                    int value = SMServiceHelper.getInstance().dataQueue.take();
                    count.addAndGet(value);//使用AtomicInteger這個(gè)類進(jìn)行求和
                } catch (InterruptedException e) {
                    return;
                }
            }
        }
    };

在該service的onHandleIntent中執(zhí)行循環(huán)計(jì)算流暢度

       while (true) {
            if (pause) {
                break;
            }
            int x = count.getAndSet(0);
            // 卡頓大于60時(shí)楣富,要將之前幾次SM計(jì)數(shù)做修正
            if (x > 60) {
                int n = x / 60;
                int v = x % 60;
                TagTimeEntry tte = OpPerfBridge.getProfilerData(key);
                int len = tte.getRecordSize();
                // 補(bǔ)償參數(shù)
                int p = n;//Math.min(len, n);
                /*
                 * n > len是剛啟動(dòng)測(cè)試的情況,日志中的亡靈作祟伴榔,這種情況不做補(bǔ)償;
                 * 并且本次也記為60纹蝴。本邏輯在兩次測(cè)試間會(huì)清理數(shù)據(jù)的情況生效。
                 */
                if (n > len) 
                {
                    globalClient.setOutPara(key, 60);
                }
                else
                {
                    for (int i = 0; i < p; i++) {
                        TimeEntry te = tte.getRecord(len - 1 - i);
                        te.reduce = 0;
                    }
                    globalClient.setOutPara(key, v);
                }
            } else {
                int sm = 60 - x;//正常情況下的流暢度值
                globalClient.setOutPara(key, sm);
            }

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

整個(gè)工具的實(shí)現(xiàn)并不復(fù)雜踪少,貴在提出了流暢度的概念塘安,做測(cè)試開發(fā)就是要通過谷歌提供的工具加上對(duì)原理實(shí)現(xiàn)的理解做出符合項(xiàng)目需求的工作。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末援奢,一起剝皮案震驚了整個(gè)濱河市兼犯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌集漾,老刑警劉巖切黔,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異具篇,居然都是意外死亡纬霞,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門驱显,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诗芜,“玉大人,你說我怎么就攤上這事埃疫》郑” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵熔恢,是天一觀的道長(zhǎng)脐湾。 經(jīng)常有香客問我臭笆,道長(zhǎng)叙淌,這世上最難降的妖魔是什么秤掌? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮鹰霍,結(jié)果婚禮上闻鉴,老公的妹妹穿的比我還像新娘。我一直安慰自己茂洒,他們只是感情好孟岛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著督勺,像睡著了一般渠羞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上智哀,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天次询,我揣著相機(jī)與錄音,去河邊找鬼瓷叫。 笑死屯吊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的摹菠。 我是一名探鬼主播盒卸,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼次氨!你這毒婦竟也來了蔽介?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤煮寡,失蹤者是張志新(化名)和其女友劉穎屉佳,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洲押,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡武花,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了杈帐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片体箕。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖挑童,靈堂內(nèi)的尸體忽然破棺而出累铅,到底是詐尸還是另有隱情,我是刑警寧澤站叼,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布娃兽,位于F島的核電站,受9級(jí)特大地震影響尽楔,放射性物質(zhì)發(fā)生泄漏投储。R本人自食惡果不足惜第练,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望玛荞。 院中可真熱鬧娇掏,春花似錦、人聲如沸勋眯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽客蹋。三九已至塞蹭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間讶坯,已是汗流浹背浮还。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留闽巩,地道東北人钧舌。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像涎跨,于是被迫代替她去往敵國和親洼冻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容