adb基本命令

基本用法

基本命令

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

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

  2. 复制代码

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

为命令行指定目标设备

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

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

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

 
  1. $ adb devices

  2.  
  3. List of devices attached

  4. cf668fa device

  5. emulator-555 device

  6. 196.168.1.150:5555 device

  7. 复制代码

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

停止/启动

 
  1. adb start-server

  2. 复制代码

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

 
  1. adb kill-server

  2. 复制代码

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

查看adb的版本

 
  1. adb version

  2. 复制代码

运行后结果如下:

 

 

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

 

root权限

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

 
  1. adb root

  2. 复制代码

恢复root:

 
  1. adb unroot

  2. 复制代码

设置adb的网络端口

命令:

 
  1. adb -P <port> start-server

  2. 复制代码

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

设备连接

查询设备

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

 
  1. adb devices

  2. 复制代码

 
  1. List of devices attached

  2. 0000119030001002 device

  3. 复制代码

输出的组成格式为[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,酌情调整:
 
  1. adb tcpip 555

  2. 复制代码

  • 之后,断开USB线连接
  • 通过手机自身的设置」-「关于手机」-「状态信息」-「IP地址」或者(推荐后者)通过adb命令去获取设备的ip地址adb shell ifconfig | grep Mask.
  • 使用命令行和得到的IP地址连接设备
 
  1. adb connect <device-ip-address>

  2. 复制代码

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

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

无线连接(root)

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

  • 首先,打开 Android 设备上的终端模拟器,在里面依次运行命令:
 
  1. su

  2. setprop service.adb.tcp.port 5555

  3. 复制代码

  • 再者,通过手机自身的设置」-「关于手机」-「状态信息」-「IP地址」或者(推荐后者)通过adb命令去获取设备的ip地址adb shell ifconfig | grep Mask.

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

 
  1. adb connect <device-ip-address>

  2. 复制代码

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

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

Package管理

查阅应用列表

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

 
  1. adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]

  2. 复制代码

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

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

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

 
  1. adb shell pm list packages clouwalk

  2. 复制代码

 
  1. adb shell pm list packages |grep cloudwalk

  2. 复制代码

(部分设备不支持)

安装应用

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

 
  1. adb install [-xxx] <apk_path>

  2. 复制代码

其中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 文件。

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

卸载应用

命令:

 
  1. adb uninstall [-k] <packagename>

  2. 复制代码

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

命令示例:

 
  1. adb uninstall com.qihoo360.mobilesafe

  2. 复制代码

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

清除应用数据和缓存数据

 
  1. adb shell pm clear <packagename>

  2. 复制代码

例如:

 
  1. adb shell pm clear com.tecent.mobleqq

  2. 复制代码

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

查看正在运行的service

 
  1. adb shell dumpsys activity services [<packagename>]

  2. 复制代码

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

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

查看应用详细信息

 
  1. adb shell dumpsys package <packagename>

  2. 复制代码

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

<packagename> 表示应用包名。

查看应用安装途径

 
  1. adb shell pm path <PACKAGE>

  2. 复制代码

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

 

 

 

应用交互

与应用交互的关键字为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

 
  1. adb shell am start [options] <INTENT>

  2. 复制代码

例如:

 
  1. adb shell am start -n com.tencent.mm/.ui.LauncherUI

  2. 复制代码

该命令可以启动微信

启动service

 
  1. adb shell am startservice [options] <INTENT>

  2. 复制代码

例如:

 
  1. adb shell am startservice -n com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService

  2. 复制代码

表示调起微信的某 Service。

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

 
  1. adb shell am startservice -n com.android.systemui/.SystemUIService

  2. 复制代码

停止service

 
  1. adb shell am stopservice [options] <INTENT>

  2. 复制代码

发送广播

 
  1. adb shell am broadcast [options] <INTENT>

  2. 复制代码

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

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

 
  1. adb shell am broadcast -a android.intent.action.BOOT_COMPLETED

  2. 复制代码

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

 
  1. adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n org.mazhuang.boottimemeasure/.BootCompletedReceive

  2. 复制代码

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

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日志和一些关键文件。

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

  2. 复制代码

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

复制电脑上的文件到设备

 
  1. adb push <电脑上的文件路径> <设备里的目录>

  2. 复制代码

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

