Android帧率测试

Android帧率测试

SurfaceFlinger

SurfaceFlinger 是 Android 的一个服务,运行在 Android 的System 进程中,负责管理系统的帧缓冲区,绘制应用程序的UI。Android应用程序会请求SurfaceFlinger服务创建Surface,在上面绘制自己的UI,然后将这个已经绘制好了UI的Surface渲染到设备显示屏上去

清空缓存

$ adb shell dumpsys SurfaceFlinger --latency-clear
[void android::SurfaceFlinger::setMTKProperties(android::String8&)]
========================================================================
[AOSP part]
   debug.sf.showupdates (mDebugRegion): 0
   debug.sf.ddms (mDebugDDMS): 0
[MTK SF part]
   debug.sf.busyswap (mBusySwap): 0
   debug.sf.log_repaint (mLogRepaint): 0
   debug.sf.log_buffer (mLogBuffer): 0
   debug.sf.line_g3d (mLineG3D): 0
   debug.sf.line_ss (mLineScreenShot): 0
   debug.sf.dump_ss (mDumpScreenShot): 0
   debug.sf.slowmotion (mDelayTime): 0
   debug.sf.contbufsenable (mContBufsDump): 0
[MTK GUI part]
   debug.bq.line: 0
   debug.st.line: 0
[MTK HWC part]
   debug.sf.line_ovl: 0
   debug.sf.debug_oex: 0
========================================================================

获取可视窗口列表

$ adb shell dumpsys SurfaceFlinger --list

[void android::SurfaceFlinger::setMTKProperties(android::String8&)]
========================================================================
[AOSP part]
   debug.sf.showupdates (mDebugRegion): 0
   debug.sf.ddms (mDebugDDMS): 0
[MTK SF part]
   debug.sf.busyswap (mBusySwap): 0
   debug.sf.log_repaint (mLogRepaint): 0
   debug.sf.log_buffer (mLogBuffer): 0
   debug.sf.line_g3d (mLineG3D): 0
   debug.sf.line_ss (mLineScreenShot): 0
   debug.sf.dump_ss (mDumpScreenShot): 0
   debug.sf.slowmotion (mDelayTime): 0
   debug.sf.contbufsenable (mContBufsDump): 0
[MTK GUI part]
   debug.bq.line: 0
   debug.st.line: 0
[MTK HWC part]
   debug.sf.line_ovl: 0
   debug.sf.debug_oex: 0
========================================================================

DimSurface
com.android.systemui.ImageWallpaper
com.tmall.wireless/com.tmall.wireless.maintab.module.TMMainTabActivity
com.tmall.wireless/com.tmall.wireless.module.category.TMNewCategoryActivity
com.tmall.wireless/com.tmall.wireless.module.search.searchResult.TMSearchResultActivity
DimAnimator
StatusBar

越下面的窗口,越在上层。如我要找天猫打开的Activity, 就取得包名为 com.tmall.wireless 的最后一条数据 xxx.TMSearchResultActivity

获取窗口的帧延时数据

$ adb shell dumpsys SurfaceFlinger --latency com.tmall.wireless/com.tmall.wireless.module.search.searchResult.TMSearchResultActivity

[void android::SurfaceFlinger::setMTKProperties(android::String8&)]
========================================================================
[AOSP part]
   debug.sf.showupdates (mDebugRegion): 0
   debug.sf.ddms (mDebugDDMS): 0
[MTK SF part]
   debug.sf.busyswap (mBusySwap): 0
   debug.sf.log_repaint (mLogRepaint): 0
   debug.sf.log_buffer (mLogBuffer): 0
   debug.sf.line_g3d (mLineG3D): 0
   debug.sf.line_ss (mLineScreenShot): 0
   debug.sf.dump_ss (mDumpScreenShot): 0
   debug.sf.slowmotion (mDelayTime): 0
   debug.sf.contbufsenable (mContBufsDump): 0
[MTK GUI part]
   debug.bq.line: 0
   debug.st.line: 0
[MTK HWC part]
   debug.sf.line_ovl: 0
   debug.sf.debug_oex: 0
========================================================================

