谷动谷力

 找回密码
 立即注册
查看: 637|回复: 0
打印 上一主题 下一主题
收起左侧

ADB 连接手机调试 ADB Shell

[复制链接]
跳转到指定楼层
楼主
发表于 2024-1-23 22:07:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ADB 连接手机调试 ADB Shell


一、ADB是什么?
ADB,即 Android Debug Bridge 是一种允许模拟器或已连接的 Android 设备进行通信的命令行工具,它可为各种设备操作提供便利,如安装和调试应用,并提供对 Unix shell(可用来在模拟器或连接的设备上运行各种命令)的访问。可以在Android SDK/platform-tools中找到 adb 工具或下载 ADB Kits

二、ADB有什么作用?
ADB 是一个客户端-服务器程序程序,包括三个组件:
  • 客户端:该组件发送命令。客户端在开发计算机上运行。您可以通过发出 adb 命令从命令行终端调用客户端。
  • 后台程序:该组件在设备上运行命令。后台程序在每个模拟器或设备实例上作为后台进程运行。
  • 服务器:该组件管理客户端和后台程序之间的通信。服务器在开发计算机上作为后台进程运行。
三、ADB命令语法
如果只有一个设备/模拟器连接时,可以省略掉 [-d|-e|-s <serial-number>] 这一部分,直接使用 adb <command>。

多个设备/模拟器连接
在多个设备/模拟器连接的情况下较常用的是 -s <serial-number> 参数,serial-number是指设备的设备序列号,可以通过 adb devices 命令获取。

四、ADB常用命令
4.1 基本命令
4.1.1 查看adb的版本信息
  1. adb version
复制代码

4.1.2 启动adb
  1. adb start-server
复制代码

比如使用 adb shell input keyevent <keycode> 命令,不同的 keycode 能实现不同的功能,完整的 keycode 列表详见 KeyEvent,摘引部分我觉得有意思的如下:
keycode
含义

3HOME 键
4返回键
5打开拨号应用
6挂断电话
24增加音量
25降低音量
26电源键
27拍照(需要在相机应用里)
64打开浏览器
82菜单键
85播放/暂停
86停止播放
87播放下一首
88播放上一首
122移动光标到行首或列表顶部
123移动光标到行末或列表底部
126恢复播放
127暂停播放
164静音
176打开系统设置
187切换应用
207打开联系人
208打开日历
209打开音乐
210打开计算器
220降低屏幕亮度
221提高屏幕亮度
223系统休眠
224点亮屏幕
231打开语音助手
276如果没有 wakelock 则让系统休眠

下面是 input 命令的一些用法举例。

4.7.1 电源键
  1. adb shell input keyevent 26
复制代码

如果锁屏没有密码,是通过滑动手势解锁,那么可以通过 input swipe 来解锁。 命令(参数以机型 Nexus 5,向上滑动手势解锁举例):
  1. adb shell input swipe 300 1000 300 500
复制代码

在焦点处于某文本框时,可以通过 input 命令来输入文本。
  1. adb shell input text hello
复制代码

4.8 日志打印

4.8.1 Android 日志
4.8.1.1]按级别过滤日志的基本命令格式是:
  1. adb logcat [filter-specs]
复制代码

按某级别过滤日志则会将该级别及以上的日志输出。
会将 Warning、Error、Fatal 和 Silent 日志输出。
按 tag 和级别过滤日志的基本命令格式是:
  1. adb logcat [tag:level] [tag:level] ...
复制代码

表示输出 tag ActivityManager 的 Info 以上级别日志,输出 tag MyApp 的 Debug 以上级别日志,及其它 tag 的 Silent 级别日志(即屏蔽其它 tag 日志)。
查看 Android 设备系统属性的基本命令格式是:
  1. adb logcat [option] [filter-specs]
复制代码

按级别过滤日志的基本命令格式是:
  1. adb logcat [filter-specs]
复制代码

按某级别过滤日志则会将该级别及以上的日志输出。
会将 Warning、Error、Fatal 和 Silent 日志输出。
按 tag 和级别过滤日志的基本命令格式是:
  1. adb logcat [tag:level] [tag:level] ...
复制代码

表示输出 tag ActivityManager 的 Info 以上级别日志,输出 tag MyApp 的 Debug 以上级别日志,及其它 tag 的 Silent 级别日志(即屏蔽其它 tag 日志)。

4.8.1.3 将日志格式化输出
日志支持按以下几种 <format>:
参数
显示格式
brief<priority>/<tag>(<pid>): <message>
process<priority>(<pid>) <message>
tag<priority>/<tag>: <message>
raw<message>
time<datetime> <priority>/<tag>(<pid>): <message>
threadtime<datetime> <pid> <tid> <priority> <tag>: <message>
long[ <datetime> <pid>:<tid> <priority>/<tag> ] <message>


