Java中CTS的含义,CTS问题分析8

CTS/GTS问题分析8

今天发现一个初始设置错误可能导致的CTS问题,进行下记录

问题初探

测试命令: run cts -m CtsServicesHostTestCases -t android.server.cts.ActivityManagerDockedStackTests#testDockedStackToMinimizeWhenUnlocked

在host log中报错如下:

junit.framework.AssertionFailedError

at junit.framework.Assert.fail(Assert.java:55)

at junit.framework.Assert.assertTrue(Assert.java:22)

at junit.framework.Assert.assertTrue(Assert.java:31)

at junit.framework.TestCase.assertTrue(TestCase.java:201)

at android.server.cts.ActivityManagerDockedStackTests.assertDockMinimized(ActivityManagerDockedStackTests.java:559)

at android.server.cts.ActivityManagerDockedStackTests.testDockedStackToMinimizeWhenUnlocked(ActivityManagerDockedStackTests.java:438)

case的大致流程是:

启动TestActivity,将TestActivity放到stack 3,灭屏,重新点亮屏幕,观察当前window状态 (dumpsys window -a ) ,若mMinimizedDock = true,则case pass,否则fail

看了下bugreport中的event log,如下:

10-23 21:41:13.636 1000 1523 1523 I screen_toggled: 1

10-23 21:41:13.636 1000 1523 1523 I power_screen_broadcast_send: 1

10-23 21:41:13.637 1000 1523 1629 I am_set_resumed_activity: [0,android.server.cts/.TestActivity,resumeTopActivityInnerLocked]

10-23 21:41:13.640 1000 1523 1629 I am_resume_activity: [9521,113644122,55,android.server.cts/.TestActivity]

10-23 21:41:13.678 10157 9521 9521 I am_on_resume_called: [0,android.server.cts.TestActivity,RESUME_ACTIVITY]

10-23 21:41:13.682 1000 1523 1611 I am_pss : [6167,10012,com.android.defcontainer,4247552,3424256,0]

10-23 21:41:13.714 1000 1523 1523 I power_screen_broadcast_done: [1,78,1]

10-23 21:41:13.825 1000 1523 1629 I sysui_multi_action: [757,198,758,1,759,0,793,205]

10-23 21:41:13.825 1000 1523 1629 I power_screen_state: [1,0,0,0,205]

10-23 21:41:14.319 1000 1523 2988 I am_uid_stopped: 10157

10-23 21:41:14.319 1000 1523 2988 I am_kill : [0,9521,android.server.cts,0,stop android.server.cts: from process:9660]

10-23 21:41:14.321 1000 1523 2988 I am_finish_activity: [0,113644122,55,android.server.cts/.TestActivity,proc died without state saved]

重新亮屏时并没有发现异常的event log,说明就是mMinimizedDock这个值为false导致的错误,先转给分屏看了下,发现关闭Skip Screen lock测试即可通过;因此分屏没有继续看下去,但是这其实是不符合正常的CTS测试设置的,因此还是有继续调研的必要。

问题分析

发现mMinimizedDock这个值可以等价于DividerView的mDockedStackMinimized属性,DividerView是分屏时中间的分割符,这样就可以将问题定位到DividerView的变化,其是由DockedStackDividerController控制的;因此,我们在其中的notifyDockedStackMinimizedChanged中打出调用栈

private void notifyDockedStackMinimizedChanged(boolean minimizedDock, boolean animate,

boolean isHomeStackResizable) {

RuntimeException e1 = new RuntimeException();

e1.fillInStackTrace();

e1.printStackTrace();

...

}

然后重新打包复现,可以发现如下log:

手机灭屏时关键log:

10-25 14:17:34.328 1605 2091 W BaseMiuiPhoneWindowManager: keyCode:26 down:true eventTime:12643277 downTime:12643277 policyFlags:22000000 flags:8 deviceId:5 isScreenOn:true keyguardActive:false repeatCount:0

10-25 14:17:34.434 1605 2091 W BaseMiuiPhoneWindowManager: keyCode:26 down:false eventTime:12643384 downTime:12643277 policyFlags:22000000 flags:8 deviceId:5 isScreenOn:true keyguardActive:false repeatCount:0

10-25 14:17:34.435 1605 1605 I WindowManager: Started going to sleep... (why=2)

10-25 14:17:34.762 1605 1709 I DisplayPowerController: Blocking screen off

