通过adb模拟快速的屏幕点击,小米手机亲测有效

本文介绍了一种通过直接写入事件文件提高ADB屏幕点击响应速度的方法,适用于Android10以下版本。详细步骤包括监听event事件、获取点击位置的十六进制坐标、记录并回放点击事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过adb模拟快速的屏幕点击

tips:高版本的此方法行不通了,低于Android10的可以尝试一下,高版本的可以研究一下下面这个框架

Genymobile/scrcpy

最近在做远程控制,关于这个框架欢迎评论区讨论。

想必当你看到这篇文章之前,你可能已经尝试了很多,用下面所说的这种方法:
我们都知道通过下面的命令可以模拟屏幕单击:

adb shell input tap x y

但是发现在尝试了之后,手机的响应速度非常的慢,这显然不是我们想要的结果。
分析原因,这是因为adb是java环境的,发送到手机之后,系统在写入文件,然后响应事件,这一过程就显得很繁琐,你我们有没有什么办法去直接写入事件文件呢?


下面开始讲重点,记好笔记,要考

  1. 进入adb shell命令行
  2. 输入getevent -l进入event事件的监听,这个时候命令行会block住,然后你在屏幕点击你想要点击的位置,你会发现会打印如下的信息:
    /dev/input/event1: EV_ABS       ABS_MT_TRACKING_ID   00000274            
    /dev/input/event1: EV_KEY       BTN_TOUCH            DOWN                
    /dev/input/event1: EV_KEY       BTN_TOOL_FINGER      DOWN                
    /dev/input/event1: EV_ABS       ABS_MT_POSITION_X    0000025a            
    /dev/input/event1: EV_ABS       ABS_MT_POSITION_Y    000005c3            
    /dev/input/event1: EV_SYN       SYN_REPORT           00000000            
    /dev/input/event1: EV_ABS       ABS_MT_TRACKING_ID   ffffffff            
    /dev/input/event1: EV_KEY       BTN_TOUCH            UP                  
    /dev/input/event1: EV_KEY       BTN_TOOL_FINGER      UP                  
    /dev/input/event1: EV_SYN       SYN_REPORT           00000000   
    
    ABS_MT_POSITION_X ABS_MT_POSITION_Y就是你点击的位置,都是16进制的。但是我们的重点不在这里,我们的重点是前面的路径,也就是/dev/input/event1 ,这是系统的事件节点,同样我们可以的input目录下面发现很多这样的节点:
    130|vince:/ # ls /dev/input/                                                   
    event0 event2 event4 event6 eventX mouse0 
    event1 event3 event5 event7 mice   mouse1 
    
  3. 接下来我们把尝试把点击的事件文件记录下来,一开始我尝试下面的方法:
    dd if=/dev/input/event1 of=/sdcard/event1
    
    想通过这个方法来保存事件的信息,但是系统直接提示:意思就是没有数据写出,获得的文件是空白的,这很明显不行
    1|vince:/ # dd if=/dev/input/event1 of=/sdcard/event1                          	
    ^C0+2 records in
    0+0 records out
    0 bytes transferred in 2.376 secs (0 bytes/sec)
    
  4. 然后我发现通过cat去打印event1,屏幕上面显示了一堆乱码,然后我机智的把这段乱码保存了起来:
    cat /dev/input/event1 > /sdcard/event1
    
    然后得到了一样的一行乱码
    130|vince:/ # cat /sdcard/event1                                               
    ?L?\g?9v?L?\g?J?L?\g?E?L?\g?5??L?\g?63?L?\g?1?L?\g??L?\N9?????L?\NJ?L?\NE?L?\Nvi
    
  5. 紧接着,把这个文件直接写入的event1
    dd if=/sdcard/event1 of=/dev/input/event1
    
    终于有反应了,大功告成,最后写一个循环的脚本,就可以不断的点击了,nice~~
    while : ; do dd if=/sdcard/event1 of=/dev/input/event1 ; done
    