17340038
1812193316205 1812209665589 1812210614128
1812212222282 1812227121282 1812227918128
1812239753051 1812261917205 1812262521667
1812273201051 1812296490820 1812297217743
...
...
1815880321744 1815896512436 1815897669128
1815897796051 1815913973205 1815915028282
1815915093359 1815931327974 1815932468974
1815933351974 1815948728436 1815949869743

latency 帧率数据说明

说明:

刷新频率: 17340038

1 18121933162051812209665589 1812210614128

2 18122122222821812227121282 1812227918128

3 18122397530511812261917205 1812262521667

127 18159150933591815931327974 1815932468974

128 18159333519741815948728436 1815949869743

The first line currently contains the refresh period in nanosecond.

第一行是刷新频率,后面有128行,每行3个时间戳。

Each 128 following line contains 3 timestamps, of respectively the app draw time , the vsync timestamp just prior the call to set and the timestamp of the call to set.

在 /Users/army/JavaDev/adt_20140702/sdk/sources/android-xx/com/android/uiautomator/platform/SurfaceFlingerHelper.java 中包含 frame rate 的计算方法:

    /**
     * Calculate frame rate
     * @return
     */
    public static double getFrameRate() {
        if (mRefreshPeriod < 0) {
            log("Run command \"" + FRAME_LATENCY_CMD + " \" before calcuating average frame rate");
            return -1.0;
        }
        if (mFrameBufferData.get(0) == null) {
            log("Run command \"" + FRAME_LATENCY_CMD + " \" before retrieving frame buffer data");
            return -1.0;
        }
        long startTime = Long.parseLong(mFrameBufferData.get(0).get(1));
        long endTime =  Long.parseLong(mFrameBufferData.get(mFrameLatencySampleSize - 1).get(1));
        long totalDuration = endTime - startTime;
        return (double)((mFrameLatencySampleSize - 1) * Math.pow(10, 9))/totalDuration;
    }

dumpsys gfxinfo

在开发者选项中有个“ GPU呈现模式分析(Profile GPU rendering,计算adb shell dumpsys gfxinfo中的呈现时间)”功能,在开启这个功能后,系统就会记录保留每个界面最后128帧图像绘制的相关时间信息。在开启这个功能后,重新启动APP,滑动页面然后执行adb命令。

$ adb shell dumpsys gfxinfo com.tmall.wireless

Applications Graphics Acceleration Info:
Uptime: 386315 Realtime: 386308

** Graphics info for pid 4887 [com.tmall.wireless] **

Recent DisplayList operations
             ClipRect
             DrawText
             RestoreToCount
     RestoreToCount
   DrawPatch
 RestoreToCount
DrawRect
DrawPath
DrawBitmap
DrawText
...
multiDraw
 DrawText
DrawPatch
DrawBitmap
DrawBitmapRect
DrawRect
DrawOval
...
multiDraw
 DrawText
DrawPatch

Caches:
Current memory usage / total memory usage (bytes):
 TextureCache         15078192 / 25165824
 LayerCache             311296 / 16777216
 RenderBufferCache           0 /  2097152
 GradientCache            4096 /   524288
 PathCache             1781076 / 10485760
 TextDropShadowCache         0 /  2097152
 FontRenderer 0         524288 /   524288
Other:
 FboCache                    1 /       16
 PatchCache                  3 /      512
Total memory usage:
 17698948 bytes, 16.88 MB

Profile data in ms:

com.tmall.wireless/com.tmall.wireless.module.search.searchResult.TMSearchResultActivity/android.view.ViewRootImpl@42f81df0
Draw ProcessExecute
1.11 2.490.43
1.26 2.890.63
1.85 4.620.65
1.72 4.163.56
1.88 3.150.46
2.67 2.680.45
1.22 2.670.58
1.22 2.810.42
1.74 2.250.38
102.77 10.32 0.52
2.48 5.480.53
2.19 4.990.56
2.10 4.770.50
1.10 2.550.40
2.26 4.040.47
...

View hierarchy:

 com.tmall.wireless/com.tmall.wireless.maintab.module.TMMainTabActivity/android.view.ViewRootImpl@42d08ee8
 138 views, 62.20 kB of display lists, 1637 frames rendered

 com.tmall.wireless/com.tmall.wireless.module.search.searchResult.TMSearchResultActivity/android.view.ViewRootImpl@42f81df0
 420 views, 82.98 kB of display lists, 862 frames rendered

