[整理]ADB命令行学习笔记

基本用法

基本命令

adb基本命令,基本语法如下:

adb [-d|-e|-s <serialNumber>] <command>
复制代码

如果当前连接只有一个设备,可以直接省略掉[-d|-e|-s <serialNumber>] 这一部分,直接使用 adb <comman

为命令行指定目标设备

如果有多台设备或模拟器连接,需要指定目标设备

参数含义
-d指定当前唯一通过 USB 连接的 Android 设备为命令目标
-e指定当前唯一运行的模拟器为命令目标
-s <serialNumber>指定相应 serialNumber 号的设备/模拟器为命令目标

在多个设备/模拟器连接的情况下较常用的是 -s 参数,serialNumber 可以通过 adb devices 命令获取。如:

$ adb devices

List of devices attached
cf668fa	device
emulator-555	device
196.168.1.150:5555	device
复制代码

这里的cf668fa以及emulator-555196.168.1.150:5555都称为serialNumber。

停止/启动

adb start-server
复制代码

启动adb,但是由于系统会自动启动,无需主动调用

adb kill-server
复制代码

停止adb,多用于PC存在多个adb时,全部关闭

查看adb的版本

adb version 
复制代码

运行后结果如下:

可见版本为1.0.40. 安装地址在 D:\SDK\platform-tools\adb.exe.但是需要在环境变量中配置adb的path路径。

root权限

adb虽然可以用来做一些Root操作,但是前提是设备必须具备root权限,学习可以考虑用虚拟机。 命令:

adb root
复制代码

恢复root:

adb unroot
复制代码

设置adb的网络端口

命令:

adb -P <port> start-server
复制代码

这个几乎很少使用,不知到具体用处,之后补充记录

设备连接

查询设备

查询当前adb连接的设备信息

adb devices
复制代码
List of devices attached
0000119030001002        device
复制代码

输出的组成格式为[serialNumber] [state],其中0000119030001002为设备编号SN,device为设备的状态。设备的状态可以分为以下几种:

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

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

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

该命令为常用命令,多会使用。

USB连接

USB连接就是通过USB线,以及adb来连接Android设备,也是开发工作中使用得最多的连接方式。一般手机需要打开[ 设置」-「开发者选项」-「Android 调试」。如果没有该选项,可以到「设置」-「关于手机」连续点击「版本号」可以打开开发者选项。

USB无线

其实除了USB连接设备外,还可以通过无线网的方式连接,虽然开始需要USB线连接,但是想想可以离开USB线的限制,是不是也有一点小激动呢。操作步骤如下

  • 首先,确认PC和设备是处于同一局域网下,比如同一个路由下的wiffi。这是非常重要的。
  • 其次,将PC和设备通过USB连接在一起,通过adb devices确认是否连接成功.
  • 然后,让设备在555端口监听TCP/IP 连接,当然部分特殊设备端口不是555,酌情调整:
adb tcpip 555
复制代码
  • 之后,断开USB线连接
  • 通过手机自身的设置」-「关于手机」-「状态信息」-「IP地址」或者(推荐后者)通过adb命令去获取设备的ip地址adb shell ifconfig | grep Mask.
  • 使用命令行和得到的IP地址连接设备
adb connect <device-ip-address>
复制代码

<device-ip-address>也就是之前找到的ip地址.

  • 最后,使用adb devices检测是否成功连接设备

无线连接(root)

无线连接的首要条件就是需要root权限.所以一开始就是adb root开启root权限。然后操作步骤与USB一样,但是无需连接USB线。 将 Android 设备与要运行 adb 的电脑连接到同一个局域网,比如连到同一个 WiFi。

  • 首先,打开 Android 设备上的终端模拟器,在里面依次运行命令:
su
setprop service.adb.tcp.port 5555
复制代码
  • 再者,通过手机自身的设置」-「关于手机」-「状态信息」-「IP地址」或者(推荐后者)通过adb命令去获取设备的ip地址adb shell ifconfig | grep Mask.

  • 最后,在电脑上通过 adb 和 IP 地址连接 Android 设备。

adb connect <device-ip-address>
复制代码

这里的<device-ip-address> 就是上一步中找到的设备 IP 地址。

如果能看到 connected to <device-ip-address>:端口 这样的输出则表示连接成功。

Package管理

查阅应用列表

查阅应用列表的adb命令行模式如下:

adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]
复制代码

前部分adb shell pm list packages为获取当前设备中所有应用的package信息,后面为过滤符。其中支持的过滤参数列表整理如下:

参数显示列表
所有应用
-f显示应用关联的 apk 文件
-d只显示 disabled 的应用
-e只显示 enabled 的应用
-s只显示系统应用
-3只显示第三方应用
-i显示应用的 installer
-u包含已卸载应用
<FILTER>包名包含 <FILTER> 字符串

ps:<FILTER>除了直接可以过滤外,还可以使用grep做筛选 比如:

adb shell pm list packages clouwalk
复制代码

adb shell pm list packages |grep cloudwalk
复制代码

(部分设备不支持)

安装应用

安装应用为常用的adb命令行,其格式如下:

adb install [-xxx] <apk_path>
复制代码

其中xxx为修饰参数,用来指定应用apk的安装方式,具体可以有以下几种修饰方式:

参数含义
-l将应用安装到保护目录 /mnt/asec
-r允许覆盖安装
-t允许安装 AndroidManifest.xml 里 application 指定 android:testOnly="true" 的应用
-s将应用安装到 sdcard
-d允许降级覆盖安装
-g授予所有运行时权限

出现如Success标识,代表安装成功。出现Failure [xxx],代表失败.常见的失败选项如下:

输出含义解决方法
INSTALL_FAILED_ALREADY_EXISTS应用已经存在,或卸载了但没卸载干净adb install 时使用 -r 参数,或者先 adb uninstall <packagename> 再安装
INSTALL_FAILED_INVALID_APK无效的 APK 文件检查apk文件的完整性和有效性
INSTALL_FAILED_INVALID_URI无效的 APK 文件名确保 APK 命名文件名里无中文或特殊字符
INSTALL_FAILED_INSUFFICIENT_STORAGE空间不足清理空间
INSTALL_FAILED_DUPLICATE_PACKAGE已经存在同名程序更改应用名或adb uninstall <packagename> 再安装
INSTALL_FAILED_NO_SHARED_USER请求的共享用户不存在
INSTALL_FAILED_UPDATE_INCOMPATIBLE以前安装过同名应用,但卸载时数据没有移除;或者已安装该应用,但签名不一致adb uninstall <packagename> 再安装
INSTALL_FAILED_SHARED_USER_INCOMPATIBLE请求的共享用户存在但签名不一致
INSTALL_FAILED_MISSING_SHARED_LIBRARY安装包使用了设备上不可用的共享库
INSTALL_FAILED_REPLACE_COULDNT_DELETE替换时无法删除
INSTALL_FAILED_DEXOPTdex 优化验证失败或空间不足
INSTALL_FAILED_OLDER_SDK设备系统版本低于应用要求
INSTALL_FAILED_CONFLICTING_PROVIDER设备里已经存在与应用里同名的 content provider
INSTALL_FAILED_NEWER_SDK设备系统版本高于应用要求
INSTALL_FAILED_TEST_ONLY应用是 test-only 的,但安装时没有指定 -t 参数
INSTALL_FAILED_CPU_ABI_INCOMPATIBLE包含不兼容设备 CPU 应用程序二进制接口的 native code
INSTALL_FAILED_MISSING_FEATURE应用使用了设备不可用的功能
INSTALL_FAILED_CONTAINER_ERROR1. sdcard 访问失败;
2. 应用签名与 ROM 签名一致,被当作内置应用。
1. 确认 sdcard 可用,或者安装到内置存储;
2. 打包时不与 ROM 使用相同签名。
INSTALL_FAILED_INVALID_INSTALL_LOCATION1. 不能安装到指定位置;
2. 应用签名与 ROM 签名一致,被当作内置应用。
1. 切换安装位置,添加或删除 -s 参数;
2. 打包时不与 ROM 使用相同签名。
INSTALL_FAILED_MEDIA_UNAVAILABLE安装位置不可用一般为 sdcard,确认 sdcard 可用或安装到内置存储
INSTALL_FAILED_VERIFICATION_TIMEOUT验证安装包超时
INSTALL_FAILED_VERIFICATION_FAILURE验证安装包失败
INSTALL_FAILED_PACKAGE_CHANGED应用与调用程序期望的不一致
INSTALL_FAILED_UID_CHANGED以前安装过该应用,与本次分配的 UID 不一致清除以前安装过的残留文件
INSTALL_FAILED_VERSION_DOWNGRADE已经安装了该应用更高版本使用 -d 参数
INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE已安装 target SDK 支持运行时权限的同名应用,要安装的版本不支持运行时权限
INSTALL_PARSE_FAILED_NOT_APK指定路径不是文件,或不是以 .apk 结尾
INSTALL_PARSE_FAILED_BAD_MANIFEST无法解析的 AndroidManifest.xml 文件
INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION解析器遇到异常
INSTALL_PARSE_FAILED_NO_CERTIFICATES安装包没有签名
INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES已安装该应用,且签名与 APK 文件不一致先卸载设备上的该应用,再安装
INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING解析 APK 文件时遇到 CertificateEncodingException
INSTALL_PARSE_FAILED_BAD_PACKAGE_NAMEmanifest 文件里没有或者使用了无效的包名
INSTALL_PARSE_FAILED_BAD_SHARED_USER_IDmanifest 文件里指定了无效的共享用户 ID
INSTALL_PARSE_FAILED_MANIFEST_MALFORMED解析 manifest 文件时遇到结构性错误
INSTALL_PARSE_FAILED_MANIFEST_EMPTY在 manifest 文件里找不到找可操作标签(instrumentation 或 application)
INSTALL_FAILED_INTERNAL_ERROR因系统问题安装失败
INSTALL_FAILED_USER_RESTRICTED用户被限制安装应用在开发者选项里将「USB安装」打开,如果已经打开了,那先关闭再打开。
INSTALL_FAILED_DUPLICATE_PERMISSION应用尝试定义一个已经存在的权限名称
INSTALL_FAILED_NO_MATCHING_ABIS应用包含设备的应用程序二进制接口不支持的 native code
INSTALL_CANCELED_BY_USER应用安装需要在设备上确认,但未操作设备或点了取消在设备上同意安装
INSTALL_FAILED_ACWF_INCOMPATIBLE应用程序与设备不兼容
INSTALL_FAILED_TEST_ONLYAPK 文件是使用 Android Studio 直接 RUN 编译出来的文件通过 Gradle 的 assembleDebug 或 assembleRelease 重新编译,或者 Generate Signed APK
does not contain AndroidManifest.xml无效的 APK 文件
is not a valid zip file无效的 APK 文件
Offline设备未连接成功先将设备与 adb 连接成功
unauthorized设备未授权允许调试
error: device not found没有连接成功的设备先将设备与 adb 连接成功
protocol failure设备已断开连接先将设备与 adb 连接成功
Unknown option: -sAndroid 2.2 以下不支持安装到 sdcard不使用 -s 参数
No space left on device空间不足清理空间
Permission denied ... sdcard ...sdcard 不可用
signatures do not match the previously installed version; ignoring!已安装该应用且签名不一致先卸载设备上的该应用,再安装

