Android16 EDLA CtsWindowManagerDeviceInput存在fail方法 testReceiveKeysOnTopOfKeyguard和 testPointerCaptur
Android16 EDLA CtsWindowManagerDeviceInput测试失败分析 本文记录了Android16 EDLA版本中CtsWindowManagerDeviceInput测试项的两个失败案例及其解决方法: testReceiveKeysOnTopOfKeyguard失败原因: 与config.xml中config_disableLockscreenByDefault设置为
Android16 EDLA CtsWindowManagerDeviceInput存在fail方法 testReceiveKeysOnTopOfKeyguard和 testPointerCaptureWhenFocus
文章目录
一、前言
EDLA Window相关的报错一般是: frameworks/base/services/core/java/com/android/server/wm 改动导致;
也有可能是server目录下的am、pm、input、inputmethod 代码修改导致;
暂时不是很会分析窗口的问题,这里记录一下遇到的报错,后续方便快速分析解决。
二、CtsWindowManagerDeviceInput项的Faile解决
刚开有29个报错:
上面这几个报错都是在 frameworks/base/services/core/java/com/android/server/改动的地方添加了cts测试判断;
还有就是取消自定义默认显示的悬浮框;
后续重新测试,出现了另外一个Failed:
1、testReceiveKeysOnTopOfKeyguard

看起来是和按键Key相关,但是实际是和视图相关:
分析解决
通过回退代码分析到是这里修改导致:
frameworks\base\core\res\res\values\config.xml
config_disableLockscreenByDefault 修改为true会导致新增faile项。
这里应该是默认不锁屏状态,不能设置为true,也就是说系统不能设置默认不锁屏的状态;
如果设置默认不锁屏的状态,会出现于测试结果不符,导致Failed。
后续重新整项测试,还有其他报错;
这个和上面一个Failed是不相关的,只是你修改Failed项问题的时候,其他人还在修改代码功能也会导致新增Failed项;
2、testPointerCaptureWhenFocus

报错的类名和方法名:
android.server.wm.input.WindowFocusTests#testPointerCaptureWhenFocus
分析解决
看起来是和视图顶层View的设置相关; 该测试失败的本质是:指针捕获状态未随窗口焦点变化同步更新 。
通过回退代码分析到是这里修改导致:
release/frameworks/base/services/core/java/com/android/server/am/UserController.java
某些添加下跳过了默认需要执行的:finishUserStoppedAsync.run();
解决方法就是添加cts属性判断,如果cts测试的时候使用原生的逻辑代码即可。
这种报错估计好几个地方修改都会导致这样的Failed,可以通过clean代码,验证确认是否是导致Failed;
比如回退下面目录:
release/frameworks/base/services/core/java/com/android/server/ 目录下的am、wm、input等目录
通过回退某个目录或者某些代码进行验证是否是修改导致的Failed。
frameworks/base/services下的代码回退技巧:
1、release/frameworks/base/services 下面的代码checkout 后;
2、系统是可以单编framework的service的;在services目录mm就可以编译;
3、编译成功后会生成一个services.jar在out/XXX/systemframework/下面;
4、系统的运行代码,remount后,替换/system/framework/services.jar
5、重启设备就可以验证是哪部分的代码修改导致Failed了。
三、其他
1、小结
(1)window相关的Failed项一般是framework的修改导致;
(2)testReceiveKeysOnTopOfKeyguard 导致的Failed 是和res的默认配置修改有关;
(3)testPointerCaptureWhenFocus 导致的Failed 是server/am/UserController.java的修改有个;
(3)如果代码其他地方修改干扰到了视图层级也会导致该项Failed。
2、cts代码分析
cts的报错理论上都是在系统源码里面能看到测试过程的代码的;
报错信息:
android.server.wm.input.WindowFocusTests#testPointerCaptureWhenFocus
#号,前面就是包名类名,后面就是方法名。
在系统源码release/cts 目录下,grep -nr testPointerCaptureWhenFocus 可以找到测试方法。
cts/tests/framework/base/windowmanager/src/android/server/wm/input/WindowFocusTests.java
public void testPointerCaptureWhenFocus() throws Throwable {
final AutoEngagePointerCaptureActivity primaryActivity =
startActivityAndFocus(getMainDisplayId(), /*hasFocus*/ true,
AutoEngagePointerCaptureActivity.class);
// Assert primary activity can have pointer capture before we have multiple focused windows.
primaryActivity.waitAndAssertPointerCaptureState(true /* hasCapture */);
assumeTrue(supportsMultiDisplay());
// This test only makes sense if `config_perDisplayFocusEnabled` is disabled.
assumeFalse(perDisplayFocusEnabled());
final SecondaryActivity secondaryActivity =
createManagedInvisibleDisplaySession().startActivityAndFocus();
primaryActivity.waitAndAssertWindowFocusState(false /* hasFocus */);
// Assert primary activity lost pointer capture when it is not top focused.
primaryActivity.waitAndAssertPointerCaptureState(false /* hasCapture */);
secondaryActivity.waitAndAssertPointerCaptureState(false /* hasCapture */);
tapOn(primaryActivity);
primaryActivity.waitAndAssertWindowFocusState(true /* hasFocus */);
primaryActivity.waitAndAssertPointerCaptureState(true /* hasCapture */);
}
private static void tapOn(@NonNull Activity activity) {
final Point p = getCenterOfActivityOnScreen(activity);
final int displayId = activity.getDisplayId();
final long downTime = SystemClock.elapsedRealtime();
final MotionEvent downEvent = MotionEvent.obtain(downTime, downTime,
MotionEvent.ACTION_DOWN, p.x, p.y, 0 /* metaState */);
downEvent.setDisplayId(displayId);
getInstrumentation().sendPointerSync(downEvent);
final MotionEvent upEvent = MotionEvent.obtain(downTime, SystemClock.elapsedRealtime(),
MotionEvent.ACTION_UP, p.x, p.y, 0 /* metaState */);
upEvent.setDisplayId(displayId);
getInstrumentation().sendPointerSync(upEvent);
}
private static <T extends InputTargetActivity> T startActivityAndFocus(int displayId,
boolean hasFocus, Class<T> cls) {
// An untrusted virtual display won't have focus until the display is touched.
final T activity = WindowManagerTestBase.startActivity(
cls, displayId, hasFocus);
// Regardless of whether the activity should be focused at launched, it should always be
// the top-most activity on the display. //这里预言失败!
try {
assertTrue("Timed out waiting for window to be on top",
CtsWindowInfoUtils.waitForWindowOnTop(activity.getWindow()));
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
// Tap on the activity to bring it into focus, in case it wasn't focused before.
tapOn(activity);
activity.waitAndAssertWindowFocusState(true);
return activity;
}
清楚View的流程的可以看看上面的逻辑;
上面会有多个情况判断,不管是 assumeTrue 或者 assumeFalse ,主要与预期不符都会导致Failed。
更多推荐


所有评论(0)