【Android测试】【随笔】模拟长按电源键

起因



  昨天群里看到有人问如何实现一个长按电源键的操作,这个问题经常遇到,而且对于新手来说也比较棘手,于是在尝试成功后,决定说说这个事情。

  一般这样的需求都出现在自动化操作的过程中。但是一般的ui自动化貌似对长按操作都支持的不是特别好,即使有也是针对手机屏幕中的区域来进行长按,我们都知道电源键是一个实体键,无法通过点击ui来实现。说道这里估计很多人都想到了KEYCODE(“KEYCODE” 在【Android测试】【第十二节】Uiautomator——API详解 中的Uidevice的API列举中有介绍),没错很多的自动化工具提供了通过KEYCODE来进行点击,但是基本上没有长按这一个操作,于是我们就需要借助Android本身的sendevent来进行输入事件的模拟。

 

事件注入



  Android中的事件注入方式一共有三种:在Monkey源码浅谈的文章中,我们已经介绍过一种事件注入的方法,不过那种方法谷歌的限制比较严格,基本对我们做自动化没什么帮助;第二种是通过内部API的方式,由字面意思可知,只有Android应用程序才可以做到,并且这种方法只在本应用中生效,因此对我们来说也不是特别的理想;还有一种方法就是注入事件到设备/dev/input/eventX,本次我们介绍的sendevent方法,其实就是通过/dev/input/eventX来实现事件模拟的,学会了这个之后就可以做到举一反三,之后所有的点触操作的模拟都可以以此类推。

获得事件



  我来说说我是怎么做的。

  首先我在手机的shell下输入了getevent命令,这样就可以接收到手机上操作的所有event事件。

  

  这个时候我们按下我们手机电源键,来看看可以接收到哪些事件信息,按下电源键后:

  

  我们得到了以上四条信息。

  我们来以第一条为例分析一下获得是什么? 

  /dev/input/event0:  代表 device

  0001                         代表一个type

  0074                         代表power键的code(为16进制)

  00000001                 代表value 一般 1代表按下,0代表放开。

  根据查阅sendevent 需要的参数为就是device、type、code、value。

  于是我们就可以通过下面四条命令即可完成按power键的操作,中间sleep的时间长度大于2秒,系统就认为是长按:

sendevent /dev/input/event0 1 116 1(0074转化为十进制后为116)
sendevent /dev/input/event0 0 0 0
sleep 3
sendevent /dev/input/event0 1 116 0
sendevent /dev/input/event0 0 0 0

sh脚本



  当知道了如何模拟长按电源键之后,那么我们如何用在自动化中呢?这里我打算介绍一下shell脚本

  众所周知Android是基于linux内核的,而shell脚本可以运行在linux中,所以我们试试用sh脚本是否可以在Android中运行。

  1、完成脚本

    因为Android本身内部没有vi,因此我打算在Windows上写好脚本然后导入进去,脚本内容为:

#!/bin/sh

sendevent /dev/input/event0 1 116 1
sendevent /dev/input/event0 0 0 0
echo "down"
sleep 3
sendevent /dev/input/event0 1 116 0
sendevent /dev/input/event0 0 0 0
echo "up"

  2、导入手机

    这一步不用多说,将脚本名称保存为 "boy.sh",然后使用adb导入手机sd卡。

     

  3、加权限

    一般linux系统中,导入的文件可能没有权限,因此我们需要加权限后再运行,于是我做了下面的操作:

    

    运行后提示我没有权限,明明刚才加了权限的,我们来查看一下文件:

    

    仔细一看果然没有加权限成功,怀疑自己刚才是不是打错了,于是又试了一次,还是不行。  

    最终经过不断的尝试,发现原来是sd卡是无法加权限的,必须要把文件放到 /data/data/的目录下才可以:

    

    终于权限加成功了。

  4、运行

    权限加成功后,迫不及待的去运行:

    

    还是提示有问题,后来也是不断尝试才知道,原因是手机的启动命令和linux还是有差别,使用下面的启动方法即可:

    

    运行完成之后,观察手机,出现了长按电源键后的效果:

    

时间: 2024-10-05 11:16:58

【Android测试】【随笔】模拟长按电源键的相关文章

模拟长按电源键