参考:PackageManager.java adb install 实际是分三步完成:

push apk 文件到 /data/local/tmp。

调用 pm install 安装。

删除 /data/local/tmp 下的对应 apk 文件。

所以,必要的时候也可以根据这个步骤,手动分步执行安装过程。

卸载应用

命令:

adb uninstall [-k] <packagename>
复制代码

<packagename> 表示应用的包名,-k参数可选,表示卸载应用但保留数据和缓存目录。

命令示例:

adb uninstall com.qihoo360.mobilesafe
复制代码

表示卸载设备上的360 手机卫士。

清除应用数据和缓存数据

adb shell pm clear <packagename>
复制代码

例如:

adb shell pm clear com.tecent.mobleqq
复制代码

这个命令就可以清除掉手机QQ上所有的本地缓存数据和应用数据。这个命令为常用命令

查看正在运行的service

adb shell dumpsys activity services [<packagename>]
复制代码

<packagename> 参数不是必须的,指定<packagename>表示查看与某个包名相关的 Services,不指定表示查看所有 Services。

<packagename> 不一定要给出完整的包名

查看应用详细信息

adb shell dumpsys package <packagename>
复制代码

输出中包含很多信息,包括 Activity Resolver Table、Registered ContentProviders、包名、userId、安装后的文件资源代码等路径、版本信息、权限信息和授予状态、签名版本信息等。

<packagename> 表示应用包名。

查看应用安装途径

adb shell pm path <PACKAGE>
复制代码

输出应用安装路径.效果如下:

应用交互

与应用交互的关键字为am <command>命令,常用的command命令如下:

command用途
start [options] <INTENT>启动 <INTENT> 指定的 Activity
startservice [options] <INTENT>启动 <INTENT> 指定的 Service
broadcast [options] <INTENT>发送 <INTENT> 指定的广播
force-stop <packagename>停止 <packagename> 相关的进程

<INTENT> 参数很灵活,和写 Android 程序时代码里的 Intent 相对应。 用于决定 intent 对象的选项如下:

参数含义
-a <ACTION>指定 action,比如 android.intent.action.VIEW
-c <CATEGORY>指定 category,比如 android.intent.category.APP_CONTACTS
-n <COMPONENT>指定完整 component 名,用于明确指定启动哪个 Activity,如 com.example.app/.ExampleActivity

