背景
在做客户端UI自动化测试或者Monkey自动化测试中,使用jenkins中持续集中测试,经常会遇到因为设备原因导致执行任务失败的Case。
其中有一种场景,是因为设备屏幕锁屏导致自动化任务阻塞失败的场景。
因为,做自动化需要保障设备一直是常亮和解锁的状态,不然如果设备是锁屏状态会阻塞自动化脚本执行,会一直卡死在当前状态。
通常解决这类问题,粗暴的方式就是给手机设备设置高亮,如下图是小米手机的设置操作:
但是这种设置方式有几种缺点:
- 长时间设备屏幕用不休眠,对手机的电池有很大消耗,因为屏幕长亮也是耗电的,长时间会导致电池鼓包等问题,极大缩短手机寿命。
- 在华为、oppo等国产手机中没有永不休眠选项,最多只能保持30分钟。
- 因为手机设备平时会调试或者用于功能测试,手机设备可能被人工锁屏。
综上几个问题,依赖手机设置中屏幕常亮,无法彻底解决问题。
解决思路
解决思路主要是通过有两种方式:
1、使用adb命令亮屏
代码语言:javascript复制点亮屏幕—>解锁屏幕
点亮屏幕:adb shell input keyevent KEYCODE_POWER
解锁屏幕:adb shell input keyevent 82
在jenkins的shell中执行自动化脚本前执行adb命令亮屏。
代码语言:javascript复制adb -s ${device_name} shell input keyevent KEYCODE_POWER
cd ${project_path} && sh monkey.sh -p com.zhihu.android -t ${run_time} -i ${appID} -e ${appType} -h ${appPath}
使用adb命令亮屏也有个缺点,如果执行命令后没有立即执行自动化脚本,设备屏幕又会自动锁屏。
2、使用外置插件
使用外置插件的方式,是从Android底层系统设置屏幕永不休眠,借助操作Android系统PowerManager API,具体代码如下:
使用LongLightUtils.keepScreenLongLight(this);方法设置使屏幕常亮。
代码语言:javascript复制 /**
* 是否使屏幕常亮
*
* @param activity
*/
public static void keepScreenLongLight(Activity activity) {
boolean isOpenLight = CommSharedUtil.getInstance(activity).getBoolean(CommSharedUtil.FLAG_IS_OPEN_LONG_LIGHT, true);
if (isOpenLight) {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
} else {
activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
}
在BaseActivity中的onCreate生命周期中调用。
代码语言:javascript复制
然后,把项目编译成apk安装到手机上,执行如下命令:
代码语言:javascript复制adb -s ${device_name} shell am start -n com.finddreams.screenlonglight/com.finddreams.screenlonglight.MainActivity
在手机设备前台打开如下页面,设备就会常驻高亮。