huruji / blog

红日初升,其道大光:sun_with_face::house_with_garden:请star或watch,不要fork
https://juejin.im/user/5894886f2f301e00693a3e49/posts
158 stars 11 forks source link

ADB 实用笔记 #74

Open huruji opened 5 years ago

huruji commented 5 years ago

这只是一篇笔记,如果想要了解详细内容,你应该看一手知识,也就是官方的文档,如果你只是想要简单了解,可以看这篇。

ADB 全称 Android Debug Bridge,即安卓调试桥,通过 ADB 能够与模拟器实例或者是连接的安卓设备进行通信,可以通过它来调试安卓应用,做应用的自动化测试,搭建云测试平台等。

安装

brew cask install android-platform-tools

通过 USB 连接手机,打开手机的开发者选项(允许通过 USB 调试、通过 USB 安装应用),使用 adb devices 可以查看连接的设备

输出格式为 [serialNumber] [state],serialNumber 就是序列号,state 有如下几种:

offline —— 表示设备未连接成功或无响应。

device —— 设备已连接。注意这个状态并不能标识 Android 系统已经完全启动和可操作,在设备启动过程中设备实例就可连接到 adb,但启动完毕后系统才处于可操作状态。

no device —— 没有设备/模拟器连接。

加上 -l 参数可以看到具体的设备信息:

使用 adb help 查看帮助

命令语法

与其他工具的命令行类似,ADB 命令有相应的 options,从上面的 adb help 中可以看到对应的全局 options ,最常用的 options 就是 -s 也就是在多设备连接的时候使用指定序列号的设备。大致命令格式可以总结为:

adb [-d|-e|-s <serialNumber>] <command> 

查看应用

查看设备安装的应用

adb shell pm list packages

其中 pmpackage manager 的缩写,abd shell 自然就是运行设备的终端 shell 的意思,因为 android 本身就是基于 unix 的。

可以通过参数来过滤,如 '-3' 为只显示第三方应用,-s 为只显示系统应用,同样也可以通过管道和 grep 来过滤,如我想知道设备中安装了哪些腾讯的应用软件:

adb shell pm list packages | grep tencent

可以看到安装的腾讯应用程序有 qq音乐(com.tencent.qqmusic)、qq邮箱(com.tencent.androidqqmail)、微信(com.tencent.mm)、手机QQ(com.tencent.mobileqq)、和平精英(com.tencent.tmgp.pubgmhd),而 com.tencent.androidqqmail 是系统应用,暂时不知道是哪个。

安装应用

可以通过 ADB 给手机安装电脑上有的 apk ,如给手机装上微博:

adb install /Users/huruji/Downloads/weibo.apk

一段时间后终端显示 success 则表明安装成功。

卸载应用

类似于上面,使用 uninstall 命令加上包名即可,如卸载微博:

adb uninstall com.sina.weibo

一段时间后终端显示 success 则表明卸载成功。

查看应用安装路径

如查看微博的安装路径

adb shell pm path com.sina.weibo

打开应用

打开应用需要知道对应的包名和 Activity 名,可以先通过命令获取启动页,如获取微信的启动页:

adb shell dumpsys window windows | grep "Current"

获取到包名和 Activity 名是 com.tencent.mm/com.tencent.mm.ui.LauncherUI,使用 adb shell am start 命令打开

adb shell am start com.tencent.mm/com.tencent.mm.ui.LauncherUI

其中 am 是 Activity Manager 的缩写

眼睛盯着手机就可以看到手机 “自动” 打开了微信(这个不好记录演示,得自己尝试)

退出应用

如退出微信:

adb shell am force-stop com.tencent.mm

复制文件

将电脑的文件复制到设备上成为 push ,将设备上的文件复制到电脑上成为 pull

adb pull <设备里的文件路径> [电脑上的目录]
adb push <电脑上的文件路径> <设备里的目录>

模拟按键、输入

通过输入 adb shell input 可以看到对应的提示:

输入文字就是

adb shell input text

模拟按键就是

adb shell input keyevent

模拟点击就是

adb shell input tap

模拟滑动就是

adb shell input swipe

比较需要记忆的就是按键的keycode,截取 awesome adb 的总结:

还有就是 swipe 的坐标对应的是真实的屏幕分辨率,比如,我想让手机在抖音应用里自动切换视频就可以使用swipe:

adb shell input swipe 250 1000 250 100

窗口管理

窗口管理的命令是 wm,是 window manager 的缩写

如上面提到的需要获取到屏幕的分辨率:

adb shell wm size

也可以通过这个命令修改窗口分辨率,如:

adb shell wm size 720x1280

同样可以通过 reset 还原回来

adb shell wm size reset

获取密度

adb shell wm density

同样可以修改和重置

adb shell wm density 500
adb shell wm density reset

设置内边距

adb shell wm overscan 50,100,0,200

重置

adb shell wm overscan reset

设备信息

获取手机型号

adb shell getprop ro.product.model

获取电池状况

adb shell dumpsys battery

scale 表示最大电量,level 表示当前电量。

获取 Android 版本

adb shell getprop ro.build.version.release

还有其他的信息也可以通过 getprop 命令获取:

获取设备 IP 地址

adb shell ifconfig | grep Mask

设备的 IP 地址就是 10.159.100.193

截屏和录屏

截屏

截屏可以将文件存在设备里也可以导出到电脑,如导出到电脑:

adb shell screencap -p > /Users/huruji/Downloads/cap/a.png

-p 的意思就是存储为 png 格式,> 表示存储在电脑里,如果去掉 > 将路径换成设备的路径就是存储在设备里。

录屏

录屏保存在设备内,如果需要导出到电脑端可以使用之前提到的 pull 命令,录屏默认最长时间是180s:

shell screenrecord /sdcard/b.mp4

将文件导出

adb shell pull /sdcard/b.mp4

需要注意的是导出到的是当前文件夹,所以如果需要指定对应的文件夹,需要先 cd 到对应文件夹。

以上大概就是常用的操作,如果你需要通过代码控制的话就需要封装相应的包,毕竟裸着拼接字符串很难受,我大概在 npm 上搜索了一下,目前这类包相对较少,比较流行的就是appium-adb,而这个也是服务于项目https://github.com/appium/appium

呼应下开头,开头提到的 ADB 用于云测试平台,目前我知道的开源的有stf 和阿里开源的macaca