19

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

 3 years ago
source link: https://mp.weixin.qq.com/s?__biz=MzUxMTcwOTM4Mg%3D%3D&%3Bmid=2247487857&%3Bidx=1&%3Bsn=8bb4aa4ed2837c67d8b3b18dda49b39d
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

奇技 · 指南

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

1

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

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

通过Shell命令**dumpsys battery**获取设备的当前电量值,其中level对应的值就是电量值。我们在设备内定时检查电量,并做上述控制。这样就避免低电量的设备一直执行任务导致关机的情况。

~$ adb shell dumpsys battery
Current 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

umye6fy.png!mobile

2

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

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

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

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

1、调节屏幕亮度时一定保证手机的亮度调节模式为手动,否则系统会根据环境自动调节屏幕亮度。我 们通过以下命令设置屏幕亮度调节模式为手动调节

#设置当前亮度调节模式:手动调节[0];自动调节[1]
settings put system screen_brightness_mode 0
#获取当前亮度调节模式
settings get system screen_brightness_mode

2、通过shell命令调节屏幕亮度

#获取当前屏幕亮度设置(0—255)
settings get system screen_brightness

#
修改屏幕亮度设置[0—255]
settings put system screen_brightness 150

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

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

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

pm list packages -3

$ adb shell pm list packages -3
package:com.sankuai.meituan
package:com.tencent.mm
package:com.liuzh.deviceinfo
package:com.ct.client

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

adb shell am force-stop com.ct.client

3

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

自动设置息屏时间

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

下面命令指定系统息屏时间为30S

adb shell settings put system screen_off_timeout  30

设置时间自动获取

当手机的时间与网络时间不同步时会导致很多异常信息,所以在任务执行前要首先设置系统自动设置时间

adb shell settings put global auto_time 1

设置手机音量

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

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()

3、设置系统模式

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

调用方法设置为响铃模式

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)

4、设置系统音量

通过 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);

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK