写点什么

提高 Android 云真机稳定性的方法

  • 2022 年 9 月 29 日
    北京
  • 本文字数:2678 字

    阅读完需:约 9 分钟

在日常测试过程中我们时常会使用大量的 Android 真机执行任务,这些设备在批量执行任务过程中经常会出现电量耗尽而导致关机的问题,关机设备的处理大大增加了运维成本,本文主要通过减少设备耗电量和避免断电关机两个方面进行说明

01

根据设备电量控制任务,避免断电关机

避免真机断电关机的处理比较简单,我们根据设备耗电情况设置低位电量和正常电量。可指定低位电量为 20%,正常电量 60%,空闲设备低于高位电量时不接受任务,执行任务的设备电量低于低位电量时中断任务的运行。当电量高于正常电量时解除限制

~$ adb shell dumpsys batteryCurrent Battery Service state:  AC powered: false  USB powered: true  Wireless powered: false  Max charging current: 0  Max charging voltage: 0  Charge counter: 37000  status: 5  health: 2  present: true  level: 100    scale: 100  voltage: 4358  temperature: 300  technology: Li-poly
复制代码


02

减少设备耗电量,提高设备利用率

我们还可以通过控制设备状态让手机的耗电量减少。我们主要是控制手机屏幕的耗电量和减少后台应用的运行。

降低执行任务过程中屏幕亮度

随着手机的屏幕尺寸和分辨率的提升,屏幕的耗电量也与日俱增,我们如果能自动控制手机的屏幕亮度就可以减少很多不必要的电量消耗;

#设置当前亮度调节模式:手动调节[0];自动调节[1]settings put system screen_brightness_mode 0#获取当前亮度调节模式settings get system screen_brightness_mode#获取当前屏幕亮度设置(0—255)settings get system screen_brightness
#修改屏幕亮度设置[0—255]settings put system screen_brightness 150
复制代码

任务结束后关闭所有第三方程序并锁屏

现在的 App 有太多后台服务,这也是 Android 耗电量较大的一个原因,所以在设备闲置的情况下要避免后台应用的运行,这样也可以达到减少耗电的目的。

1、获取系统安装的第三方应用,执行 pm 命令查询系统安装的第三方应用,package:后面的信息为应用包名。

$ adb shell pm list packages -3package:com.sankuai.meituanpackage:com.tencent.mmpackage:com.liuzh.deviceinfopackage:com.ct.client
复制代码

2、遍历所有应用,并通过 am 命令杀死应用 am force-stop [packagename]

adb shell am force-stop com.ct.client
复制代码

03

设置手机状态,减少任务故障

自动设置息屏时间

在脚本执行过程中有可能会几分钟都不操作设备,如果这期间手机锁屏了,那么就有可能导致脚本异常。所以下面通过命令动态设置屏幕息屏时间

adb shell settings put system screen_off_timeout  30
复制代码

设置时间自动获取

adb shell settings put global auto_time 1
复制代码

设置手机音量

设置手机音量这部分是通过反射实现的,通过反射获取系统 IAudioService 服务,然后通过其接口设置音量

Method getServiceMethod=Class.forName("android.os.ServiceManager").getDeclaredMethod("getService", String.class);IBinder binder = (IBinder) getServiceMethod.invoke(null, "audio");Method asInterfaceMethod = Class.forName("android.media.IAudioService$Stub").getMethod("asInterface", IBinder.class);IAudioService  iAudioService= (IAudioService) (IInterface) asInterfaceMethod.invoke(null, binder);
复制代码

2、获取当前情景模式

获取的情景模式值有

AudioManager.RINGER_MODE_SILENT    静音或免打扰模式AudioManager.RINGER_MODE_VIBRATE   震动模式AudioManager.RINGER_MODE_NORMAL    响铃模式int mode=iAudioService.getRingerModeExternal()
复制代码

当系统模式为静音或免打扰时,只能设置多媒体音量和闹钟音量,设置其他音量时会抛异常。

iAudioService.setRingerModeExternal(AudioManager.RINGER_MODE_NORMAL,"com.android.settings");iAudioService.setRingerModeInternal(AudioManager.RINGER_MODE_NORMAL,"com.android.settings");#华为部分系统报错  9.1.0.226报错java.lang.SecurityException: request policy access status for another package: uid 2000 does not have android.permission.STATUS_BAR_SERVICE.    at android.os.Parcel.createException(Parcel.java:1953)    at android.os.Parcel.readException(Parcel.java:1921)    at android.os.Parcel.readException(Parcel.java:1871)    at android.media.IAudioService$Stub$Proxy.setRingerModeExternal(IAudioService.java:1309)    at com.android.manager.AudioServiceImpl.setVolume(AudioServiceImpl.java:84)    at com.android.test.DeviceMotion.setVolume(DeviceMotion.java:1599)    at com.qihoo.qa.opentest.OpenTestApplication.initDeviceState(OpenTestApplication.java:474)    at com.qihoo.qa.opentest.OpenTestApplication.init(OpenTestApplication.java:510)    at com.qihoo.qa.opentest.OpenTestApplication.main(OpenTestApplication.java:143)    at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)    at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:371)Caused by: android.os.RemoteException: Remote stack trace:    at android.app.ContextImpl.enforce(ContextImpl.java:2046)    at android.app.ContextImpl.enforceCallingPermission(ContextImpl.java:2064)    at com.android.server.notification.NotificationManagerService$11.enforceSystemOrSystemUIOrSamePackage(NotificationManagerService.java:3501)    at com.android.server.notification.NotificationManagerService$11.isNotificationPolicyAccessGrantedForPackage(NotificationManagerService.java:3666)    at android.app.NotificationManager.isNotificationPolicyAccessGrantedForPackage(NotificationManager.java:918)
复制代码

通过 setStreamVolume 方法设置音量

//  [streamType] 音量类型//  AudioManager.STREAM_RING;//  AudioManager.STREAM_SYSTEM;//  AudioManager.STREAM_VOICE_CALL;//  AudioManager.STREAM_NOTIFICATION;//  AudioManager.STREAM_DTMF;//  AudioManager.STREAM_MUSIC;多媒体音量//  AudioManager.STREAM_ALARM;闹钟音量//  //  [volume] 音量值,取值范围一般为[0,7]//  [flags] 固定传0//  [callingPackage] 传null即可iAudioService.setStreamVolume(streamType,volume,flags,callingPackage);
复制代码

更多学习资料戳下方!!!

https://qrcode.ceba.ceshiren.com/link?name=article&project_id=qrcode&from=infoQ&timestamp=1662366626&author=xueqi

用户头像

社区:ceshiren.com 2022.08.29 加入

微信公众号:霍格沃兹测试开发 提供性能测试、自动化测试、测试开发等资料、实事更新一线互联网大厂测试岗位内推需求,共享测试行业动态及资讯,更可零距离接触众多业内大佬

评论

发布
暂无评论
提高Android云真机稳定性的方法_测试_测吧(北京)科技有限公司_InfoQ写作社区