Total ViewRootImpl: 2
Total Views:        558
Total DisplayList:  145.18 kB

Draw:表示在Java中创建显示列表部分中,OnDraw()方法占用的时间。

Process:表示渲染引擎执行显示列表所花的时间,view越多,时间就越长

Execute:表示把一帧数据发送到屏幕上排版显示实际花费的时间。其实是实际显示帧数据的后台缓存区与前台缓冲区交换后并将前台缓冲区的内容显示到屏幕上的时间。

Draw + Process + Execute = 完整显示一帧 ,这个时间要小于16ms才能保存每秒60帧。

取得数据后,复制到excel中生成堆积柱状图.

图中可以清晰的看出在滑动时,耗时明显有很多帧超过16ms。这些都是需要结合操作进行优化的。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 21:01:42

Android帧率测试的相关文章

android junit 测试 简要步骤

android junit 测试 1.新建一个类继承TestCase这个类 2.AndroidManifest.xml, 加入<uses-library android:name="android.test.runner" /> <!-- 记住这个一要放在application外面,不然会出现配置错误 信息 -->      <instrumentation android:name="android.test.InstrumentationTe

Android兼容性测试框架(CTS)手册

了解老码农个人隐私,请看这里:http://www.koulianbing.com/?page_id=12 本文翻译自Android官方的CTS手册android-cts-manual-r4.pdf Android兼容性测试框架手册 1.为什么需要兼容性测试(以下称CTS)? 1.1.让APP提供更好的用户体验.用户可以选择更多的适合自己设备的APP.让APP更稳定. 1.2.让开发者设计更高质量的APP. 1.3.通过CTS的设备可以运行Androidmarket. 另外,CTS是免费的,而且

Android应用测试指南

一.Android 的 SDK Windows 版本安装 按顺序安装以下内容 1.    安装JDK(Java Development Kit, 即Java开发工具包) 2. 安装Eclipse 集成开发环境 3.    安装SDK(Software Development Kit, 即软件开发工具包) 4.    安装ADT(Android Development Tools)插件 二.Android模拟机运行 打开Eclipse,如下图操作: 再进入AVD Manager,创建模拟机 模拟器

Android Logcat测试

Android Logcat测试

Android ui 测试课堂笔记

开始接触Android ui测试了,笔记如下 模拟器 Genemotion , the fastest android simulator in the world Android ui 测试工具 Selendroid

Google+ 团队的 Android UI 测试

https://github.com/bboyfeiyu/android-tech-frontier/tree/master/android-blog/Google%2B%20%E5%9B%A2%E9%98%9F%E7%9A%84%20Android%20UI%20%E6%B5%8B%E8%AF%95 Google+ 团队的 Android UI 测试 原文链接:How the Google+ Team Tests Mobile Apps 译者:allenlsy 译者博文地址:http://al

Android Junit测试框架的配置

instrumentation指令集需要在manifest节点下 <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.example.junittest" /> uses-library 需要在application节点下 <uses-library android:name="android.t

Android开源测试框架学习

近期因工作需要,分析了一些Android的测试框架,在这也分享下整理完的资料. Android测试大致分三大块: 代码层测试 用户操作模拟,功能测试 安装部署及稳定性测试 代码层测试 对于一般java代码,采用传统的Junit测试,开发人员通常会编写重要接口和函数的白盒测试代码,不做过多讨论. 但因Android的特殊运行机制(Dalvik虚拟机),其中存在Application.Activity.Service等特殊组件,而这些组件都涉及到生命周期管理的问题. 为了对这些组件进行测试,Goog

监听Android CTS测试项解决方案(一)

前言: 首先这里需要详细叙述一下标题中"监听Android CTS测试项解决方案"的需求.这里的需求是指我们需要精确的监听到当前CTS测试正在测试的测试项. 因为我们知道CTS认证是获得Google推出的 Android 系统中 Android Market 服务的前提.CTS 兼容性测试的主要目的和意义在于使得用户在 Android 系统的应用过程中,有更好的用户体验,并展现出 Android 系统的优越特性:使得 Android 应用程序编写者更容易编写高质量的应用程序:充分展现