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的測試注意事項和流程方面入手分析