通过ADB来实现脚本来控制手机

ADB

简介

adb的全称为Android Debug Bridge,安卓调试桥,可以通过调试命令来控制手机,诸如开机,关机等按键控制;或者启动,关闭应用;异或进行触摸模拟.

通过学习adb,可以实现简单的脚本控制,最大的特点是不需要root,对于普通手机都可以进行,帮助我们完成一些简单的重复性事件,诸如刷资源,各种app的签到

环境配置

电脑端

将下面3个文件弄到一个文件夹里D:\android\adb,然后将其添加到path,adb环境就配置好了

AdbWinUsbApi.dll
AdbWinApi.dll
adb.exe

然后将这个文件夹添加到path中

cmd中 adb version检查是否添加成功

手机端

开发者选项

开启开发者选项 : 以小米手机为例,先进入开发者设置,miui版本号点5下,更多设置->开发者选项->开启

打开usb调试 : 在开发者选项中,开启usb调试以便于执行adb指令,miui还需要开启usb调试(安全设置)

获取坐标 : 开发者选项中,开启指针位置以便于模拟触摸时获取位置

设备管理

远程调试

基于内网穿透实现远程调试,就可以不用占用那少得可怜的usb口了,下面是统一管理所有设备的命令

开启关闭服务,默认会自动开启,关闭服务可用于断开多个连接的设备
adb start-server
adb kill-serveradb devices 查看设备列表,如果有模拟器一般会自动连接,所以如果想在开模拟器时断开设备就需要获取模拟器ip:port然后断开

实现步骤

先使用内网穿透得到虚拟IP 如100.119.133.92

推荐tailscale或蒲公英

手机通过usb调试设置监听端口adb tcpip 5555

断开手机后,电脑连接 如adb connect 100.119.133.92:5555

调试结束后可以adb disconnect 100.119.133.92:5555 断开连接

远程控制

scrcpy 使用这个软件,在上面远程连接之后就可以进行远程控制,当然也可以直接连usb获得稳定的投屏

手机adb

Local ADB

  • 先连接任意一个 Wi-Fi,就算没有接入互联网都可以;
  • 然后打开 LADB,将它调整为小窗模式(或分屏模式)——因为无线调试的配对码等信息每次点击都会动态生成,所以才需要小窗模式同时打开本应用和开发者选项;
  • 进入开发者选项,开启无线调试,首次使用需要配对设备,将配对码和端口填入本应用即可;
  • 开心使用adb

应用管理

常见命令中常见pm和am的缩写

pm package manager

am activity manager

一个package下有多个activity(界面)

查看应用列表

adb shell pm list packages    		查看所有应用
adb shell pm list packages -s		查看系统应用
adb shell pm list packages -3		查看第三方应用
adb shell pm list packages vivo	 	查看带关键词vivo的应用

安装应用

adb install [-r] [-d] [-g] <apk-file>
-r覆盖 -d降级覆盖 -g授予所有运行权限

例如 adb install "D:\android\apk\com.supercell.clashofclans.apk"

卸载应用

adb uninstall [-k] <package-name>
-k 表示卸载应用但保留数据和缓存目录。

例如adb uninstall com.supercell.clashofclans

获取activity和package

adb shell dumpsys window w | findstr mCurrent

得到 mCurrentFocus=Window{8554b85 u0 com.supercell.clashofclans/com.supercell.titan.GameApp}

然后可以得到

activity : com.supercell.clashofclans/com.supercell.titan.GameApp

package : com.supercell.clashofclans

可以通过下面cmd代码获取

@echo offsetlocal enabledelayedexpansion
rem 先查询window w mCurrent属性,如果为空,则查询window w imeControlTarget属性
for /f "delims=" %%a in ('adb shell dumpsys window w ^| findstr mCurrent') do set activity=%%a 
if "!activity!"=="" (
for /f "delims=" %%a in ('adb shell dumpsys window w ^| findstr imeControlTarget') do set activity=%%a )rem 然后对获得的结果进行处理提取得到activity和package,先去除},然后取空格分隔的最后一部分,即activity,之后再得到package
for /f "delims=}" %%a in ("!activity!") do set activity=%%a 
rem for /f "tokens=3 delims= " %%a in ("!activity!") do set activity=%%a
for %%I in (!activity!) do (set activity=%%I) 
for /f "tokens=1 delims=/" %%a in ("!activity!") do set package=%%aecho activity  :  !activity!
echo package   :  !package!endlocal

