android.cts.jank.ui.CtsDeviceJankUi--testScrolling失敗原因總結和debug方法介紹

在Compatibility Test Package:com.android.cts.jank2 這個包裏面的android.cts.jank.ui.CtsDeviceJankUi--testScrolling測項,經常會遇到

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&#13;&#10;at java.lang.reflect.Method.invoke(Native Method)&#13;">
 <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的測試注意事項和流程方面入手分析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章