10-25 14:17:34.776 1605 1709 I DisplayPowerController: Unblocked screen off after 14 ms

10-25 14:17:34.777 1605 1709 I WindowManager: Screen turned off...

10-25 14:17:35.319 1605 2453 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 cmp=com.miui.home/.launcher.Launcher} from uid 1000

10-25 14:17:35.324 1605 2453 D ActivityTrigger: activityResumeTrigger: The activity in ApplicationInfo{da4a56d com.miui.home} is now in focus and seems to be in full-screen mode

10-25 14:17:35.324 1605 2453 E ActivityTrigger: activityResumeTrigger: not whiteListedcom.miui.home/com.miui.home.launcher.Launcher/4063011

10-25 14:17:35.326 1605 2453 W System.err: java.lang.RuntimeException

10-25 14:17:35.326 1605 2453 W System.err: at com.android.server.wm.DockedStackDividerController.notifyDockedStackMinimizedChanged(DockedStackDividerController.java:481)

10-25 14:17:35.326 1605 2453 W System.err: at com.android.server.wm.DockedStackDividerController.setMinimizedDockedStack(DockedStackDividerController.java:808)

10-25 14:17:35.326 1605 2453 W System.err: at com.android.server.wm.DockedStackDividerController.setMinimizedDockedStack(DockedStackDividerController.java:700)

10-25 14:17:35.326 1605 2453 W System.err: at com.android.server.wm.DockedStackDividerController.checkMinimizeChanged(DockedStackDividerController.java:665)

10-25 14:17:35.326 1605 2453 W System.err: at com.android.server.wm.DockedStackDividerController.notifyAppVisibilityChanged(DockedStackDividerController.java:580)

10-25 14:17:35.326 1605 2453 W System.err: at com.android.server.wm.AppWindowToken.setVisibility(AppWindowToken.java:457)

10-25 14:17:35.326 1605 2453 W System.err: at com.android.server.wm.AppWindowContainerController.setVisibility(AppWindowContainerController.java:461)

10-25 14:17:35.326 1605 2453 W System.err: at com.android.server.am.ActivityRecord.setVisibility(ActivityRecord.java:1780)

10-25 14:17:35.326 1605 2453 W System.err: at com.android.server.am.ActivityStack.resumeTopActivityInnerLocked(ActivityStack.java:2756)

10-25 14:17:35.326 1605 2453 W System.err: at com.android.server.am.ActivityStack.resumeTopActivityUncheckedLocked(ActivityStack.java:2350)

10-25 14:17:35.326 1605 2453 W System.err: at com.android.server.am.ActivityStackSupervisor.resumeFocusedStackTopActivityLocked(ActivityStackSupervisor.java:2190)

10-25 14:17:35.326 1605 2453 W System.err: at com.android.server.am.ActivityStackSupervisor.resumeFocusedStackTopActivityLocked(ActivityStackSupervisor.java:2151)

10-25 14:17:35.326 1605 2453 W System.err: at com.android.server.am.ActivityStack.moveTaskToFrontLocked(ActivityStack.java:4872)

10-25 14:17:35.326 1605 2453 W System.err: at com.android.server.am.ActivityStarter.setTargetStackAndMoveToFrontIfNeeded(ActivityStarter.java:1785)

10-25 14:17:35.326 1605 2453 W System.err: at com.android.server.am.ActivityStarter.startActivityUnchecked(ActivityStarter.java:1246)

10-25 14:17:35.327 1605 2453 W System.err: at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:1121)

10-25 14:17:35.327 1605 2453 W System.err: at com.android.server.am.ActivityStarter.startActivity(ActivityStarter.java:630)

10-25 14:17:35.327 1605 2453 W System.err: at com.android.server.am.ActivityStarter.startActivityLocked(ActivityStarter.java:278)

10-25 14:17:35.327 1605 2453 W System.err: at com.android.server.am.ActivityStarter.startActivityMayWait(ActivityStarter.java:936)

10-25 14:17:35.327 1605 2453 W System.err: at com.android.server.am.ActivityManagerService.startActivityAsUser(ActivityManagerService.java:4722)

10-25 14:17:35.327 1605 2453 W System.err: at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:2314)

10-25 14:17:35.327 1605 2453 W System.err: at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:3049)

10-25 14:17:35.327 1605 2453 W System.err: at android.os.Binder.execTransact(Binder.java:681)

