CTS/GTS问题分析5 | weiinter105

问题初探

测试命令:

run cts -m CtsDevicePolicyManagerTestCases -t com.android.cts.devicepolicy.MixedManagedProfileOwnerTestApi25#testResetPasswordFbe

错误有两种情况,一种是直接进入系统桌面,一种是起一个测试case中的空白activity,经过分析,两者都是同一个原因造成的。因此以任一种情况举例。报错堆栈如下:


 

上面报错的原因是,当手机重启时启动了测试界面,但是该测试apk是没有directBoot属性的,因此当没有解锁时就会报上面的错误,测试过程中发现确实没有类似锁屏的页面,因此case fail,那么下面就要从锁屏界面没有起来的原因进行分析

问题分析

经过与锁屏同事的讨论,发现锁屏界面没有起来的原因如下:

本来应该调起启用锁屏的地方

 

继续往下看shouldConfirmCredentials这个方法,

 

mStartedUsers的赋值是在startUser里面赋值的,该方法在手机reboot的时候会被startProfilesLocked调用

 

startProfilesLocked方法如上,出现异常的时候(user.flags & UserInfo.FLAG_INITIALIZED) == UserInfo.FLAG_INITIALIZED这个条件返回了false,从而导致profilesToStart的size为0 , start user没有正常执行,说明user没有正常初始化。

还有一个地方也能证明没有初始化完毕,手机重启后,执行adb shell dumpsys users,发现被创建的user,其state始终为-1,即始终没有调用 setUserState,从log里也证实了这一点

user的初始化是在UserManagerService.java的makeInitialized(int userId)方法里面

 

该方法也正常最后一行要求写入user数据,问题就出现在scheduleWriteUser这个方法里面

 

从代码上看,scheduleWriteUser方法会通过handler发送一个message,handler接收到消息之后才会写入user数据。这个message有WRITE_USER_DELAY = 2*1000的dalay,出现问题的时候,message发送出去之后,handler还没接收到消息,系统就reboot了,从而导致写入数据失败。到了这里基本可以确定case写的不够完美。下面进行case的修改

测试case修改

首先先确认我们的分析是否正确,在case进入重启阶段之前,先sleep 2s已保证所创建的User有足够的时间完成初始化操作并将UserInfo中flag的值加上FLAG_INITIALIZED,并加上log,发现:

 

2s后顺利将userdata(flag已经置为FLAG_INITIALIZED)写到/data/system/users/11.xml文件里

对比没加之前

 

发送只是将message传出去了,但是还没有来的写就自动重启了,这里我们确认了case确实有问题,那么该如何修复呢。

首先这个case是写在jar包里的,也就是host端,没有context,我们没有办法得到UserManagerService的代理来进行判断,那么能想到的就是通过shell命令来判断device设备的状态,google给我们写好了接口,如下:

http://guard.pt.miui.com/opengrok/xref/v10-p-dipper-dev/tools/tradefederation/core/src/com/android/tradefed/device/TestDevice.java#990

我们可以用到其中的:

 

注意pm list users的各项含义,这样就可以得到相应user的flag,那么等到创建的user的flag被置为FLAG_INITIALIZED之后再重启即可

我提的修复: https://android-review.googlesource.com/c/platform/cts/+/734030

 

但是代码提交上去了才发现google也修复了,https://android-review.googlesource.com/c/platform/cts/+/740245,而且修的很简单

 

只加了一行就达到了同样的效果,waitForBroadcastIdle()

 

很聪明的实现方法

问题总结

了解了host端CTS case也有很多可用接口,同时提case前先看看google是否已经修复

作者: RESSRC

个人资源站

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据