提取安装包

获取了安装路径后pull到指定目录里并重命名为com.supercell.clashofclans.apk

adb shell pm path com.supercell.clashofclans
adb pull /data/app/com.supercell.clashofclans-HyrIPsbKlOHBjZwM4LnczA==/base.apk D:\android\com.supercell.clashofclans.apk

用cmd实现批量操作

@echo off
rem 获取安装包
set outputpath=D:\android\apk\
set package=com.supercell.clashofclans
for /f "delims=" %%a in ( 'adb shell pm path %package%' ) do set originalString=%%a
for /f "tokens=2 delims=:" %%a in ("%originalString%") do set apkpath=%%a
adb pull %apkpath% %outputpath%%package%.apk

启动和停止应用

rem 启动
adb shell am start -n com.supercell.clashofclans/com.supercell.titan.GameApp>nul
rem 强行停止
adb shell am force-stop com.supercell.clashofclans

行为模拟

按键模拟

按键模拟都是像下面这种格式,不同的按键对应不同的id

rem 模拟主页键
adb shell input keyevent 3

下面是常用id-按键表

id按键
3home
4返回
187多任务
24增加音量
25减小音量
26电源键
164静音
220提高亮度
221降低亮度

详细的见官网 KeyEvent | Android Developers

触摸模拟

rem 单击 (1200,70)为x,y坐标
adb shell input tap 1200 70rem 滑动 从(600,700)滑动到(600,900)经历1000ms
adb shell input swipe 600 700 600 900 1000rem 长按 用滑动实现
adb shell input swipe 100 100 100 100 1000

系统控制

rem 执行关机命令
adb shell reboot -prem 执行重启命令
adb shell rebootrem 进入Recovery
adb reboot recoveryrem 进入Fastboot
adb reboot fastboot

实战

获取当前活动的activity和package

@echo offsetlocal enabledelayedexpansion
rem 先查询window w mCurrent属性
for /f "delims=" %%a in ('adb shell dumpsys window w ^| findstr mCurrent') do set activity=%%a 
if "!activity!"=="" ( REM 如果没有查询到,则查询window w imeControlTarget属性,此处只试了两款手机,其他的可以自己打印出window w再找
for /f "delims=" %%a in ('adb shell dumpsys window w ^| findstr imeControlTarget') do set activity=%%a )rem 然后对获得的结果进行处理提取得到activity和package,先去除},然后取空格分隔的最后一部分,即activity,之后再得到package
for /f "delims=}" %%a in ("!activity!") do set activity=%%a 
rem 通过循环得到空格的最后一段,因为不同的指令输出的我们所需的信息都在最后
for %%I in (!activity!) do (set activity=%%I)  
for /f "tokens=1 delims=/" %%a in ("!activity!") do set package=%%aecho activity  :  !activity!
echo package   :  !package!endlocal

coc辅助刷夜世界资源

坐标需要根据屏幕分辨率自行调整

chcp 65001
@echo offset m=7
:m
set /a m+=1adb shell am start -n com.supercell.clashofclans/com.supercell.titan.GameApp > nul
choice /t 12 /d y  >nulset  /a n = %m% %% 8
if %n% == 0  (
echo 圣水已收集
adb shell input swipe 600 700 600 900 1000
adb shell input tap 1060 80
adb shell input tap 1100 600
adb shell input tap 1200 70
)rem 皮卡一字滑
adb shell input tap 120 650
adb shell input tap 1035 500
choice /t 5 /d y  >nuladb shell input tap 360 650
FOR /L %%i in (1,1,2) DO (
adb shell input tap 200 100
adb shell input tap 200 450
adb shell input tap 1200 100
adb shell input tap 1200 450
)adb shell am force-stop com.supercell.clashofclans
goto m