10-25 14:17:35.327 2461 3254 D Divider : onDockedStackMinimizedChanged minimized=true animDuration=0

可以看到,这里会进行最小化的操作,也就是说到灭屏前是完全没问题的,那么我们将重点放在灭屏后

然后对比正常日志,

10-25 16:28:33.764 1605 2493 W ActivityManager: Force removing ActivityRecord{d37a66f u0 android.server.cts/.TestActivity t59}: app died, no saved state

10-25 16:28:33.788 2461 3254 D Divider : onDockedStackMinimizedChanged minimized=false animDuration=0

10-25 16:28:33.802 2461 3254 D Divider : onDividerVisibilityChanged visible=false

10-25 16:28:33.836 2461 2461 D EventBus: [2461, u0] -> DividerView [0x284c897, P1] onBusEvent(MultiWindowStateChangedEvent)

异常日志:

10-25 09:46:49.264 2461 4530 D Divider : onDockedStackMinimizedChanged minimized=false animDuration=250

10-25 09:46:49.934 1605 3297 W ActivityManager: Force removing ActivityRecord{c57c476 u0 android.server.cts/.TestActivity t17}: app died, no saved state

10-25 09:46:49.947 2461 2480 D Divider : onDockedStackExistsChanged exists=false

10-25 09:46:49.964 2461 2480 D Divider : onDividerVisibilityChanged visible=false

10-25 09:46:49.977 2461 2461 D EventBus: [2461, u0] -> DividerView [0x284c897, P1] onBusEvent(MultiWindowStateChangedEvent)

正常日志是将测试进程force-stop后再进行销毁工作,DividerView最小化,然后销毁;异常日志是DividerView最小化在前面执行,导致case fail;

然后我们仔细观察异常log,就可以看出原因:

首先,亮屏后(执行菜单键),可以看到提前最小化的栈在

10-25 09:46:49.160 1605 5703 W BaseMiuiPhoneWindowManager: keyCode:82 down:true eventTime:846050 downTime:846050 policyFlags:2b000000 flags:0 deviceId:-1 isScreenOn:true keyguardActive:false repeatCount:0

10-25 09:46:49.162 14122 14122 I Input : injectKeyEvent: KeyEvent { action=ACTION_UP, keyCode=KEYCODE_MENU, scanCode=0, metaState=0, flags=0x0, repeatCount=0, eventTime=846050, downTime=846050, deviceId=-1, source=0x101 }

10-25 09:46:49.162 1605 5703 W BaseMiuiPhoneWindowManager: keyCode:82 down:false eventTime:846050 downTime:846050 policyFlags:2b000000 flags:0 deviceId:-1 isScreenOn:true keyguardActive:false repeatCount:0

10-25 09:46:49.182 2461 2461 D RecentsImpl: startRecentsActivity runningTask: ComponentInfo{com.miui.home/com.miui.home.launcher.Launcher}

10-25 09:46:49.262 1605 2074 W System.err: java.lang.RuntimeException

10-25 09:46:49.262 1605 2074 W System.err: at com.android.server.wm.DockedStackDividerController.notifyDockedStackMinimizedChanged(DockedStackDividerController.java:481)

10-25 09:46:49.262 1605 2074 W System.err: at com.android.server.wm.DockedStackDividerController.animateForMinimizedDockedStack(DockedStackDividerController.java:862)

10-25 09:46:49.262 1605 2074 W System.err: at com.android.server.wm.DockedStackDividerController.animate(DockedStackDividerController.java:821)

10-25 09:46:49.262 1605 2074 W System.err: at com.android.server.wm.WindowAnimator.animate(WindowAnimator.java:250)

10-25 09:46:49.262 1605 2074 W System.err: at com.android.server.wm.WindowAnimator.lambda$-com_android_server_wm_WindowAnimator_4083(WindowAnimator.java:109)

10-25 09:46:49.262 1605 2074 W System.err: at com.android.server.wm.-$Lambda$OQfQhd_xsxt9hoLAjIbVfOwa-jY.$m$0(Unknown Source:4)

10-25 09:46:49.262 1605 2074 W System.err: at com.android.server.wm.-$Lambda$OQfQhd_xsxt9hoLAjIbVfOwa-jY.doFrame(Unknown Source:0)

10-25 09:46:49.262 1605 2074 W System.err: at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1024)

10-25 09:46:49.262 1605 2074 W System.err: at android.view.Choreographer.doCallbacks(Choreographer.java:838)