事件注入 Android中的事件注入方式一共有三种:在Monkey源码浅谈的文章中,我们已经介绍过一种事件注入的方法,不过那种方法谷歌的限制比较严格,基本对我们做自动化没什么帮助:第二种是通过内部API的方式,由字面意思可知,只有Android应用程序才可以做到,并且这种方法只在本应用中生效,因此对我们来说也不是特别的理想:还有一种方法就是注入事件到设备/dev/input/eventX,本次我们介绍的sendevent方法,其实就是通过/dev/input/eventX来实现事件模拟的,学会了

Android 长按电源键关机整个流程小学习

最近研究了一下android关机跟重新启动功能,看了一些长按电源键到弹出关机对话框,到真正关机的一系列处理过程. 首先还是来看看这个长按电源键都干了些什么吧?一般来说,电源键都是接到PMU上的,PMU来判断是长按还短按,当有按键消息产生的时候,系统会有中断,然后去读PMU的状态就可以知道是什么了.笔者以全志平台的AXP209小议一下,先贴上关键代码: static int axp_battery_event(struct notifier_block *nb, unsigned long eve

Android5.0 长按电源键关机没有弹确定对话框直接关机

Android5.0 长按电源键关机没有弹确定对话框直接关机,但用户点击了关机选项之后,应该弹一个确定对话框给用户提示是否真的进入关机模式. 首先在frameworks层将对话框的标志位打开. frameworks\base\policy\src\com\android\internal\policy\impl\GlobalActions.java @Override public void onPress() { final boolean quickbootEnabled = Setting

android源码修改,实现长按电源键直接关机

版本:android 4.4.2 源文件路径:frameworks\base\policy\src\com\android\internal\policy\impl\PhoneWindowManager.java 修改下面的代码: private final Runnable mPowerLongPress = new Runnable() { @Override public void run() { // The context isn't read if (mLongPressOnPowe

【Android测试】【随笔】模拟双指点击

手势 看到这个标题,很多人会想一想 “双指点击” 的操作是什么样的,首先解释一下吧,为了能清晰明了一点,请看下面的图: 左上角的Tap代表点击操作,也就是我们说的 “单指单击”:右上角是Double Tap顾名思义,使用一个手指完成 “双击” 的动作:左下角的Scroll代表的是用一个手指完成 “滑动”的动作:最后看右下角这张图,这个动作就是我们本节要讲的内容,用两个手指完成 “单击” 的动作,注意两个手指点击的实际要同时,同时按下,同时抬起. 什么需求 为什么会有这样的需求呢?这个需求可能大部

关于一条定制长按Power键弹出Dialog的需求

如题,需要定制长按Power键弹出的Dialog,UI上的大致效果是:全屏,中间下拉按钮“Swipe Down To Power Off”下拉关机,底部左右两侧“Reboot”,“Cancel”按钮,分别是重启,取消操作.并要求弹出Dialog的同时,背景渐变模糊,操作控件有相应动画效果,执行相应操作有同步动画,退出界面背景渐变至透明消失.设计效果酱紫: 具体控件动画要求就不再详述.主要两件事:1.关机流程,更准确的说应该是对长按Power键的处理:2.定制Dialog. 1.长按Power键,

Android单元测试与模拟测试详解

测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabricator differential 发diff时提交需要执行的单元测试,在开发流程上就可以保证远端代码的稳定性). 2. 测什么? 一般单元测试: 列出想要测试覆盖的异常情况,进行验证. 性能测试. 模拟测试: 根据需求,测试用户真正在使用过程中,界面的反馈与显示以及一些依赖系统架构的组件的应用测

Android利用广播监听按下HOME和电源键

package cc.testhome; import cc.testhome.HomeKeyObserver.OnHomeKeyListener; import cc.testhome.PowerKeyObserver.OnPowerKeyListener; import android.os.Bundle; import android.app.Activity; /** * Demo描述: * 利用广播监听Home键的按下和长按Home键 * 利用广播监听电源键的按下(关闭屏幕) * *

Android黑屏死机--充电运行土豆视频【.4.4】》播放视频中黑屏死机》手动按电源键开机显示电量为6%

[测试版本] T0405 [测试模块] [测试步骤] 充电运行土豆视频[.4.4]> [测试结果]播放视频中黑屏死机>手动按电源键开机显示电量为6%[开机后恢复] [预期结果]可正常播放 分析: 从测试提供的描述突然黑屏死机,并且是在电量低的情况,也有可能是直接掉电了,下面就来分析下log 从第二份last_kmsg LOG 中可以明显的看到: [ 206.423069]<0>.(0)[160:kpoc_charger]******** MT auxadc driver shutd