影刀RPA ADB指令大全:手机自动化操作的底层命令详解 影刀RPA ADB指令大全手机自动化操作的底层命令详解作者林焱写在前面ADBAndroid Debug Bridge是Android手机自动化的核心工具。影刀的ADB功能已经封装了常用指令但很多高级操作还是需要自己写ADB命令。本文整理了ADB在RPA场景中最常用的指令结合影刀Python节点使用。一、ADB环境搭建安装ADB下载Android Platform Toolshttps://developer.android.com/studio/releases/platform-tools解压到本地如C:\adb\将路径加入系统环境变量PATH手机开启开发者选项 → “USB调试”连接USB后运行adb devices看到设备ID则连接成功importsubprocessdefrun_adb(command,device_idNone): 执行ADB命令 device_id: 多设备时指定设备单设备可不填 ifdevice_id:cmdfadb -s{device_id}{command}else:cmdfadb{command}resultsubprocess.run(cmd,shellTrue,capture_outputTrue,textTrue,encodingutf-8)returnresult.stdout.strip(),result.returncode# 检查连接的设备devices,_run_adb(devices)print(devices)拼多多店群自动化报活动上架二、常用ADB指令分类设备信息# 获取设备型号model,_run_adb(shell getprop ro.product.model)print(f设备型号{model})# 获取Android版本android_version,_run_adb(shell getprop ro.build.version.release)print(fAndroid版本{android_version})# 获取屏幕分辨率resolution,_run_adb(shell wm size)print(f分辨率{resolution})# 如 Physical size: 1080x2400# 获取屏幕密度![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/78e023e29af842cc81dd3540fd11e49d.png#pic_center)density,_run_adb(shell wm density)print(f屏幕密度{density})# 获取电量battery,_run_adb(shell dumpsys battery | grep level)print(f电量{battery})# 获取当前前台APPcurrent_app,_run_adb(shell dumpsys window | grep mCurrentFocus)print(f当前应用{current_app})触控操作# 点击坐标 (x, y)deftap(x,y):run_adb(fshell input tap{x}{y})# 长按deflong_press(x,y,duration_ms1000):run_adb(fshell input swipe{x}{y}{x}{y}{duration_ms})# 滑动 (从x1,y1 滑到 x2,y2)defswipe(x1,y1,x2,y2,duration_ms500):run_adb(fshell input swipe{x1}{y1}{x2}{y2}{duration_ms})# 向上滑动滚动defscroll_up(distance500):swipe(540,1200,540,1200-distance,300)defscroll_down(distance500):swipe(540,700,540,700distance,300)# 双击defdouble_tap(x,y):tap(x,y)importtime time.sleep(0.1)tap(x,y)文字输入importurllib.parsedefinput_text(text):向当前焦点输入框输入文字# 对特殊字符进行URL编码encodedurllib.parse.quote(text)run_adb(fshell am broadcast -a ADB_INPUT_TEXT --es msg {encoded})# 注意中文输入需要安装ADBKeyboard输入法definput_text_adbkeyboard(text):使用ADBKeyboard输入法输入中文推荐encodedurllib.parse.quote(text)run_adb(fshell am broadcast -a ADB_INPUT_TEXT --es msg {encoded})defclear_input():清空当前输入框# 全选后删除run_adb(shell input keyevent KEYCODE_CTRL_A)run_adb(shell input keyevent KEYCODE_DEL)按键事件# 常用KEYCODE映射KEYCODE{back:4,home:3,menu:82,volume_up:24,volume_down:25,power:26,enter:66,del:67,tab:61,space:62,search:84,}![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/fd0bb898172d49fba55c7bdc3441ca73.png#pic_center)defpress_key(key_name):keycodeKEYCODE.get(key_name)ifkeycode:run_adb(fshell input keyevent{keycode})else:print(f未知按键{key_name})# 示例press_key(home)# 回到桌面press_key(back)# 返回importtime time.sleep(0.5)截图与文件传输deftake_screenshot(save_pathscreenshot.png):截取手机屏幕并保存到电脑# 先截图到手机run_adb(shell screencap -p /sdcard/screen.png)# 再拉取到电脑run_adb(fpull /sdcard/screen.png{save_path})returnsave_pathdefpush_file(local_path,remote_path/sdcard/):将文件推送到手机run_adb(fpush{local_path}{remote_path})defpull_file(remote_path,local_path.):从手机拉取文件run_adb(fpull{remote_path}{local_path})三、应用管理definstall_apk(apk_path):安装APKoutput,coderun_adb(finstall -r{apk_path})print(f安装结果{output})returncode0defuninstall_app(package_name):卸载应用run_adb(funinstall{package_name})deflaunch_app(package_name,activityNone):启动应用ifactivity:run_adb(fshell am start -n{package_name}/{activity})else:run_adb(fshell monkey -p{package_name}-c android.intent.category.LAUNCHER 1)defstop_app(package_name):强制停止应用run_adb(fshell am force-stop{package_name})defclear_app_data(package_name):清除应用数据相当于卸载重装run_adb(fshell pm clear{package_name})# 列出所有已安装的应用deflist_installed_apps(system_appsFalse):flagifsystem_appselse-3# -3 只列第三方应用output,_run_adb(fshell pm list packages{flag})packages[line.replace(package:,).strip()forlineinoutput.split(\n)]returnpackages# 获取应用版本defget_app_version(package_name):output,_run_adb(fshell dumpsys package{package_name}| grep versionName)returnoutput.strip()四、实战案例多台设备批量操作defget_connected_devices():获取所有已连接的设备IDoutput,_run_adb(devices)linesoutput.split(\n)devices[]forlineinlines[1:]:# 跳过第一行 List of devices attachedif\tdeviceinline:device_idline.split(\t)[0].strip()devices.append(device_id)returndevicesdefbatch_operation(devices,operation_func):在多台设备上批量执行操作results{}fordevice_idindevices:try:print(f正在操作设备{device_id})resultoperation_func(device_id)results[device_id]{success:True,result:result}exceptExceptionase:results[device_id]{success:False,error:str(e)}returnresults# 在所有设备上安装APPconnected_devicesget_connected_devices()print(f已连接{len(connected_devices)}台设备{connected_devices})definstall_on_device(device_id):output,_run_adb(finstall -r app.apk,device_iddevice_id)returnoutput resultsbatch_operation(connected_devices,install_on_device)fordevice_id,resultinresults.items():status✅成功ifresult[success]elsef❌失败{result.get(error)}print(f设备{device_id}{status})五、ADB无线连接不用USB线# 步骤1先用USB连接开启无线调试run_adb(tcpip 5555)importtime time.sleep(1)# 步骤2获取设备IPip_output,_run_adb(shell ip addr show wlan0 | grep inet )# 从输出中提取IP地址importre ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/69e941ba75de42cca4a8537ceab4237d.png#pic_center)ip_matchre.search(rinet (\d\.\d\.\d\.\d),ip_output)ifip_match:device_ipip_match.group(1)print(f设备IP{device_ip})# 步骤3断开USB通过网络连接connect_result,_run_adb(fconnect{device_ip}:5555)print(f无线连接结果{connect_result})TEMU店群矩阵自动化运营核价报活动六、踩坑记录坑1中文输入乱码标准ADB input text不支持中文。解决方案安装ADBKeyboard一款专为ADB设计的输入法然后切换到该输入法后发送broadcast指令输入中文。坑2不同手机坐标不同手机屏幕分辨率不同坐标需要按分辨率换算。用百分比坐标更通用deftap_by_ratio(x_ratio,y_ratio):按屏幕比例点击x_ratio和y_ratio都是0-1之间w,hget_screen_size()![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/4721125f76d849539a85c48c06866e4a.png#pic_center)tap(int(w*x_ratio),int(h*y_ratio))坑3ADB连接不稳定USB连接中途断开很常见。加重连逻辑defensure_connected(device_idNone,max_retry3):foriinrange(max_retry):devices,_run_adb(devices)ifdevice_idanddevice_idindevices:returnTruerun_adb(kill-server)time.sleep(1)run_adb(start-server)time.sleep(2)returnFalse坑4系统弹窗拦截手机操作中经常出现权限请求弹窗、系统更新提示等。用截图识别弹窗后自动关闭defdismiss_popups():screenshottake_screenshot()# 识别常见弹窗按钮取消、不再提示、关闭# 用影刀OCR识别或图像匹配总结ADB是手机自动化的基础工具掌握这些指令后配合截图图像识别可以实现大多数手机App的自动化操作。核心原则先截图确认当前状态操作后等待并截图验证异常时保存截图方便调试。署名林焱