Adb Command And Script
Base
devices
查看是否连接成功[1]
adb devices
锁定、解锁
adb shell input keyevent 26
adb shell input keyevent 82
keyevent 26
keyevent 26 表示的是按下电源按钮,所以说如果我们手机屏幕状态是打开的话,会导致屏幕状态切换为开启状态,针对这个情况,我们可以在脚本中使用判断:
for /f "tokens=*" %%a in ('adb -s %serial_no% shell "dumpsys deviceidle | grep mScreenOn"') do set screen_state=%%a
if "%screen_state%" == "mScreenOn=true" (
echo %screen_state% is on
adb -s %serial_no% shell input keyevent 82
) else (
echo %screen_state% is off
adb -s %serial_no% shell input keyevent 26
adb -s %serial_no% shell input keyevent 82
)
如果屏幕状态是开启的话,我们就直接点解锁;否则的话,我们开启屏幕再解锁。
重启、关机
adb shell reboot # 重启
adb shell reboot -p # 关机
蓝牙
adb shell service call bluetooth_manager 6 # 打开蓝牙
adb shell service call bluetooth_manager 9 # 关闭蓝牙
Wi-Fi
adb shell svc wifi enable # 打开wifi
adb shell svc wifi disable # 关闭wifi
# 打开wifi设置界面
adb shell am start -a android.intent.action.MAIN -n com.android.settings/.wifi.WifiSettings
APP
安装、删除
adb install abc.apk # 第一次安装。如果手机上已经有此app,则会报错。
adb uninstall com.example.appname
获取 APP Activity
手动打开 APP
使用 adb 命令:
adb shell dumpsys window | grep mCurrentFocus # or dumpsys window | grep mCurrentFocus
此时可以看到输入类似于下面:
mCurrentFocus=Window{a4d3e62 u0 com.example.myapplication/com.example.myapplication.MainActivity}
其中以
com.xxx
那一段就是 APP 的 Activity.提示
该方法如果想知道 APP 的包名,使用方法是:
pm list package -3
列出所有应用,其中-3
表示列举出第三方应用。但是通常而言,我们打开该 APP 并执行命令,是能够从 Activity 的前半部分得到包名的。
启动 APP
adb shell am start -n com.package.name/com.package.name.MainActivity
adb shell am start -n com.package.name/.MainActivity
举例:启动抖音
adb shell am start -n com.ss.android.ugc.aweme/com.ss.android.ugc.aweme.splash.SplashActivity
关闭 APP
adb shell am force-stop com.some.package
注意
force-stop
后面跟着的是 APP 的包名,而 start
后面是 APP 的 activity.
获取 Pid
很多时候,我们需要获取到 APP 进程对应的 PID,当我们知道 APP 的包名的时候,一切都变得非常简单:
adb shell pidof package_name
bat script example
这是一个关于如何获取 PID 的 bat script 例子:
@echo off
set /p serial_no=<./serial_no.txt
echo serial_no is %serial_no%
set PACKAGE_NAME=com.example.myapplication
for /f "tokens=*" %%a in ('adb -s %serial_no% shell pidof %PACKAGE_NAME%') do set PID=%%a
if "%PID%"=="" (
echo Error: %PACKAGE_NAME% is not running
exit /b 1
)
echo PID of %PACKAGE_NAME% is %PID%
获取 Tid
我们在知道 Pid 和我们的线程名称的时候,可以很轻松地获取到线程的 Tid:
set thread_name=HeapTaskDaemon
for /f "tokens=3" %%a in ('adb -s %serial_no% shell "ps -T -p %PID% | grep %thread_name%"') do set tid=%%a
Tap and Slide
slide
adb shell input touchscreen swipe 930 880 930 380 # 向上滑
adb shell input touchscreen swipe 930 880 330 880 # 向左滑
adb shell input touchscreen swipe 330 880 930 880 # 向右滑
adb shell input touchscreen swipe 930 380 930 880 # 向下滑
tap
adb shell input mouse tap 100 500
Other Skill
等待设备重启
如果想等到设备重启完成以后再进行下一步操作,可以在 adb 命令之间增加:
adb wait-for-device
经过实测,后面的命令会等到设备重启完成之后再执行。
写 SN
1、执行命令进入fastboot:adb reboot bootloader
2、fastboot getvar nve:SN@12345678 @后面为想要修改成为的SN编号
3、fastboot reboot 重启
4、查看单板SN号是否修改成功:adb devices
写完之后进行验证:
adb devices
fastboot devices
adb shell "getprop ro.serialno"
Push Path
对于一些情况,我们可能需要 push 进去文件完成更新,所以这一节对此做出列举。
art
如果要推送 art, 其实现如下:
adb remount
adb push .\lib64\libart.so /system/apex/com.android.art.debug/lib64/libart.so
adb push .\lib\libart.so /system/apex/com.android.art.debug/lib/libart.so
adb reboot
pause
如果要推送 apex 包,其实现如下(编译产物 com.android.art.apex
):
adb shell rm /cache/overlay/system/upper/apex/com.android.art.apex
adb reboot
adb wait-for-device
adb remount
adb push com.android.art.apex /system/apex/
adb reboot
增加上设备序列号的推送程序
set /p serial_no=<./serial_no.txt
echo serial_no is %serial_no%
adb -s %serial_no% remount
adb -s %serial_no% push .\lib64\libart.so /system/apex/com.android.art.debug/lib64/libart.so
adb -s %serial_no% push .\lib\libart.so /system/apex/com.android.art.debug/lib/libart.so
adb -s %serial_no% reboot
adb -s %serial_no% wait-for-device
adb -s %serial_no% shell "getprop ro.serialno"
pause