冲杯

chcp 65001
@echo offif "%1" == "h" goto begin
mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit
:beginset m=7
:m
set /a m+=1adb shell am start -n com.supercell.clashofclans/com.supercell.titan.GameApp > nul
choice /t 12 /d y  >nulset  /a n = %m% %% 8
if %n% == 0  (
echo 圣水已收集
adb shell input swipe 600 700 600 900 1000
adb shell input tap 1000 200
adb shell input tap 1100 600
adb shell input tap 1200 70
)adb shell input tap 120 650
adb shell input tap 1035 500
choice /t 5 /d y  >nuladb shell input tap 260 650
adb shell input tap 200 450
adb shell input tap 1200 100adb shell input tap 360 650
FOR /L %%i in (1,1,2) DO (
adb shell input tap 200 100
adb shell input tap 200 450
adb shell input tap 1200 100
adb shell input tap 1200 450
)
choice /t 80 /d y  >nul
adb shell input tap 260 650
adb shell input tap 200 450
adb shell input tap 1200 100adb shell input tap 1100 660
FOR /L %%i in (1,1,3) DO (
adb shell input tap 200 100
adb shell input tap 200 450
adb shell input tap 1200 100
adb shell input tap 1200 450
)adb shell am force-stop com.supercell.clashofclansgoto m

TODO

录制操作

record