启动应用/ 调起 Activity

adb shell am start [options] <INTENT>
复制代码

例如:

adb shell am start -n com.tencent.mm/.ui.LauncherUI
复制代码

该命令可以启动微信

启动service

adb shell am startservice [options] <INTENT>
复制代码

例如:

adb shell am startservice -n com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService
复制代码

表示调起微信的某 Service。

另外一个典型的用例是如果设备上原本应该显示虚拟按键但是没有显示,可以试试这个:

adb shell am startservice -n com.android.systemui/.SystemUIService
复制代码

停止service

adb shell am stopservice [options] <INTENT>
复制代码

发送广播

adb shell am broadcast [options] <INTENT>
复制代码

可以向所有组件广播,也可以只向指定组件广播。

例如,向所有组件广播 BOOT_COMPLETED:

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
复制代码

又例如,只向 org.mazhuang.boottimemeasure/.BootCompletedReceiver 广播 BOOT_COMPLETED:

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n org.mazhuang.boottimemeasure/.BootCompletedReceive
复制代码

这类用法在测试的时候很实用,比如某个广播的场景很难制造,可以考虑通过这种方式来发送广播。 既能发送系统预定义的广播,也能发送自定义广播。如下是部分系统预定义广播及正常触发时机:

action触发时机
android.net.conn.CONNECTIVITY_CHANGE网络连接发生变化
android.intent.action.SCREEN_ON屏幕点亮
android.intent.action.SCREEN_OFF屏幕熄灭
android.intent.action.BATTERY_LOW电量低,会弹出电量低提示框
android.intent.action.BATTERY_OKAY电量恢复了
android.intent.action.BOOT_COMPLETED设备启动完毕
android.intent.action.DEVICE_STORAGE_LOW存储空间过低
android.intent.action.DEVICE_STORAGE_OK存储空间恢复
android.intent.action.PACKAGE_ADDED安装了新的应用
android.net.wifi.STATE_CHANGEWiFi 连接状态发生变化
android.net.wifi.WIFI_STATE_CHANGEDWiFi 状态变为启用/关闭/正在启动/正在关闭/未知
android.intent.action.BATTERY_CHANGED电池电量发生变化
android.intent.action.INPUT_METHOD_CHANGED系统输入法发生变化
android.intent.action.ACTION_POWER_CONNECTED外部电源连接
android.intent.action.ACTION_POWER_DISCONNECTED外部电源断开连接
android.intent.action.DREAMING_STARTED系统开始休眠
android.intent.action.DREAMING_STOPPED系统停止休眠
android.intent.action.WALLPAPER_CHANGED壁纸发生变化
android.intent.action.HEADSET_PLUG插入耳机
android.intent.action.MEDIA_UNMOUNTED卸载外部介质
android.intent.action.MEDIA_MOUNTED挂载外部介质
android.os.action.POWER_SAVE_MODE_CHANGED省电模式开启

(以上广播均可使用 adb 触发)

强制停止应用

命令:

adb shell am force-stop 命令示例:

adb shell am force-stop com.qihoo360.mobilesafe 表示停止 360 安全卫士的一切进程与服务

文件管理

复制设备里的文件到本地

该命令为常用命令,多用于导出log日志和一些关键文件。

adb pull <设备里的文件路径> [电脑上的目录]
复制代码

其中 电脑上的目录 参数可以省略,默认复制到当前目录。

复制电脑上的文件到设备

adb push <电脑上的文件路径> <设备里的目录>
复制代码

其中电脑上的文件路径既可以是绝对路径也可以是相对路径。

模拟按键输入

在某些测试情况下,可以通过编写bat命令行来做相应的测试,这就需要模拟按键输入。并且在一些特殊的设备,没有物理按键的情况下,也需要模拟按键输入。该命令在adb shell命令下的input下,在adb下使用help可以得到如下的信息:

Usage: input [<source>] <command> [<arg>...]

The sources are:
      mouse
      keyboard
      joystick
      touchnavigation
      touchpad
      trackball
      stylus
      dpad
      gesture
      touchscreen
      gamepad

The commands and default sources are:
      text <string> (Default: touchscreen)
      keyevent [--longpress] <key code number or name> ... (Default: keyboard)
      tap <x> <y> (Default: touchscreen)
      swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)
      press (Default: trackball)
      roll <dx> <dy> (Default: trackball)
复制代码

比如使用 adb shell input keyevent 命令,不同的 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 命令的一些用法举例。

电源键

命令:

adb shell input keyevent 26
复制代码

执行效果相当于按电源键。

菜单键

命令:

adb shell input keyevent 82
复制代码

HOME 键

命令:

adb shell input keyevent 3
复制代码

返回键

命令:

adb shell input keyevent 4
复制代码

音量控制

增加音量:

adb shell input keyevent 24
复制代码

降低音量:

adb shell input keyevent 25
复制代码

静音:

adb shell input keyevent 164
复制代码

媒体控制

播放/暂停:

adb shell input keyevent 85
复制代码

停止播放:

adb shell input keyevent 86
复制代码

播放下一首:

adb shell input keyevent 87
复制代码

播放上一首:

adb shell input keyevent 88
复制代码

恢复播放:

adb shell input keyevent 126
复制代码

暂停播放:

adb shell input keyevent 127
复制代码

点亮/熄灭屏幕

可以通过上文讲述过的模拟电源键来切换点亮和熄灭屏幕,但如果明确地想要点亮或者熄灭屏幕,那可以使用如下方法。

点亮屏幕:

adb shell input keyevent 224
复制代码

熄灭屏幕:

adb shell input keyevent 223
复制代码

滑动解锁

如果锁屏没有密码,是通过滑动手势解锁,那么可以通过 input swipe 来解锁。

命令(参数以机型 Nexus 5,向上滑动手势解锁举例):

adb shell input swipe 300 1000 300 500
复制代码

参数 300 1000 300 500 分别表示起始点x坐标 起始点y坐标 结束点x坐标 结束点y坐标

输入文本

在焦点处于某文本框时,可以通过 input 命令来输入文本。

命令:

adb shell input text hello
复制代码

现在 hello 出现在文本框了。

Android日志查看

从Android日志方面分为底层的 Linux 内核和Android 的日志。底层的 Linux 内核日志输出到 /proc/kmsg,Android 的日志输出到 /dev/log。,两者存储位置完全不一样。

Android日志

[adb] logcat [<option>] ... [<filter-spec>] ...
复制代码

对于其中常用的用法如下:

按级别过滤日志

Android系统对于日志按照优先级(priority)进行分级,分级情况如下:

  • V —— Verbose(最低,输出得最多)
  • D —— Debug
  • I —— Info
  • W —— Warning
  • E —— Error
  • F —— Fatal
  • S —— Silent(最高,啥也不输出) 其中常用的为前四种。排序为从低到高。使用时按某级别过滤日志则会将该级别及以上的日志输出。

比如,命令:

adb logcat *:W
复制代码

会将 Warning、Error、Fatal 和 Silent 日志输出。 (注: 在 macOS 下需要给 *:W 这样以 * 作为 tag 的参数加双引号,如 adb logcat "*:W",不然会报错 no matches found: *:W。)

按照tag和级别过滤日志

<filter-spec> 可以由多个 <tag>[:priority]组成。

比如,命令:

adb logcat ActivityManager:I MyApp:D *:S
复制代码

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

日志格式

清空日志

adb logcat -c
复制代码

内核日志

adb shell dmesg
复制代码

我这里运行结果如下:

[  826.802773] init: Service 'mediacodec' (pid 241) killed by signal 6
[  826.802849] init: Service 'mediacodec' (pid 241) killing any children in process group
[  826.805858] init: Starting service 'mediacodec'...
[  826.806083] rk-vcodec ff650000.vpu_service: closed
[  826.808325] binder: send failed reply for transaction 291855 to 232:745
[  826.866578] binder: 219:219 transaction failed 29189/0, size 96-0 line 2880
[ 2962.286136] hrtimer: interrupt took 228959 ns
复制代码

[]中为运行的内核开始启动后的时间,单位为秒。

查看设备信息

设备型号

adb shell getprop ro.product.model
复制代码

我的为:

XiaoMi Note 3
复制代码

设备电池状态

adb shell dumpsys battery
复制代码

该命令可以获取设备的电池信息,结果如下:

Current Battery Service state:
  AC powered: true
  USB powered: false
  Wireless powered: false
  Max charging current: 0
  Max charging voltage: 0
  Charge counter: 0
  status: 2
  health: 2
  present: true
  level: 100
  scale: 100
  voltage: 0
  temperature: 424
  technology:
复制代码

其中 scale 代表最大电量,level 代表当前电量,这里代表电量为满电。

屏幕分辨率

adb shell wm size
复制代码

设备结果:

Physical size: 1920x1080
复制代码

该设备的物理分辨率为1920x1080.

屏幕密度

adb shell wm density
复制代码

这个在定制开发的时候常用的参数,用来决定dp和px之间的参数比.结果格式:

Physical density: 320
复制代码

该屏幕的密度为320dpi(Android设备基础dpi为160dpi)

