用了这个第三方库
https://github.com/ChromiumWebApps/chromium/tree/master/build/android/pylib
然后如下代码:
<span class="c"># -*- coding: utf8 -*-</span>
<span class="kn">import</span> <span class="nn">os</span><span class="o">,</span> <span class="nn">time</span><span class="c">#, sys</span>
<span class="kn">from</span> <span class="nn">pylib</span> <span class="kn">import</span> <span class="n">android_commands</span><span class="p">,</span> <span class="n">surface_stats_collector</span>
<span class="n">resultList</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">deviceText</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">popen</span><span class="p">(</span><span class="s">'adb devices'</span><span class="p">)</span>
<span class="n">textList</span> <span class="o">=</span> <span class="n">deviceText</span><span class="o">.</span><span class="n">readlines</span><span class="p">()</span>
<span class="n">deviceName</span> <span class="o">=</span> <span class="n">textList</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">adb</span> <span class="o">=</span> <span class="n">android_commands</span><span class="o">.</span><span class="n">AndroidCommands</span><span class="p">(</span><span class="n">deviceName</span><span class="p">)</span>
<span class="n">collector</span> <span class="o">=</span> <span class="n">surface_stats_collector</span><span class="o">.</span><span class="n">SurfaceStatsCollector</span><span class="p">(</span><span class="n">adb</span><span class="p">,</span> <span class="n">activityName</span><span class="p">,</span><span class="mf">0.5</span><span class="p">)</span>
<span class="n">collector</span><span class="o">.</span><span class="n">DisableWarningAboutEmptyData</span><span class="p">()</span>
<span class="n">collector</span><span class="o">.</span><span class="n">Start</span><span class="p">()</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">50</span><span class="p">):</span> <span class="c">#循环50次,主要方便自己的实现,其他实现方法请另行实现;</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.3</span><span class="p">)</span>
<span class="n">results</span> <span class="o">=</span> <span class="n">collector</span><span class="o">.</span><span class="n">SampleResults</span><span class="p">()</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">results</span><span class="p">:</span>
<span class="k">pass</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">resultList</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">results</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">value</span><span class="p">))</span>
<span class="n">results</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">print_str</span><span class="p">()</span>
<span class="n">collector</span><span class="o">.</span><span class="n">Stop</span><span class="p">()</span>
<span class="n">a</span> <span class="o">=</span> <span class="n">resultList</span><span class="p">[</span><span class="mi">3</span><span class="p">:</span><span class="o">-</span><span class="mi">3</span><span class="p">]</span>
<span class="k">print</span> <span class="s">u"平均值:"</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="nb">sum</span><span class="p">(</span><span class="n">a</span><span class="p">)</span><span class="o">/</span><span class="nb">len</span><span class="p">(</span><span class="n">a</span><span class="p">)))</span><span class="o">+</span><span class="s">u" ; 最小值:"</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="nb">min</span><span class="p">(</span><span class="n">a</span><span class="p">))</span>
代码写得不怎的,请无视。
运行上述脚本,在对应的activity操作,即可统计当前操作的fps值了。
跑一边看看:
看库的源码,原理是使用"adb shell dumpsys SurfaceFlinger --latency <window name>"进行循环统计实现的。
代码中有如下注释:
<span class="k">def</span> <span class="nf">_GetSurfaceFlingerFrameData</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="s">"""Returns collected SurfaceFlinger frame timing data.
Returns:
A tuple containing:
- The display's nominal refresh period in seconds.
- A list of timestamps signifying frame presentation times in seconds.
The return value may be (None, None) if there was no data collected (for
example, if the app was closed before the collector thread has finished).
"""</span>
<span class="c"># adb shell dumpsys SurfaceFlinger --latency <window name></span>
<span class="c"># prints some information about the last 128 frames displayed in</span>
<span class="c"># that window.</span>
<span class="c"># The data returned looks like this:</span>
<span class="c"># 16954612</span>
<span class="c"># 7657467895508 7657482691352 7657493499756</span>
<span class="c"># 7657484466553 7657499645964 7657511077881</span>
<span class="c"># 7657500793457 7657516600576 7657527404785</span>
<span class="c"># (...)</span>
<span class="c">#</span>
<span class="c"># The first line is the refresh period (here 16.95 ms), it is followed</span>
<span class="c"># by 128 lines w/ 3 timestamps in nanosecond each:</span>
<span class="c"># A) when the app started to draw</span>
<span class="c"># B) the vsync immediately preceding SF submitting the frame to the h/w</span>
<span class="c"># C) timestamp immediately after SF submitted that frame to the h/w</span>
<span class="c">#</span>
<span class="c"># The difference between the 1st and 3rd timestamp is the frame-latency.</span>
<span class="c"># An interesting data is when the frame latency crosses a refresh period</span>
<span class="c"># boundary, this can be calculated this way:</span>
<span class="c">#</span>
<span class="c"># ceil((C - A) / refresh-period)</span>
<span class="c">#</span>
<span class="c"># (each time the number above changes, we have a "jank").</span>
<span class="c"># If this happens a lot during an animation, the animation appears</span>
<span class="c"># janky, even if it runs at 60 fps in average.</span>
<span class="c">#</span>
<span class="c"># We use the special "SurfaceView" window name because the statistics for</span>
<span class="c"># the activity's main window are not updated when the main web content is</span>
<span class="c"># composited into a SurfaceView.</span>
<span class="n">results</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_adb</span><span class="o">.</span><span class="n">RunShellCommand</span><span class="p">(</span><span class="s">'dumpsys SurfaceFlinger --latency '</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">_activity</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">len</span><span class="p">(</span><span class="n">results</span><span class="p">):</span>
<span class="k">return</span> <span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
英语烂,脑容量有限,一直看不明白,有大神帮帮忙解析一下哈(原谅我伸手党)。