#!/bin/bash - if [ "$1" == "-h" ]; thenecho "-s: to generate Shell file "echo "-c: to generate C program file "echo "-h: help "exit
fi
#apk信息
PACKAGE=$(awk -F '=' '$1~/PACKAGE/{print $2;exit}' ./config.ini)
ACTIVITY=$(awk -F '=' '$1~/LAUNCH_ACTIVITY/{print $2;exit}' ./config.ini)
#设备信息
DEVICE_NAME=$(awk -F '=' '$1~/DEVICE_NAME/{print $2;exit}' ./config.ini)
echo "Touch device is [ $DEVICE_NAME ]"
#文件定义
file=./out/cmds.txt
t0file=tmp0.txt
t1file=tmp1.txt
t2file=tmp2.txt#-------------------------------------------------------------------------------
#  函数: 比较两个 Float 数值
#-------------------------------------------------------------------------------
compare_float(){local a=$1local b=$2awk -va=$a -vb=$b 'BEGIN {if(a>b) printf("true"); else printf("false")}'
}compare_string(){local a=$1local b=$2awk -va=$a -vb=$b 'BEGIN {if(a!=b) printf("true"); else printf("false")}'
}#组合事件过滤条件echo "-----recorder started"
trap "echo  '= recoder stopped ='" SIGINT
#重启app
adb shell am force-stop $PACKAGE
adb shell am start -W -n $PACKAGE/$ACTIVITY
#获取输出事件并重定向到文件
adb shell getevent -t | grep -E --line-buffered "$DEVICE_NAME" >$t0file
echo "-=============$DEVICE_NAME"
#替换"[","]","/dev/input/event/",":"为空字符串
sed 's/\[//g;s/\]//g;s/\/dev\/input\/event//g;s/\://g' $t0file >$t1file
#把文件中的相关内容格式化
#正则解释:
#     1. awk - 转换 第3列 和 第4列 数值为十进制模式(因为ioctl接收的是十进制)
#     2. sed - 4294967295 实为 -1, 原因是-1为0xFFFF,FFFF(4294967295)
cat $t1file |\awk '{print $2, strtonum("0x"$3), strtonum("0x"$4), strtonum("0x"$5)}' |\sed 's/4294967295/-1/g' >$t0file#sleep_arry_line=()                              # 有睡眠操作的event
#sleep_arry_time=()                              # 保存睡眠时间
awk '{print $1}' $t1file >$t2file                # 抽取时间列,存至 $t2file
tstart=$(sed -n '1p' $t2file)
tend=$(sed -n '$p' $t2file)
tdiff=0
index=1
while read t; docase $t in$tstart|$tend )                         # 第一个时间和最后一个时间无需比较tdiff=0.000000;;* )prev=$(sed -n "$(($index-1)) p" $t2file)tdiff=$(awk -va=$t -vb=$prev 'BEGIN {printf("%lf\n",a-b)}');;esacecho "$tdiff "#sleep_arry_line+=($index)sleep_arry_time+=($(awk -va=$tdiff 'BEGIN {print a*1000000}'))((index++))
done < $t2file >$t1file    paste $t1file $t0file >$filerm $t0file $t1file $t2file
echo "-----Generate txt file, output file is [ $file ]"if ([[ $1 =~ "s" ]]); then# 两个event时间差# 因为一个触屏操作(如点击一下),需由多个event来组成mindiff=0.01shellfile="./out/cmds.sh"scmdfile="scmd.txt"ssleepfile="ssleep.txt"ssleepfinalfile="sleep.txt"awk '{print "sendevent /dev/input/event"$2" "$3" "$4" "$5}' $file >$scmdfile awk '{print $1}' $file >$ssleepfileindex=1while read t;doif $(compare_float $mindiff $t); thenecho ''else echo "sleep $t; "fidone < $ssleepfile > $ssleepfinalfilepaste $ssleepfinalfile $scmdfile >$shellfilerm $scmdfile $ssleepfinalfile $ssleepfileadb push ./out/cmds.sh /data/local/tmp/cmds.shecho "-----Generate shell file , output file is [ $shellfile ]"
fi
if ([[ $1 =~ "c" ]]); thenmodelcfile=template.c                           # 模板C语言文件targetcfile=./jni/cmds.ctcfile=tmpc.cmindiff=$(awk -F '=' '$1~/TIME_INTERVAL/{print $2;exit}' ./config.ini)currentdev="">$tcfilewhile read line; do                             # 输出临时C语言文件sleeptime=$(echo $line|awk '{print ($1)*1000000}')device=$(echo $line|awk '{print "/dev/input/event"$2}')type=$(echo $line|awk '{print $3}')code=$(echo $line|awk '{print $4}')value=$(echo $line|awk '{print $5}')if $(compare_float $sleeptime $mindiff); thenecho "    usleep($sleeptime);" >>$tcfilefiif $(compare_string $currentdev $device);then currentdev=$devicecat<<EOF >>$tcfileevent.type = $type;event.code = $code;event.value = ${value}u;fd = open("$device", O_RDWR);write(fd, &event, event_size);
EOFelsecat<<EOF >>$tcfileevent.type = $type;event.code = $code;event.value = ${value}u;write(fd, &event, event_size);
EOFfidone < $fileappend_line=55sed "$append_line r $tcfile" $modelcfile >$targetcfilerm $tcfileecho "-----Generate C file , output file is [ $targetcfile ]"#编译生成的c命令文件cd ./jnindk-buildcd ../cp ./libs/armeabi-v7a/cmds ./out/cmdsadb push ./out/cmds /data/local/tmp/cmdsrm -r ./libs ./obj
fi
#关闭app
adb shell am force-stop $PACKAGE
echo "-----Successfully, totally spent time: $SECONDS seconds"

replay

#apk信息
PACKAGE=$(awk -F '=' '$1~/PACKAGE/{print $2;exit}' ./config.ini)
ACTIVITY=$(awk -F '=' '$1~/LAUNCH_ACTIVITY/{print $2;exit}' ./config.ini)
#重启app
adb shell am force-stop $PACKAGE
adb shell am start -W -n $PACKAGE/$ACTIVITY
#回放事件
adb shell /data/local/tmp/cmds
#不同的手机权限系统不一样,如果你得手机需要root权限下才能运行回放命令,请替换为以下回放命令
#adb shell su -c busybox chmod 755 /data/local/tmp/cmds
#adb shell su -c /data/local/tmp/cmdsadb shell am force-stop $PACKAGE

ini