<think>好的,用户现在想用Python通过ADB实现安卓手机的滑动操作。首先,我需要回顾之前的对话和已有的引用内容,确保回答符合用户的需求,并且正确使用ADB命令和Python模块。 用户之前的问题是关于如何用Python实现ADB调试,我已经给出了环境准备、基础操作、自动化控制以及调试方法。现在用户特别关注滑动操作,这是ADB中常见的触摸事件之一。需要先确定ADB如何实现滑动,再将其封装到Python中。 根据引用内容,用户提到了使用subprocess调用ADB命令,以及可能需要cv2进行像处理。但当前问题主要是滑动,可能不需要像处理,但需要坐标或持续时间参数。另外,用户提到的adb函数使用了subprocess.Popen,这可能需要在新的代码中沿用或改进。 首先,ADB的滑动命令是`adb shell input swipe`,需要起始坐标(x1,y1)、结束坐标(x2,y2)和持续时间(duration)。例如,`adb shell input swipe 500 1000 500 500 300`表示从(500,1000)滑动到(500,500),持续300毫秒。这个命令需要转化为Python中的函数。 接下来,考虑如何在Python中封装这个命令。用户之前的回答中使用了os.system和subprocess.run,但引用[1]中的adb函数用了subprocess.Popen,并处理了输出。因此,可能需要提供一个更健壮的封装,处理命令的输出和错误。 用户可能需要知道如何确定滑动的坐标。这时候可能需要提到获取屏幕分辨率的方法,例如`adb shell wm size`,这样用户可以根据设备调整坐标。同时,考虑到不同设备的屏幕尺寸不同,可能需要动态获取分辨率,并在代码中处理。 另外,用户可能需要滑动的持续时间参数,因为某些应用可能需要慢速滑动(如滚动列表)或快速滑动(如翻页)。需要解释这个参数的作用。 此外,用户可能关心如何实现更复杂的滑动,比如曲线滑动或者多点触控,但ADB本身可能不支持这些高级操作,可能需要第三方库如uiautomator2,这在之前的回答中已经提到过,可以再次推荐。 在代码示例方面,需要展示基本的滑动函数,以及可能的封装方法,比如使用subprocess.run或者自定义的adb_command函数。同时,给出使用uiautomator2的示例,因为该库提供了更高级的操作,适合更复杂的自动化任务。 还需要注意权限问题,比如是否需要root权限才能执行某些滑动操作,或者是否需要开启USB调试的其他选项,如模拟点击权限,这在引用[2]中提到过,小米手机可能需要额外设置,需要提醒用户检查。 最后,用户可能需要错误处理,比如连接失败、权限被拒绝等情况,应该在代码中加入异常处理或建议调试步骤,如重启ADB服务,获取root权限等。 总结步骤: 1. 介绍ADB滑动命令的基本用法。 2. 封装成Python函数,处理参数和调用。 3. 提供坐标获取方法,如屏幕分辨率。 4. 示例代码,包括基础滑动和可能的优化。 5. 引入第三方库uiautomator2的高级方法。 6. 注意事项和常见问题处理。</think>#### 一、ADB滑动操作原理 ADB通过`input swipe`命令实现滑动操作,语法为: $$ adb\ shell\ input\ swipe\ x1\ y1\ x2\ y2\ [duration(ms)] $$ 其中`(x1,y1)`为起点坐标,`(x2,y2)`为终点坐标,`duration`控制滑动速度(默认快速滑动)[^1]。 --- #### 二、Python实现基础滑动 ##### 1. 封装滑动函数 ```python import subprocess def adb_swipe(x1, y1, x2, y2, duration=300): cmd = f"adb shell input swipe {x1} {y1} {x2} {y2} {duration}" result = subprocess.run(cmd, shell=True, capture_output=True, text=True) if result.returncode != 0: print(f"滑动失败:{result.stderr}") return result.stdout # 示例:从(500,1600)滑动到(500,800),持续0.3秒 adb_swipe(500, 1600, 500, 800) ``` ##### 2. 获取屏幕分辨率(动态适配坐标) ```python def get_screen_size(): output = subprocess.check_output("adb shell wm size", shell=True).decode() return tuple(map(int, output.split()[-1].split('x'))) # 返回(width, height) width, height = get_screen_size() print(f"当前设备分辨率:{width}x{height}") ``` --- #### 三、进阶实现方式 ##### 1. 使用相对坐标滑动(百分比适配) ```python def swipe_by_ratio(start_x_ratio, start_y_ratio, end_x_ratio, end_y_ratio, duration=300): width, height = get_screen_size() x1 = int(width * start_x_ratio) y1 = int(height * start_y_ratio) x2 = int(width * end_x_ratio) y2 = int(height * end_y_ratio) return adb_swipe(x1, y1, x2, y2, duration) # 示例:从屏幕底部中央滑动到顶部中央(通用型上滑) swipe_by_ratio(0.5, 0.8, 0.5, 0.2) # 参数为相对于屏幕宽高的比例 ``` ##### 2. 通过`uiautomator2`实现精准滑动(推荐) ```python import uiautomator2 as u2 d = u2.connect() # 滑动操作(支持绝对坐标/控件定位) d.swipe(500, 1600, 500, 800, 0.3) # 参数为坐标和秒级持续时间 # 控件关联滑动(如滚动列表) d(scrollable=True).scroll.vert.toEnd() # 滚动到底部 ``` --- #### 四、特殊场景处理 1. **长滑动优化** 对长距离滑动建议分多次短滑动: ```python def long_swipe(start_x, start_y, end_x, end_y, segments=3): step_x = (end_x - start_x) // segments step_y = (end_y - start_y) // segments for i in range(segments): adb_swipe(start_x + i*step_x, start_y + i*step_y, start_x + (i+1)*step_x, start_y + (i+1)*step_y, 200) ``` 2. **滑动轨迹验证** 通过截屏验证操作效果: ```python def swipe_with_validation(x1, y1, x2, y2): adb_swipe(x1, y1, x2, y2) subprocess.run("adb exec-out screencap -p > screen_after.png", shell=True) # 可结合OpenCV进行像对比验证 ``` --- #### 五、调试要点 1. **坐标校准** 使用开发者选项中的`指针位置`功能显示实时坐标[^2]。 2. **滑动失效处理** - 检查`adb devices`是否识别设备 - 确认已开启`模拟点击`权限(MIUI需单独开启) - 尝试`adb kill-server && adb start-server`重置服务[^1] ---
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值