junit.framework.AssertionFailedError: Too few frames received. Monitor: WindowContentFrameStatsMonitorImpl, Expected: 50, Received: xxx. at junit.framework.Assert.fail(Assert.java:50)
上面的xxx,有的时候是一个小于50的数字,有的时候是0
这个cts 测项的过程和目的是:
在/cts/suite/cts/deviceTests/jank2/src/android/cts/jank/ui/CtsDeviceJankUi.java中启动 com.android.cts.ui/com.android.cts.ui.ScrollingActivity这个activity,然后模拟scroll down滑动list列表,
在list列表滑动动画过程中,统计2s内更新的帧数,是否达到50帧,若未达到50帧则fail
下面介绍这个cts fail的通常原因,还有对应的debug手法
android.cts.jank.ui.CtsDeviceJankUi--testScrolling测项 fail的原因通常有如下几种原因
1.收到的frame count 小于或接近50,如46这样的数字
=>fail原因:滑动listview的时候,因为view system和listview滑动相关的参数被修改了,导致滑动的性能受到影响
=>debug手法:
1)请检查如下2支文件相比于原始版本,做了哪些改动
frameworks/base / core/java/android/view/ViewConfiguration.java 文件中,通常关注 private static final float SCROLL_FRICTION
frameworks/base / core/java/android/widget/AbsListView.java 文件中,通常关注 private float mVelocityScale
除了上述列出通常关注的两个变量外,其他变量也都要关注,看做了哪些改动
2)请检查LCM 刷新率是否达标?系统performance是否受到影响而降低?=>可观察手机通常的使用场景下,UI刷新是否卡顿,若有要先解决系统performance低的问题
2.收到的frame count为0,Received: 0
=>fail原因:cts 模拟scroll down后,由于客户客制化原因,使得画面更新的区域并不在listview的区域内,导致并未收到listview更新的任何帧,故fail
=>debug手法:
1)请确认手机是否有硬体按键?检查是否有对Navigationbar的显示做过客制化?若有,请恢复成原始设计
2)若对第1)条未做改动,那么需要在eng或userdebug版本上,adb命令打开debug开关,查看为何没有更新listview所在区域?
需要打开的debug开关如下:
adb shell setprop debug.viewroot.enable e0002
adb shell setprop debug.listview.dumpinfo 1111111
adb shell "stop;start"
然后抓取cts test fail的完整mtklog来分析
分析的时候,主要在com.android.cts.ui.ScrollingActivit的进程中search 如下这样的关键log:
01-01 05:29:46.945 13767 13767 V ViewRootImpl: Invalidate child: Rect(0, 1140 - 720, 1184),this = ViewRoot{e5c0e9b com.android.cts.ui/com.android.cts.ui.ScrollingActivity,ident = 0}
然后观察下面画面刷新的callstack是由谁触发的
01-01 05:29:46.945 13767 13767 V ViewRootImpl: java.lang.Throwable: invalidateChildInParent
01-01 05:29:46.945 13767 13767 V ViewRootImpl: at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:1109)
cts 所跑的时间段可以通过如下log来确认:
TestRunner: started: testScrolling(android.cts.jank.ui.CtsDeviceJankUi)
TestRunner: finished: testScrolling(android.cts.jank.ui.CtsDeviceJankUi)
3.cts fail的log与frame count无关
例如下面的fail log:
<FailedScene message="java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Native Method) ">
<StackTrace>java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at android.support.test.jank.JankTestBase.runTest(JankTestBase.java:116)
at junit.framework.TestCase.runBare(TestCase.java:134)
at junit.framework.TestResult$1.protect(TestResult.java:115)
at android.support.test.internal.runner.junit3.AndroidTestResult.runProtected(AndroidTestResult.java:77)
at junit.framework.TestResult.run(TestResult.java:118)
at android.support.test.internal.runner.junit3.AndroidTestResult.run(AndroidTestResult.java:55)
at junit.framework.TestCase.run(TestCase.java:124)
at android.support.test.internal.runner.junit3.NonLeakyTestSuite$NonLeakyTest.run(NonLeakyTestSuite.java:63)
at android.support.test.internal.runner.junit3.AndroidTestSuite$1.run(AndroidTestSuite.java:98)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.support.test.uiautomator.UiObject2.fling(android.support.test.uiautomator.Direction)' on a null object reference
at android.cts.jank.ui.CtsDeviceJankUi.testScrolling(CtsDeviceJankUi.java:58)
... 15 more
</StackTrace>
=>fail原因:不明原因的客制化引起cts的测试过程出错,还未跑入该项具体的cts test 流程
=>debug手法:
1)先check view system的几支主要文件是否做过改,然后再请cts framework的人做进一步做分析,因为该结果显示TestRunner都没跑起来
/frameworks/base/core/java/android/view/View.java
/frameworks/base/core/java/android/view/ViewGroup.java
/frameworks/base/core/java/android/view/ViewRootImpl.java
2)再检查是否只有这一项cts test fail?根据这种fail log,应该是有非常多的test都会fail,需要从cts test的测试注意事项和流程方面入手分析