*******************************以下配置信息中不能有空格****************************************
#apk信息
PACKAGE="com.baidu.searchbox"
LAUNCH_ACTIVITY="com.baidu.searchbox.MainActivity"
#输入device信息,多个输入设备用“|”分隔
DEVICE_NAME=event2:|event9:
#两个事件之间的间隔,这个依据机器的性能而不同,需要手动设置,单位是微妙
TIME_INTERVAL=10000

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/585161.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos搭建kubernetes集群步骤

目录 1. 修改host 2. 时间同步 3. 禁用firewalled 4. 禁用selinux 5. 禁用swap 6. 网桥设置 7. docker安装 8. 安装k8s 9. 异性操作 10. 配置flannel​​​​​​​ 1. 修改host cat >> /etc/hosts << EOF 172.16.188.175 master 172.16.188.176 node1 …

基于Freeswitch实现的Volte网视频通知应用

现在运营商的Volte网络已经很好的支持视频通话了&#xff0c;因此在原来的电话语音通知的基础上&#xff0c;可以更进一步实现视频的通知&#xff0c;让用户有更好的体验&#xff0c;本文就从技术角度&#xff0c;基于Freeswitch来实现此类应用&#xff08;本文假设读者已对Fre…

2分钟快速了解Nginx

1.简介 Nginx&#xff08;发音为 “engine x”&#xff09;是一个高性能的HTTP和反向代理服务器&#xff0c;也用作邮件代理服务器。它以其稳定性、丰富的功能集、简单的配置和低资源消耗而闻名。 2.详细解释 Nginx由俄罗斯程序员Igor Sysoev为解决C10k问题&#xff08;即同…

三台CentOS7.6虚拟机搭建Hadoop完全分布式集群(三)

这个是笔者大学时期的大数据课程使用三台CentOS7.6虚拟机搭建完全分布式集群的案例&#xff0c;已成功搭建完全分布式集群&#xff0c;并测试跑实例。 9 安装hbase 温馨提示&#xff1a;安装hbase先在master主节点上配置&#xff0c;然后远程复制到slave01或slave02 &#xf…

6130 树的最长路

思路&#xff1a;树的最长路问题可以通过两次 DFS 求解&#xff0c;具体思路如下&#xff1a; 1.第一次 DFS 求树的直径 以任意一个点为起点进行深度优先遍历&#xff08;DFS&#xff09;&#xff0c;找到与该点距离最远的点 u 。 以 u 为起点进行 DFS &#xff0c;找到与 u 距…

pytest pytest-html优化样式

conftest.py import pytest from pytest_metadata.plugin import metadata_keydef pytest_html_report_title(report):report.title"接口测试报告"def pytest_configure(config):# 获取命令行参数中的测试环境、测试版本、开始时间、测试人员config.stash[metadata_…

3D 渲染如何帮助电商促进销售?

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 3D 渲染图像因其高转化率而成为亚马逊卖家的最新趋势。它是电子商务平…

腾讯云标准型S5服务器4核8G配置优惠价格表

腾讯云4核8G服务器S5和轻量应用服务器优惠价格表&#xff0c;轻量应用服务器和CVM云服务器均有活动&#xff0c;云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元&#xff0c;5年6490.44元&#xff0c;轻量应用服务器4核8G12M带宽一年446元、529元15个月&#xff0c;腾讯云…

Python 人物相关性分析-字符串问题(来源 lanqiao.cn:198)

题目描述 小明正在分析一本小说中的人物相关性。他想知道在小说中 Alice 和 Bob 有多少次同时出现。 更准确的说&#xff0c;小明定义 Alice 和 Bob“同时出现”的意思是:在小说文本 中 Alice 和 Bob 之间不超过 K 个字符。 例如以下文本: This is a story about Alice and Bob…

OpenHarmony南向之Camera简述

Camera驱动框架 该驱动框架模型内部分为三层&#xff0c;依次为HDI实现层、框架层和设备适配层&#xff1a; HDI实现层&#xff1a;实现OHOS&#xff08;OpenHarmony Operation System&#xff09;相机标准南向接口。框架层&#xff1a;对接HDI实现层的控制、流的转发&#x…