模拟按键输入

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

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

  2.  
  3. The sources are:

  4. mouse

  5. keyboard

  6. joystick

  7. touchnavigation

  8. touchpad

  9. trackball

  10. stylus

  11. dpad

  12. gesture

  13. touchscreen

  14. gamepad

  15.  
  16. The commands and default sources are:

  17. text <string> (Default: touchscreen)

  18. keyevent [--longpress] <key code number or name> ... (Default: keyboard)

  19. tap <x> <y> (Default: touchscreen)

  20. swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)

  21. press (Default: trackball)

  22. roll <dx> <dy> (Default: trackball)

  23. 复制代码

比如使用 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 命令的一些用法举例。

电源键

命令:

 
  1. adb shell input keyevent 26

  2. 复制代码

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

菜单键

命令:

 
  1. adb shell input keyevent 82

  2. 复制代码

HOME 键

命令:

 
  1. adb shell input keyevent 3

  2. 复制代码

返回键

命令:

 
  1. adb shell input keyevent 4

  2. 复制代码

音量控制

增加音量:

 
  1. adb shell input keyevent 24

  2. 复制代码

降低音量:

 
  1. adb shell input keyevent 25

  2. 复制代码

静音:

 
  1. adb shell input keyevent 164

  2. 复制代码

媒体控制

播放/暂停:

 
  1. adb shell input keyevent 85

  2. 复制代码

停止播放:

 
  1. adb shell input keyevent 86

  2. 复制代码

播放下一首:

 
  1. adb shell input keyevent 87

  2. 复制代码

播放上一首:

 
  1. adb shell input keyevent 88

  2. 复制代码

恢复播放:

 
  1. adb shell input keyevent 126

  2. 复制代码

暂停播放:

 
  1. adb shell input keyevent 127

  2. 复制代码

点亮/熄灭屏幕

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

点亮屏幕:

 
  1. adb shell input keyevent 224

  2. 复制代码

熄灭屏幕:

 
  1. adb shell input keyevent 223

  2. 复制代码

滑动解锁

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

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

 
  1. adb shell input swipe 300 1000 300 500

  2. 复制代码

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

输入文本

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

命令:

 
  1. adb shell input text hello

  2. 复制代码

现在 hello 出现在文本框了。

Android日志查看

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

Android日志

 
  1. [adb] logcat [<option>] ... [<filter-spec>] ...

  2. 复制代码

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

按级别过滤日志

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

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

比如,命令:

 
  1. adb logcat *:W

  2. 复制代码

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

按照tag和级别过滤日志

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

比如,命令:

 
  1. adb logcat ActivityManager:I MyApp:D *:S

  2. 复制代码

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

日志格式

清空日志

 
  1. adb logcat -c

  2. 复制代码

内核日志

 
  1. adb shell dmesg

  2. 复制代码

我这里运行结果如下:

 
  1. [ 826.802773] init: Service 'mediacodec' (pid 241) killed by signal 6

  2. [ 826.802849] init: Service 'mediacodec' (pid 241) killing any children in process group

  3. [ 826.805858] init: Starting service 'mediacodec'...

  4. [ 826.806083] rk-vcodec ff650000.vpu_service: closed

  5. [ 826.808325] binder: send failed reply for transaction 291855 to 232:745

  6. [ 826.866578] binder: 219:219 transaction failed 29189/0, size 96-0 line 2880

  7. [ 2962.286136] hrtimer: interrupt took 228959 ns

  8. 复制代码

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

查看设备信息

设备型号

 
  1. adb shell getprop ro.product.model

  2. 复制代码

我的为:

 
  1. XiaoMi Note 3

  2. 复制代码

设备电池状态

 
  1. adb shell dumpsys battery

  2. 复制代码

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

 
  1. Current Battery Service state:

  2. AC powered: true

  3. USB powered: false

  4. Wireless powered: false

  5. Max charging current: 0

  6. Max charging voltage: 0

  7. Charge counter: 0

  8. status: 2

  9. health: 2

  10. present: true

  11. level: 100

  12. scale: 100

  13. voltage: 0

  14. temperature: 424

  15. technology:

  16. 复制代码

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

屏幕分辨率

 
  1. adb shell wm size

  2. 复制代码