显示屏参数

adb shell dumpsys window displays
复制代码

结果:

WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)
 Display: mDisplayId=0
   init=1920x1080 320dpi cur=1920x1080 app=1824x1080 rng=1080x1032-1824x1776
   deferred=false layoutNeeded=false
复制代码

mDisplayId为屏幕显示id,init为屏幕分辨率,init 是初始分辨率和屏幕密度,app为可用界面,相当于排除非物理按键后的屏幕分辨率。

android_id

adb shell settings get secure android_id
复制代码

结果:7b666149274fbd13 什么是android_id?google 原文 A hardware serial number, if available.(一个硬件的序列码,如果有效的话)

IMEI(Device ID)

android 4.4及以下版本可以通过以下命令获取IMEI值:

adb shell dumpsys iphonesubinfo
复制代码

其中的 Device ID 就是IMEI

而在 Android 5.0 及以上版本里这个命令输出为空,得通过其它方式获取了(需要 root 权限):

adb shell
su
service call iphonesubinfo 1
复制代码

运行结果: Result: Parcel( 0x00000000: 00000000 0000000f 00360038 00370039 '........8.6.9.7.' 0x00000010: 00360035 00340030 00300033 00380030 '5.6.0.4.3.0.0.8.' 0x00000020: 00380037 00000035 '7.8.5... ') 其中有效数字就是IMEI值:869756043008785

Android系统版本

adb shell getprop ro.build.version.release
复制代码

结果:7.1.2,这就是系统版本号

IP地址

每次想知道设备的 IP 地址的时候都得「设置」-「关于手机」-「状态信息」-「IP地址」很烦对不对?通过 adb 可以方便地查看。

adb shell ifconfig 
复制代码

结果:

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope: Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:709503 errors:0 dropped:0 overruns:0 frame:0
          TX packets:709503 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:75473583 TX bytes:75473583
复制代码

这里的设备地址为:127.0.0.1(loacal地址)

Mac 地址

adb shell
cat /sys/class/net/wlan0/address
复制代码

当然部分设备无法成功获取

CPU 信息

adb shell
cat /proc/cpuinfo
复制代码

结果:

processor       : 0
BogoMIPS        : 48.00
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

processor       : 1
BogoMIPS        : 48.00
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

processor       : 2
BogoMIPS        : 48.00
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

processor       : 3
BogoMIPS        : 48.00
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

processor       : 4
BogoMIPS        : 48.00
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd08
CPU revision    : 2

processor       : 5
BogoMIPS        : 48.00
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd08
CPU revision    : 2

Serial          : d59a3c2fc7c848c4
复制代码

可以分析出设备为6核。

内存信息

adb shell 
cat /proc/meminfo
复制代码

结果:

MemTotal:        2021484 kB
MemFree:           65888 kB
MemAvailable:     784708 kB
Buffers:             284 kB
Cached:           923468 kB
SwapCached:          196 kB
Active:          1154216 kB
Inactive:         526232 kB
Active(anon):     690720 kB
Inactive(anon):   229288 kB
Active(file):     463496 kB
Inactive(file):   296944 kB
Unevictable:         256 kB
Mlocked:             256 kB
SwapTotal:        520908 kB
SwapFree:         475536 kB
Dirty:              1764 kB
Writeback:             0 kB
AnonPages:        756924 kB
Mapped:           246860 kB
Shmem:            163312 kB
Slab:              92916 kB
SReclaimable:      41080 kB
SUnreclaim:        51836 kB
KernelStack:       13760 kB
PageTables:        16476 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     1531648 kB
Committed_AS:   63485416 kB
VmallocTotal:   258867136 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
CmaTotal:          16384 kB
CmaFree:           13800 kB
复制代码

其中,MemTotl 就是设备的总内存,MemFree 是当前空闲内存。

修改设置

注: 修改设置之后,运行恢复命令有可能显示仍然不太正常,可以运行 adb reboot 重启设备,或手动重启。

修改设置的原理主要是通过 settings 命令修改 /data/data/com.android.providers.settings/databases/settings.db 里存放的设置值。

分辨率

adb shell wm size 480x1024
复制代码

表示将分辨率修改为 480px * 1024px

恢复原分辨率命令:

adb shell wm size reset
复制代码

屏幕密度

adb shell wm density 160
复制代码

将屏幕密度修改为160dpi. 恢复原屏幕密度命令:

adb shell wm density reset
复制代码

显示区域

adb shell wm overscan 0,0,0,200
复制代码

四个数字分别表示距离左、上、右、下边缘的留白像素,以上命令表示将屏幕底部 200px 留白。