【算法与数据结构】435、LeetCode无重叠区间

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;思路和【算法与数据结构】452、LeetCode用最少数量的箭引爆气球类似&#xff0c;也是排序找重叠区间。…

启封涂料行业ERP需求分析和方案分享

涂料制造业是一个庞大而繁荣的行业 它广泛用于建筑、汽车、电子、基础设施和消费品。涂料行业生产不同的涂料&#xff0c;如装饰涂料、工业涂料、汽车涂料和防护涂料。除此之外&#xff0c;对涂料出口的需求不断增长&#xff0c;这增加了增长和扩张的机会。近年来&#xff0c;…

单片机MCU堆栈概念与区别

C语言中的堆栈是用于存储函数调用、局部变量以及程序执行期间所需的临时数据的内存区域。堆栈由编译器自动管理&#xff0c;是一种后进先出&#xff08;LIFO&#xff09;的数据结构。堆栈空间大小指的是分配给堆栈的内存空间大小&#xff0c;它限制了函数调用和局部变量的深度和…

【JAVA】OPENGL绕XYZ轴旋转立体图效果

JAVA-OPENGL绕XYZ轴旋转立体图效果_哔哩哔哩_bilibiliJAVA-OPENGL绕XYZ轴旋转立体图效果开始显示的是绕X轴、Y轴、Z轴旋转&#xff0c;后边是同时绕两个轴旋转&#xff0c;头有点晕&#xff0c;反应不过来了。, 视频播放量 1、弹幕量 0、点赞数 0、投硬币枚数 0、收藏人数 0、转…

wpf-动态设置组件【按钮为例】样式

文章速览 解决方案具体实现Converter 部分创建样式Binding样式 坚持记录实属不易&#xff0c;希望友善多金的码友能够随手点一个赞。 共同创建氛围更加良好的开发者社区&#xff01; 谢谢~ 解决方案 创建一个Converter&#xff0c;返回对应的style实现对应的修改 创建多个样式…

代码质量评价及设计原则

1.评价代码质量的标准 1.1 可维护性 可维护性强的代码指的是: 在不去破坏原有的代码设计以及不引入新的BUG的前提下,能够快速的修改或者新增代码. 不易维护的代码指的是: 在添加或者修改一些功能逻辑的时候,存在极大的引入新的BUG的风险,并且需要花费的时间也很长. 代码可…

leetcode贪心算法题总结(二)

本节目录 1.最长回文串2.增减字符串匹配3.分发饼干4.最优除法5.跳跃游戏II6.跳跃游戏7.加油站8.单调递增的数字9.坏了的计算器 1.最长回文串 最长回文串 class Solution { public:int longestPalindrome(string s) {//计数一&#xff1a;用数组模拟哈希表int hash[127] {0}…

新能源光伏行业CRM:推动绿色能源发展与高效客户管理的双重突破

随着“碳中和”计划以及传统能源价格的不断飙升&#xff0c;我国新能源光伏产业在国家“双碳”战略目标和市场需求的双重驱动下高歌猛进&#xff0c;中国光伏产业新增装机量、累计装机量连续多年位居全球首位。CRM在光伏产业中的作用也日益突出。下面为您介绍新能源光伏行业的C…

大模型系列:OpenAI使用技巧_给数据集中做文本向量化embeding

文章目录 1. 加载数据集2. 获取嵌入并保存以备将来使用 本笔记本提供了一个示例&#xff0c;演示如何从大型数据集中获取嵌入。 1. 加载数据集 本示例使用的数据集是来自亚马逊的精细食品评论。该数据集包含截至2012年10月&#xff0c;亚马逊用户留下的共568,454条食品评论。我…

线上隐私保护的未来:分布式身份DID的潜力

在日益数字化的世界中&#xff0c;人们的生活越来越多地依赖于互联网&#xff0c;数字身份也因而变得越来越重要。根据法律规定&#xff0c;互联网应用需要确认用户的真实身份才能提供各种服务&#xff0c;而用户则希望在进行身份认证的同时能够尽量保护他们的个人隐私&#xf…