设备结果:

 
  1. Physical size: 1920x1080

  2. 复制代码

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

屏幕密度

 
  1. adb shell wm density

  2. 复制代码

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

 
  1. Physical density: 320

  2. 复制代码

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

显示屏参数

 
  1. adb shell dumpsys window displays

  2. 复制代码

结果:

 
  1. WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)

  2. Display: mDisplayId=0

  3. init=1920x1080 320dpi cur=1920x1080 app=1824x1080 rng=1080x1032-1824x1776

  4. deferred=false layoutNeeded=false

  5. 复制代码

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

android_id

 
  1. adb shell settings get secure android_id

  2. 复制代码

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

IMEI(Device ID)

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

 
  1. adb shell dumpsys iphonesubinfo

  2. 复制代码

其中的 Device ID 就是IMEI

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

 
  1. adb shell

  2. su

  3. service call iphonesubinfo 1

  4. 复制代码

运行结果: 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系统版本

 
  1. adb shell getprop ro.build.version.release

  2. 复制代码

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

IP地址

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

 
  1. adb shell ifconfig

  2. 复制代码

结果:

 
  1. lo Link encap:Local Loopback

  2. inet addr:127.0.0.1 Mask:255.0.0.0

  3. inet6 addr: ::1/128 Scope: Host

  4. UP LOOPBACK RUNNING MTU:65536 Metric:1

  5. RX packets:709503 errors:0 dropped:0 overruns:0 frame:0

  6. TX packets:709503 errors:0 dropped:0 overruns:0 carrier:0

  7. collisions:0 txqueuelen:1

  8. RX bytes:75473583 TX bytes:75473583

  9. 复制代码

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

Mac 地址

 
  1. adb shell

  2. cat /sys/class/net/wlan0/address

  3. 复制代码

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

CPU 信息

 
  1. adb shell

  2. cat /proc/cpuinfo

  3. 复制代码

结果:

 
  1. processor : 0

  2. BogoMIPS : 48.00

  3. Features : fp asimd evtstrm aes pmull sha1 sha2 crc32

  4. CPU implementer : 0x41

  5. CPU architecture: 8

  6. CPU variant : 0x0

  7. CPU part : 0xd03

  8. CPU revision : 4

  9.  
  10. processor : 1

  11. BogoMIPS : 48.00

  12. Features : fp asimd evtstrm aes pmull sha1 sha2 crc32

  13. CPU implementer : 0x41

  14. CPU architecture: 8

  15. CPU variant : 0x0

  16. CPU part : 0xd03

  17. CPU revision : 4

  18.  
  19. processor : 2

  20. BogoMIPS : 48.00

  21. Features : fp asimd evtstrm aes pmull sha1 sha2 crc32

  22. CPU implementer : 0x41

  23. CPU architecture: 8

  24. CPU variant : 0x0

  25. CPU part : 0xd03

  26. CPU revision : 4

  27.  
  28. processor : 3

  29. BogoMIPS : 48.00

  30. Features : fp asimd evtstrm aes pmull sha1 sha2 crc32

  31. CPU implementer : 0x41

  32. CPU architecture: 8

  33. CPU variant : 0x0

  34. CPU part : 0xd03

  35. CPU revision : 4

  36.  
  37. processor : 4

  38. BogoMIPS : 48.00

  39. Features : fp asimd evtstrm aes pmull sha1 sha2 crc32

  40. CPU implementer : 0x41

  41. CPU architecture: 8

  42. CPU variant : 0x0

  43. CPU part : 0xd08

  44. CPU revision : 2

  45.  
  46. processor : 5

  47. BogoMIPS : 48.00

  48. Features : fp asimd evtstrm aes pmull sha1 sha2 crc32

  49. CPU implementer : 0x41

  50. CPU architecture: 8

  51. CPU variant : 0x0

  52. CPU part : 0xd08

  53. CPU revision : 2

  54.  
  55. Serial : d59a3c2fc7c848c4

  56. 复制代码

可以分析出设备为6核。

内存信息

 
  1. adb shell

  2. cat /proc/meminfo

  3. 复制代码