Android log 输出量巨大,特别是通信系统的log,因此,Android把log输出到不同的缓冲区中,目前定义了四个log缓冲区:
缓冲区
含义
Radio输出通信系统的 log
System输出系统组件的 log
Event输出 event 模块的 log
Main所有 java 层的 log 以及不属于上面3层的 log

缓冲区主要给系统组件使用,一般的应用不需要关心,应用的log都输出到main缓冲区中。默认log输出(不指定缓冲区的情况下)是输出System和Main缓冲区的log。

4.8.1.7 打印指定日志缓冲区的大小
  1. adb logcat -g
复制代码

4.8.2 内核日志
  1. adb shell dmesg
复制代码

中括号里的 [14201.684016] 代表内核开始启动后的时间,单位为秒。
4.9]输出示例:
  1. Nexus 5
复制代码

4.9.2 查看设备电池状况
  1. adb shell dumpsys battery
复制代码

其中 scale 代表最大电量,level 代表当前电量。上面的输出表示还剩下 44% 的电量。

4.9.3 查看设备屏幕分辨率
  1. adb shell wm size
复制代码

该设备屏幕分辨率为 1080px * 1920px。
表明设备的屏幕分辨率原本是 1080px * 1920px,当前被修改为 480px * 1024px。

4.9.4 查看设备屏幕密度
  1. adb shell wm density
复制代码

该设备屏幕密度为 420dpi。
表明设备的屏幕密度原来是 480dpi,当前被修改为 160dpi。

4.9.5 查看设备显示屏参数
  1. adb shell dumpsys window displays
复制代码

输出示例:
  1. 51b6be48bac8c569
复制代码

4.9.7 查看设备IMEI
输出示例:
  1. Phone Subscriber Info:
  2.   Phone Type = GSM
  3.   Device ID = 860955027785041
复制代码

而在 Android 5.0 及以上版本里这个命令输出为空,得通过其它方式获取了(需要 root 权限):
  1. adb shell
  2. su
  3. service call iphonesubinfo 1
复制代码

  1. adb shell ifconfig wlan0
复制代码

4.9.8 查看设备 Android 系统版本
  1. adb shell getprop ro.build.version.release
复制代码

在有的设备上这个命令没有输出,如果设备连着 WiFi,可以使用如下命令来查看局域网 IP:

输出示例:
  1. f8:a9:d0:17:42:4d
复制代码

设备的更多硬件与系统属性可以通过如下命令查看:
  1. adb shell cat /system/build.prop
复制代码

输出里还包括一些其它有用的信息,它们也可通过 adb shell getprop <属性名> 命令单独查看,列举一部分属性如下:
属性名
含义

ro.build.version.sdkSDK 版本
ro.build.version.releaseAndroid 系统版本
ro.build.version.security_patchAndroid 安全补丁程序级别
ro.product.model型号
ro.product.brand品牌
ro.product.name设备名
ro.product.board处理器型号
ro.product.cpu.abilistCPU 支持的 abi 列表[节注一]
persist.sys.isUsbOtgEnabled是否支持 OTG
dalvik.vm.heapsize每个应用程序的内存上限
ro.sf.lcd_density屏幕密度
一些小厂定制的 ROM 可能修改过 CPU 支持的 abi 列表的属性名,如果用 ro.product.cpu.abilist 属性名查找不到,可以这样试试:
  1. adb shell cat /system/build.prop | grep ro.product.cpu.abi
复制代码

注: 修改设置之后,运行恢复命令有可能显示仍然不太正常,可以运行 adb reboot 重启设备,或手动重启。
表示将分辨率修改为 480px * 1024px。
表示将屏幕密度修改为 160dpi。
四个数字分别表示距离左、上、右、下边缘的留白像素,以上命令表示将屏幕底部 200px 留白。
用命令恢复不了了,毕竟关闭了 USB 调试 adb 就连接不上 Android 设备了。 去设备上手动恢复吧:「设置」-「开发者选项」-「Android 调试」。

4.10.5 修改允许/禁止访问非 SDK API
禁止访问非 SDK API:
  1. adb shell settings delete global hidden_api_policy_pre_p_apps
  2. adb shell settings delete global hidden_api_policy_p_apps
复制代码

命令最后的数字的含义:
含义