10-25 09:46:49.262 1605 2074 W System.err: at android.view.Choreographer.doFrame(Choreographer.java:766)

10-25 09:46:49.262 1605 2074 W System.err: at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1012)

10-25 09:46:49.262 1605 2074 W System.err: at android.os.Handler.handleCallback(Handler.java:792)

10-25 09:46:49.262 1605 2074 W System.err: at android.os.Handler.dispatchMessage(Handler.java:98)

10-25 09:46:49.262 1605 2074 W System.err: at android.os.Looper.loop(Looper.java:176)

10-25 09:46:49.262 1605 2074 W System.err: at android.os.HandlerThread.run(HandlerThread.java:65)

10-25 09:46:49.262 1605 2074 W System.err: at com.android.server.ServiceThread.run(ServiceThread.java:46)

10-25 09:46:49.262 4260 4532 D PowerKeeper: PowerStateMachine:onDockedStackMinimizedChanged minimized=false

10-25 09:46:49.262 4260 4356 D PowerKeeper: PowerStateMachine:EVENT_ID_MULTI_SCREEN_MINIMIZED mIsMultiScreenMinimized=false

10-25 09:46:49.264 2461 4530 D Divider : onDockedStackMinimizedChanged minimized=false animDuration=250

是执行DockedStackDividerController.animate操作导致的最小化,在往前看看,找到原因了

10-25 09:46:49.215 2461 2461 D EventBus: [2461, u0] -> DividerView [0x284c897, P1] onBusEvent(RecentsActivityStartingEvent)

10-25 09:46:49.215 2461 2461 D EventBus: [2461, u0] onBusEvent(RecentsActivityStartingEvent) duration: 131 microseconds, avg: 71

10-25 09:46:49.215 1605 2091 I InputReader: Reconfiguring input devices. changes=0x00000004

1144 public final void onBusEvent(RecentsDrawnEvent drawnEvent) {

1145 if (mState.animateAfterRecentsDrawn) {

1146 mState.animateAfterRecentsDrawn = false;

1147 updateDockSide();

1148

1149 mHandler.post(() -> {

1150 // Delay switching resizing mode because this might cause jank in recents animation

1151 // that's longer than this animation.

1152 stopDragging(getCurrentPosition(), mSnapAlgorithm.getMiddleTarget(),

1153 mLongPressEntraceAnimDuration, Interpolators.FAST_OUT_SLOW_IN,

1154 200 /* endDelay */);

1155 });

1156 }

1157 if (mState.growAfterRecentsDrawn) {

1158 mState.growAfterRecentsDrawn = false;

1159 updateDockSide();

1160 EventBus.getDefault().send(new RecentsGrowingEvent());

1161 stopDragging(getCurrentPosition(), mSnapAlgorithm.getMiddleTarget(), 336,

1162 Interpolators.FAST_OUT_SLOW_IN);

1163 }

1164 }

10-25 09:46:49.258 2461 2461 D EventBus: [2461, u0] -> DividerView [0x284c897, P1] onBusEvent(RecentsDrawnEvent)

10-25 09:46:49.259 2461 2461 D EventBus: [2461, u0] onBusEvent(RecentsDrawnEvent) duration: 8 microseconds, avg: 68

407 public void stopDragging(int position, float velocity, boolean avoidDismissStart,

408 boolean logMetrics) {

409 mHandle.setTouching(false, true /* animate */);

410 fling(position, velocity, avoidDismissStart, logMetrics);

411 mWindowManager.setSlippery(true);

412 releaseBackground();

413 }

可以很明显的看到,DividerView会执行一个滑动操作,那么应该会执行到animate,将状态从最小化状态还原。而我们MIUI默认将menu菜单键的功能设置为最近任务功能,怀疑是没有设置正确导致的问题

那么我们可以将Skip Screen lock开关打开来测试了,将菜单键置为本来功能,发现case果然pass;这里我们也可以看到为什么Skip Screen lock开关关闭也能过了,因为一直没有解锁,导致DividerView没有走后面的还原过程,虽然case也是pass的,但是这其实不符合case本身的用意

问题总结

问题本身不难,但是这样无用的分析是浪费资源的

1.再次强调,让所有测试都明确测试配置

2.建议维护一个wiki,维护没有正确设置可能造成的问题,防止这种情况再次发生,做无用的分析

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值