结果:

 
  1. MemTotal: 2021484 kB

  2. MemFree: 65888 kB

  3. MemAvailable: 784708 kB

  4. Buffers: 284 kB

  5. Cached: 923468 kB

  6. SwapCached: 196 kB

  7. Active: 1154216 kB

  8. Inactive: 526232 kB

  9. Active(anon): 690720 kB

  10. Inactive(anon): 229288 kB

  11. Active(file): 463496 kB

  12. Inactive(file): 296944 kB

  13. Unevictable: 256 kB

  14. Mlocked: 256 kB

  15. SwapTotal: 520908 kB

  16. SwapFree: 475536 kB

  17. Dirty: 1764 kB

  18. Writeback: 0 kB

  19. AnonPages: 756924 kB

  20. Mapped: 246860 kB

  21. Shmem: 163312 kB

  22. Slab: 92916 kB

  23. SReclaimable: 41080 kB

  24. SUnreclaim: 51836 kB

  25. KernelStack: 13760 kB

  26. PageTables: 16476 kB

  27. NFS_Unstable: 0 kB

  28. Bounce: 0 kB

  29. WritebackTmp: 0 kB

  30. CommitLimit: 1531648 kB

  31. Committed_AS: 63485416 kB

  32. VmallocTotal: 258867136 kB

  33. VmallocUsed: 0 kB

  34. VmallocChunk: 0 kB

  35. CmaTotal: 16384 kB

  36. CmaFree: 13800 kB

  37. 复制代码

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

修改设置

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

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

分辨率

 
  1. adb shell wm size 480x1024

  2. 复制代码

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

恢复原分辨率命令:

 
  1. adb shell wm size reset

  2. 复制代码

屏幕密度

 
  1. adb shell wm density 160

  2. 复制代码

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

 
  1. adb shell wm density reset

  2. 复制代码

显示区域

 
  1. adb shell wm overscan 0,0,0,200

  2. 复制代码

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

恢复原显示区域命令:

 
  1. adb shell wm overscan reset

  2. 复制代码

关闭USB调试模式

 
  1. adb shell settings put global adb_enabled 0

  2. 复制代码

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

实用功能

屏幕截图

截图保存到电脑:

 
  1. adb exec-out screencap -p > sc.png

  2. 复制代码

如果 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:

 
  1. adb shell screenrecord /sdcard/filename.mp4

  2. 复制代码

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

如果需要导出到电脑:

 
  1. adb pull /sdcard/filename.mp4

  2. 复制代码

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

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

查看连接过的 WiFi 密码