0禁止检测非 SDK 接口的调用。该情况下,日志记录功能被禁用,并且令 strict mode API,即 detectNonSdkApiUsage() 无效。不推荐。
1仅警告——允许访问所有非 SDK 接口,但保留日志中的警告信息,可继续使用 strick mode API。
2禁止调用深灰名单和黑名单中的接口。
3禁止调用黑名单中的接口,但允许调用深灰名单中的接口。
4.10.6 修改状态栏和导航栏的显示隐藏
  1. adb shell settings put global policy_control <key-values>
复制代码

这些键对应的值可则如下值用逗号组合:
value
含义

apps所有应用
*所有界面
package-name指定应用
-package-name排除指定应用
表示设置在所有界面下都同时隐藏状态栏和导航栏。
  1. adb shell settings put global policy_control immersive.status=com.package1,com.package2:immersive.navigation=apps,-com.package3
复制代码

截图保存到电脑:
  1. adb exec-out screencap -p > sc.png
复制代码

先截图保存到设备里:
  1. adb shell screencap -p /sdcard/sc.png
复制代码

可以使用 adb shell screencap -h 查看 screencap 命令的帮助信息,下面是两个有意义的参数及含义:
参数
含义

-p指定保存文件为 png 格式
-d display-id指定截图的显示屏编号(有多显示屏的情况下)
另外一种一行命令截图并保存到电脑的方法: Linux 和 Windows
  1. adb shell screencap -p | sed "s/\r$//" > sc.png
复制代码

这个方法需要用到 gnu sed 命令,在 Linux 下直接就有,在 Windows 下 Git 安装目录的 bin 文件夹下也有。如果确实找不到该命令,可以下载 sed for Windows 并将 sed.exe 所在文件夹添加到 PATH 环境变量里。
需要安装 gnu-sed,然后使用 gsed 命令:
  1. brew install gnu-sed
复制代码

4.11.2 录制屏幕
需要停止时按 Ctrl-C,默认录制时间和最长录制时间都是 180 秒。
可以使用 adb shell screenrecord --help 查看 screenrecord 命令的帮助信息,下面是常见参数及含义:
参数
含义

--size WIDTHxHEIGHT视频的尺寸,比如 1280x720,默认是屏幕分辨率。
--bit-rate RATE视频的比特率,默认是 4Mbps。
--time-limit TIME录制时长,单位秒。
--verbose输出更多信息。
4.11.3 查看连接过的 WiFi 密码
注:需要 root 权限。
  1. adb shell
  2. su
  3. date -s 20160823.131500
复制代码

此时命令行提示符是 $ 则表示没有 root 权限,是 # 则表示已 root。

4.11.7 使用 Monkey 进行压力测试
简单用法:
  1. adb shell monkey -p <packagename> -v 500
复制代码

注:需要 root 权限。
  • 开启 WiFi:
  1. adb root
  2. adb shell svc wifi enable
复制代码

  • 关闭 WiFi:
  1. adb root
  2. adb shell svc wifi disable
复制代码

如果我们下载了 Android 设备对应的系统更新包到电脑上,那么也可以通过 adb 来完成更新。
启用 SELinux
  1. adb root
  2. adb shell setenforce 1
复制代码

启用 dm_verity
  1. adb root
  2. adb enable-verity
复制代码

Android 系统是基于 Linux 内核的,所以 Linux 里的很多命令在 Android 里也有相同或类似的实现,在 adb shell 里可以调用。本文档前面的部分内容已经用到了 adb shell 命令。

4.14.1 查看进程状态
  1. adb shell ps
复制代码

adb shell top 后面可以跟一些可选参数进行过滤查看不同的列表,可用参数及含义如下:
参数
含义

-m最多显示多少个进程
-n刷新多少次后退出
-d刷新时间间隔(单位秒,默认值5)
-s按某列排序(可用col值:cpu, vss, rss, thr)
-t显示线程信息
-h显示帮助文档
有两种方案:
  • adb shell dumpsys package <packagename> | grep userId= 如:
  1. adb shell dumpsys package org.mazhuang.guanggoo | grep userId=
  2.   userId=10394
复制代码

  • 通过 ps 命令找到对应进程的 pid 之后 adb shell cat /proc/<pid>/status | grep Uid 如:
    1. adb shell
    2. gemini:/ $ ps | grep org.mazhuang.guanggoo
    3. u0_a394   28635 770   1795812 78736 SyS_epoll_ 0000000000 S org.mazhuang.guanggoo
    4. gemini:/ $ cat /proc/28635/status | grep Uid
    5. Uid:    10394   10394   10394   10394
    6. gemini:/ $
    复制代码


五、致谢

+11

最近谁赞过

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation ( 粤ICP备14060730号|Sitemap

GMT+8, 2024-12-26 19:23 , Processed in 0.153794 second(s), 40 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表