恢复原显示区域命令:

adb shell wm overscan reset
复制代码

关闭USB调试模式

adb shell settings put global adb_enabled 0
复制代码

但是关闭后就无法恢复了,需要到【开发者模式】去开启

实用功能

屏幕截图

截图保存到电脑:

adb exec-out screencap -p > sc.png
复制代码

如果 adb 版本较老,无法使用 exec-out 命令,这时候建议更新 adb 版本。无法更新的话可以使用以下麻烦点的办法:

先截图保存到设备里:

adb shell screencap -p /sdcard/sc.png 然后将 png 文件导出到电脑:

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

参数含义
-p指定保存文件为 png 格式
-d display-id指定截图的显示屏编号(有多显示屏的情况下)

实测如果指定文件名以.png 结尾时可以省略-p参数;否则需要使用 -p 参数。如果不指定文件名,截图文件的内容将直接输出到 stdout。

录制屏幕

录制屏幕以 mp4 格式保存到 /sdcard:

adb shell screenrecord /sdcard/filename.mp4
复制代码

需要停止时按 Ctrl-C,默认录制时间和最长录制时间都是 180 秒。

如果需要导出到电脑:

adb pull /sdcard/filename.mp4
复制代码

可以使用 adb shell screenrecord --help查看 screenrecord 命令的帮助信息,下面是常见参数及含义:

参数含义
--size WIDTHxHEIGHT视频的尺寸,比如 1280x720,默认是屏幕分辨率。
--bit-rate RATE视频的比特率,默认是 4Mbps。
--time-limit TIME录制时长,单位秒。
--verbose输出更多信息。

查看连接过的 WiFi 密码

注:需要 root 权限. 命令:

adb shell
su
cat /data/misc/wifi/*.conf
复制代码

输出结果:

network={
	ssid="TP-LINK_9DFC"
	scan_ssid=1
	psk="123456789"
	key_mgmt=WPA-PSK
	group=CCMP TKIP
	auth_alg=OPEN
	sim_num=1
	priority=13893
}

network={
	ssid="TP-LINK_F11E"
	psk="987654321"
	key_mgmt=WPA-PSK
	sim_num=1
	priority=17293
}
复制代码

ssid 即为我们在 WLAN 设置里看到的名称,psk 为密码,key_mgmt 为安全加密方式。

设置系统日期和时间

注:需要 root 权限。

命令:

adb shell
su
date -s 20160823.131500
复制代码

表示将系统日期和时间更改为 2016 年 08 月 23 日 13 点 15 分 00 秒。

重启设备

adb reboot
复制代码

检测设备是否已 root

命令:

adb shell
su
复制代码

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

使用Monkey调试设备

Monkey 可以生成伪随机用户事件来模拟单击、触摸、手势等操作,可以对正在开发中的程序进行随机压力测试。

简单用法:

adb shell monkey -p <packagename> -v 500
复制代码

表示向<packagename> 指定的应用程序发送 500 个伪随机事件。 Monkey 的详细用法参考官方文档,当然需要翻墙。

开启/关闭 WiFi

注:需要 root 权限。 有时需要控制设备的 WiFi 状态,可以用以下指令完成。

开启 WiFi:

adb root
adb shell svc wifi enable
复制代码

关闭 WiFi:

adb root
adb shell svc wifi disable
复制代码

若执行成功,输出为空;若未取得 root 权限执行此命令,将执行失败,输出 Killed。

刷机相关命令

重启到Recovery模式

命令:

adb reboot recovery
复制代码

从 Recovery 重启到 Android

命令:

adb reboot
复制代码

重启到 Fastboot 模式

命令:

adb reboot bootloader
复制代码

通过 sideload 更新系统

如果我们下载了 Android 设备对应的系统更新包到电脑上,那么也可以通过 adb 来完成更新。

以 Recovery 模式下更新为例:

1.重启到 Recovery 模式。

命令:

adb reboot recovery
复制代码

2.在设备的 Recovery 界面上操作进入 Apply update-Apply from ADB。

注:不同的 Recovery 菜单可能与此有差异,有的是一级菜单就有 Apply update from ADB。

3.通过 adb 上传和更新系统。

命令:

adb sideload <path-to-update.zip>
复制代码

更多 adb shell 命令

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

查看进程

adb shell ps
复制代码

结果:

USER      PID   PPID  VSIZE  RSS   WCHAN              PC  NAME
root      1     0     10628  2192           0 0000000000 S /init
root      2     0     0      0              0 0000000000 S kthreadd
root      3     2     0      0              0 0000000000 S ksoftirqd/0
root      4     2     0      0              0 0000000000 S kworker/0:0
root      5     2     0      0              0 0000000000 S kworker/0:0H
root      6     2     0      0              0 0000000000 S kworker/u12:0
root      7     2     0      0              0 0000000000 S rcu_preempt
...
复制代码

其中各个列表的含义如下:

列名含义
USER应用所属用户
PID进程ID
PPID父进程ID
NAME进程名

查看实时资源占用情况

adb shell top
复制代码

结果:

User 15%, System 6%, IOW 0%, IRQ 2%
User 70 + Nice 198 + Sys 119 + Idle 1328 + IOW 0 + IRQ 0 + SIRQ 53 = 1768

  PID USER     PR  NI CPU% S  #THR     VSS     RSS PCY Name
 1675 system   10 -10  15% S    67 3692336K 586336K  ta cn.cloudwalk.app
  231 camerase 20   0   4% S    15 111520K  40072K  fg /system/bin/cameraserver
  214 system   -2  -8   2% S    30 296260K  22412K unk /system/bin/surfaceflinger
  442 system   18  -2   0% S    88 3773608K 199724K  fg system_server
 2034 shell    20   0   0% R     1   9112K   3180K  fg top
    3 root     20   0   0% S     1      0K      0K  fg ksoftirqd/0
  649 radio    20   0   0% S    31 2825084K 110728K  fg com.android.phone
  720 media_rw 20   0   0% S     4  13868K   3344K  fg /system/bin/sdcard
   50 root     RT   0   0% S     1      0K      0K  fg cfinteractive
  164 root     -2   0   0% S     1      0K      0K  fg mmcqd/1
    7 root     20   0   0% S     1      0K      0K  fg rcu_preempt
  160 root      0 -20   0% S     1      0K      0K  fg kworker/u13:1
    8 root     20   0   0% S     1      0K      0K  fg rcu_sched
  159 root      0 -20   0% S     1      0K      0K  fg kworker/u13:0
   18 root     RT   0   0% S     1      0K      0K  fg migration/2
   19 root     20   0   0% S     1      0K      0K  fg ksoftirqd/2
   20 root     20   0   0% S     1      0K      0K  fg kworker/2:0
   21 root      0 -20   0% S     1      0K      0K  fg kworker/2:0H
   22 root     RT   0   0% S     1      0K      0K  fg watchdog/3
   ...
复制代码

其中各个列的含义如下:

列名含义
PID进程 ID
PR优先级
CPU%当前瞬间占用 CPU 百分比
S进程状态(R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程)
#THR线程数
VSSVirtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSSResident Set Size 实际使用物理内存(包含共享库占用的内存)
PCY调度策略优先级,SP_BACKGROUND/SPFOREGROUND
UID进程所有者的用户 ID
NAME进程名

top命令后面还可以添加一些命令行参数来限制。详细的用法如下:

Usage: top [ -m max_procs ] [ -n iterations ] [ -d delay ] [ -s sort_column ] [ -t ] [ -h ]
    -m num  最多显示多少个进程
    -n num  刷新多少次后退出
    -d num  刷新时间间隔(单位秒,默认值 5)
    -s col  按某列排序(可用 col 值:cpu, vss, rss, thr)
    -t      显示线程信息
    -h      显示帮助文档
复制代码

查看进程的UID

该任务有两种实现方式:

  1. adb shell dumpsys package <packagename> | grep userId=

在高版本可能会提醒grep不可用,可以将grep换成findstr,

adb shell dumpsys package <packagename> | findstr userId

结果:

    userId=1000
    userId=1000
    userId=1000
复制代码

2.通过 ps 命令找到对应进程的 pid 之后adb shell cat /proc/<pid>/status | grep Uid

结果:

D:\work\206cwmenjyuny-master>adb shell
rk3399_mid:/ $ ps|grep cn.cloudwalk.app
system    1409  229   3689804 580168          0 0000000000 S cn.cloudwalk.app
rk3399_mid:/ $ cat /proc/1409/status | grep Uid
Uid:    1000    1000    1000    1000
rk3399_mid:/ $
复制代码

其它

如下是其它常用命令的简单描述,前文已经专门讲过的命令不再额外说明:

命令功能
cat显示文件内容
cd切换目录
chmod改变文件的存取模式/访问权限
df查看磁盘空间使用情况
grep过滤输出
kill杀死指定 PID 的进程
ls列举目录内容
mount挂载目录的查看和管理
mv移动或重命名文件
ps查看正在运行的进程
rm删除文件
top查看进程的资源占用情况

参考目录:

转载于:https://juejin.im/post/5cb93bf0f265da03937863b8

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值