注:需要 root 权限. 命令:

 
  1. adb shell

  2. su

  3. cat /data/misc/wifi/*.conf

  4. 复制代码

输出结果:

 
  1. network={

  2. ssid="TP-LINK_9DFC"

  3. scan_ssid=1

  4. psk="123456789"

  5. key_mgmt=WPA-PSK

  6. group=CCMP TKIP

  7. auth_alg=OPEN

  8. sim_num=1

  9. priority=13893

  10. }

  11.  
  12. network={

  13. ssid="TP-LINK_F11E"

  14. psk="987654321"

  15. key_mgmt=WPA-PSK

  16. sim_num=1

  17. priority=17293

  18. }

  19. 复制代码

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

设置系统日期和时间

注:需要 root 权限。

命令:

 
  1. adb shell

  2. su

  3. date -s 20160823.131500

  4. 复制代码

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

重启设备

 
  1. adb reboot

  2. 复制代码

检测设备是否已 root

命令:

 
  1. adb shell

  2. su

  3. 复制代码

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

使用Monkey调试设备

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

简单用法:

 
  1. adb shell monkey -p <packagename> -v 500

  2. 复制代码

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

开启/关闭 WiFi

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

开启 WiFi:

 
  1. adb root

  2. adb shell svc wifi enable

  3. 复制代码

关闭 WiFi:

 
  1. adb root

  2. adb shell svc wifi disable

  3. 复制代码

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

刷机相关命令

重启到Recovery模式

命令:

 
  1. adb reboot recovery

  2. 复制代码

从 Recovery 重启到 Android

命令:

 
  1. adb reboot

  2. 复制代码

重启到 Fastboot 模式

命令:

 
  1. adb reboot bootloader

  2. 复制代码

通过 sideload 更新系统

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

以 Recovery 模式下更新为例:

1.重启到 Recovery 模式。

命令:

 
  1. adb reboot recovery

  2. 复制代码

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

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

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

命令:

 
  1. adb sideload <path-to-update.zip>

  2. 复制代码

更多 adb shell 命令

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

查看进程

 
  1. adb shell ps

  2. 复制代码

结果:

 
  1. USER PID PPID VSIZE RSS WCHAN PC NAME

  2. root 1 0 10628 2192 0 0000000000 S /init

  3. root 2 0 0 0 0 0000000000 S kthreadd

  4. root 3 2 0 0 0 0000000000 S ksoftirqd/0

  5. root 4 2 0 0 0 0000000000 S kworker/0:0

  6. root 5 2 0 0 0 0000000000 S kworker/0:0H

  7. root 6 2 0 0 0 0000000000 S kworker/u12:0

  8. root 7 2 0 0 0 0000000000 S rcu_preempt

  9. ...

  10. 复制代码

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

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

查看实时资源占用情况

 
  1. adb shell top

  2. 复制代码

结果:

 
  1. User 15%, System 6%, IOW 0%, IRQ 2%

  2. User 70 + Nice 198 + Sys 119 + Idle 1328 + IOW 0 + IRQ 0 + SIRQ 53 = 1768

  3.  
  4. PID USER PR NI CPU% S #THR VSS RSS PCY Name

  5. 1675 system 10 -10 15% S 67 3692336K 586336K ta cn.cloudwalk.app

  6. 231 camerase 20 0 4% S 15 111520K 40072K fg /system/bin/cameraserver

  7. 214 system -2 -8 2% S 30 296260K 22412K unk /system/bin/surfaceflinger

  8. 442 system 18 -2 0% S 88 3773608K 199724K fg system_server

  9. 2034 shell 20 0 0% R 1 9112K 3180K fg top

  10. 3 root 20 0 0% S 1 0K 0K fg ksoftirqd/0

  11. 649 radio 20 0 0% S 31 2825084K 110728K fg com.android.phone

  12. 720 media_rw 20 0 0% S 4 13868K 3344K fg /system/bin/sdcard

  13. 50 root RT 0 0% S 1 0K 0K fg cfinteractive

  14. 164 root -2 0 0% S 1 0K 0K fg mmcqd/1

  15. 7 root 20 0 0% S 1 0K 0K fg rcu_preempt

  16. 160 root 0 -20 0% S 1 0K 0K fg kworker/u13:1

  17. 8 root 20 0 0% S 1 0K 0K fg rcu_sched

  18. 159 root 0 -20 0% S 1 0K 0K fg kworker/u13:0

  19. 18 root RT 0 0% S 1 0K 0K fg migration/2

  20. 19 root 20 0 0% S 1 0K 0K fg ksoftirqd/2

  21. 20 root 20 0 0% S 1 0K 0K fg kworker/2:0

  22. 21 root 0 -20 0% S 1 0K 0K fg kworker/2:0H

  23. 22 root RT 0 0% S 1 0K 0K fg watchdog/3

  24. ...

  25. 复制代码

其中各个列的含义如下:

列名含义
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命令后面还可以添加一些命令行参数来限制。详细的用法如下:

 
  1. Usage: top [ -m max_procs ] [ -n iterations ] [ -d delay ] [ -s sort_column ] [ -t ] [ -h ]

  2. -m num 最多显示多少个进程

  3. -n num 刷新多少次后退出

  4. -d num 刷新时间间隔(单位秒,默认值 5)

  5. -s col 按某列排序(可用 col 值:cpu, vss, rss, thr)

  6. -t 显示线程信息

  7. -h 显示帮助文档

  8. 复制代码

查看进程的UID

该任务有两种实现方式:

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

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

adb shell dumpsys package <packagename> | findstr userId

结果:

 
  1. userId=1000

  2. userId=1000

  3. userId=1000

  4. 复制代码

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

结果:

 
  1. D:\work\206cwmenjyuny-master>adb shell

  2. rk3399_mid:/ $ ps|grep cn.cloudwalk.app

  3. system 1409 229 3689804 580168 0 0000000000 S cn.cloudwalk.app

  4. rk3399_mid:/ $ cat /proc/1409/status | grep Uid

  5. Uid: 1000 1000 1000 1000

  6. rk3399_mid:/ $

  7. 复制代码

其它

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

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

参考目录:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值