一、ADB是什么?

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

注: 有部分命令的支持情况可能与 Android 系统版本及定制 ROM 的实现有关。

二、ADB有什么作用?

ADBAndroid SDK 里的一个工具, 用这个工具可以直接操作管理Android模拟器或者真实的Android设备。它的主要功能有:

  • 在设备上运行Shell命令;
  • 将本地APK软件安装至模拟器或Android设备;
  • 管理设备或手机模拟器上的预定端口;
  • 在设备或手机模拟器上复制或粘贴文件。

ADB 是一个客户端-服务器程序程序,包括三个组件:

  • 客户端:该组件发送命令。客户端在开发计算机上运行。您可以通过发出 adb 命令从命令行终端调用客户端。
  • 后台程序:该组件在设备上运行命令。后台程序在每个模拟器或设备实例上作为后台进程运行。
  • 服务器:该组件管理客户端和后台程序之间的通信。服务器在开发计算机上作为后台进程运行。

    三、ADB命令语法

    adb 命令的基本语法如下:
    1. adb [-d|-e|-s <serial-number>] <command>

    单一设备/模拟器连接

    如果只有一个设备/模拟器连接时,可以省略掉 [-d|-e|-s <serial-number>] 这一部分,直接使用 adb <command>

    多个设备/模拟器连接

    如果有多个设备/模拟器连接,则需要为命令指定目标设备,下表是指定目标设备的命令选项:
参数 含义
-d 指定当前唯一通过 USB 连接的 Android 设备为命令目标
-e 指定当前唯一运行的模拟器为命令目标
-s <serial-number> 指定相应设备序列号的设备/模拟器为命令目标

在多个设备/模拟器连接的情况下较常用的是 -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 命令时若发现 adb server 没有启动会自动调起。

4.1.3 停止adb

  1. adb kill-server

4.1.4 以 root 权限运行 adb

  1. adb root

4.1.5 指定 adb server 的网络端口

  1. adb -P <port> start-server

ADB的默认端口为 5037。

4.1.5 查询已连接的设备/模拟器列表

  1. adb devices

4.2 设备连接管理

4.2.1 USB 连接

通过 USB 连接来正常使用 adb 需要以下步骤:

  1. 确认硬件状态正常(包括 Android 设备处于正常开机状态,USB 连接线和各种接口完好)。
  2. Android 设备的开发者选项和 USB 调试模式已开启(可以在「设置」-「开发者选项」-「USB调试」打开USB调试)。
  3. 确认设备驱动状态正常(安装ADB驱动程序)。
  4. 通过 USB 线连接好电脑和设备后确认状态。
  5. 通过 adb devices 命令查看设备连接情况。

    4.2.2 WLAN 连接(需要 USB 线)

    借助 USB 通过 WiFi 连接来正常使用 adb 需要以下步骤: 操作步骤:

  6. 将 Android 设备与要运行 adb 的电脑连接到同一个 WiFi。

  7. 将设备与电脑通过 USB 线连接(可通过 adb devices 命令查看设备连接情况)。
  8. 通过 adb tcpip 5555 命令让设备在 5555 端口监听 TCP/IP 连接。
  9. 断开 USB 连接。
  10. 找到设备的 IP 地址(可以在「设置」-「关于手机」-「状态信息」-「IP地址」查看 IP 地址)。
  11. 通过 adb connect <device-ip-address> 命令使用 IP 地址将 Android 设备与电脑连接。
  12. 通过 adb devices 命令查看设备连接情况。
  13. 使用完毕后可通过 adb disconnect <device-ip-address> 命令断开无线连接。

    4.2.3 WLAN 连接(无需借助 USB 线)

    注:需要 root 权限。不借助 USB 通过 WiFi 连接来正常使用 adb 需要以下步骤:

  14. 在 Android 设备上安装一个终端模拟器(可通过Terminal Emulator for Android Downloads下载)。

  15. 将 Android 设备与要运行 adb 的电脑连接到同一个 WiFi。
  16. 打开 Android 设备上的终端模拟器,在里面依次运行命令: ``` su setprop service.adb.tcp.port 5555
  1. 4. 找到设备的 IP 地址(可以在「设置」-「关于手机」-「状态信息」-「IP地址」查看 IP 地址)。
  2. 4. 通过 `adb connect <device-ip-address>` 命令使用 IP 地址将 Android 设备与电脑连接。
  3. 4. 通过 `adb devices` 命令查看设备连接情况。
  4. <a name="A7Z8F"></a>
  5. #### 4.2.4 WiFi 连接转为 USB 连接
  6. 通过`adb usb`命令以USB模式重新启动ADB

adb usb

  1. <a name="9jalU"></a>
  2. ### 4.3 应用管理
  3. <a name="B1S1P"></a>
  4. #### 4.3.1 查看应用列表
  5. 查看应用列表的基本命令格式是:

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

  1. `adb shell pm list packages` 后面可以跟一些可选参数进行过滤查看不同的列表,可用参数及含义如下:
  2. | 参数 | 显示列表 |
  3. | --- | --- |
  4. | | 所有应用 |
  5. | -f | 显示应用关联的 apk 文件 |
  6. | -d | 只显示 disabled 的应用 |
  7. | -e | 只显示 enabled 的应用 |
  8. | -s | 只显示系统应用 |
  9. | -3 | 只显示第三方应用 |
  10. | -i | 显示应用的 installer |
  11. | -u | 包含已卸载应用 |
  12. | `<filter>` | 包名包含 `<filter>` 字符串 |
  13. <a name="lWlPg"></a>
  14. ##### 4.3.1.1 查看所有应用

adb shell pm list packages

  1. <a name="6T2YE"></a>
  2. ##### 4.3.1.2 查看系统应用

adb shell pm list packages -s

  1. <a name="w6pf9"></a>
  2. ##### 4.3.1.3 查看第三方应用

adb shell pm list packages -3

  1. <a name="lAfuU"></a>
  2. ##### 4.3.1.4 包名包含某字符串的应用
  3. 比如要查看包名包含字符串 `huawei` 的应用列表,命令:

adb shell pm list packages huawei

  1. <a name="Q3P5B"></a>
  2. #### 4.3.2 安装应用
  3. 安装应用的基本命令格式是:

adb install [-l] [-r] [-t] [-s] [-d] [-g]

  1. `adb install` 后面可以跟一些可选参数来控制安装 APK 的行为,可用参数及含义如下:
  2. | 参数 | 含义 |
  3. | --- | --- |
  4. | -l | 将应用安装到保护目录 /mnt/asec |
  5. | -r | 允许覆盖安装 |
  6. | -t | 允许安装 AndroidManifest.xml application 指定 `android:testOnly="true"` 的应用 |
  7. | -s | 将应用安装到 sdcard |
  8. | -d | 允许降级覆盖安装 |
  9. | -g | 授予所有运行时权限 |
  10. 运行命令后可以看到输出内容,包含安装进度和状态,安装状态如下:
  11. - `Success`:代表安装成功。
  12. - `Failure`:代表安装失败。 APK 安装失败的情况有很多,`Failure`状态之后有安装失败输出代码。常见安装失败输出代码、含义及可能的解决办法如下:
  13. | 输出代码 | 含义 | 解决办法 |
  14. | --- | --- | --- |
  15. | INSTALL_FAILED_ALREADY_EXISTS | 应用已经存在,或卸载了但没卸载干净 | `adb install` 时使用 `-r` 参数,或者先 `adb uninstall <packagename>` 再安装 |
  16. | INSTALL_FAILED_INVALID_APK | 无效的 APK 文件 | |
  17. | INSTALL_FAILED_INVALID_URI | 无效的 APK 文件名 | 确保 APK 文件名里无中文 |
  18. | INSTALL_FAILED_INSUFFICIENT_STORAGE | 空间不足 | 清理空间 |
  19. | INSTALL_FAILED_DUPLICATE_PACKAGE | 已经存在同名程序 | |
  20. | INSTALL_FAILED_NO_SHARED_USER | 请求的共享用户不存在 | |
  21. | INSTALL_FAILED_UPDATE_INCOMPATIBLE | 以前安装过同名应用,但卸载时数据没有移除;或者已安装该应用,但签名不一致 | `adb uninstall <packagename>` 再安装 |
  22. | INSTALL_FAILED_SHARED_USER_INCOMPATIBLE | 请求的共享用户存在但签名不一致 | |
  23. | INSTALL_FAILED_MISSING_SHARED_LIBRARY | 安装包使用了设备上不可用的共享库 | |
  24. | INSTALL_FAILED_REPLACE_COULDNT_DELETE | 替换时无法删除 | |
  25. | INSTALL_FAILED_DEXOPT | dex 优化验证失败或空间不足 | |
  26. | INSTALL_FAILED_OLDER_SDK | 设备系统版本低于应用要求 | |
  27. | INSTALL_FAILED_CONFLICTING_PROVIDER | 设备里已经存在与应用里同名的 content provider | |
  28. | INSTALL_FAILED_NEWER_SDK | 设备系统版本高于应用要求 | |
  29. | INSTALL_FAILED_TEST_ONLY | 应用是 test-only 的,但安装时没有指定 `-t` 参数 | |
  30. | INSTALL_FAILED_CPU_ABI_INCOMPATIBLE | 包含不兼容设备 CPU 应用程序二进制接口的 native code | |
  31. | INSTALL_FAILED_MISSING_FEATURE | 应用使用了设备不可用的功能 | |
  32. | INSTALL_FAILED_CONTAINER_ERROR | 1. sdcard 访问失败;<br />2. 应用签名与 ROM 签名一致,被当作内置应用。 | 1. 确认 sdcard 可用,或者安装到内置存储;<br />2. 打包时不与 ROM 使用相同签名。 |
  33. | INSTALL_FAILED_INVALID_INSTALL_LOCATION | 1. 不能安装到指定位置;<br />2. 应用签名与 ROM 签名一致,被当作内置应用。 | 1. 切换安装位置,添加或删除 `-s` 参数;<br />2. 打包时不与 ROM 使用相同签名。 |
  34. | INSTALL_FAILED_MEDIA_UNAVAILABLE | 安装位置不可用 | 一般为 sdcard,确认 sdcard 可用或安装到内置存储 |
  35. | INSTALL_FAILED_VERIFICATION_TIMEOUT | 验证安装包超时 | |
  36. | INSTALL_FAILED_VERIFICATION_FAILURE | 验证安装包失败 | |
  37. | INSTALL_FAILED_PACKAGE_CHANGED | 应用与调用程序期望的不一致 | |
  38. | INSTALL_FAILED_UID_CHANGED | 以前安装过该应用,与本次分配的 UID 不一致 | 清除以前安装过的残留文件 |
  39. | INSTALL_FAILED_VERSION_DOWNGRADE | 已经安装了该应用更高版本 | 使用 `-d` 参数 |
  40. | INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE | 已安装 target SDK 支持运行时权限的同名应用,要安装的版本不支持运行时权限 | |
  41. | INSTALL_PARSE_FAILED_NOT_APK | 指定路径不是文件,或不是以 `.apk` 结尾 | |
  42. | INSTALL_PARSE_FAILED_BAD_MANIFEST | 无法解析的 AndroidManifest.xml 文件 | |
  43. | INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION | 解析器遇到异常 | |
  44. | INSTALL_PARSE_FAILED_NO_CERTIFICATES | 安装包没有签名 | |
  45. | INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES | 已安装该应用,且签名与 APK 文件不一致 | 先卸载设备上的该应用,再安装 |
  46. | INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING | 解析 APK 文件时遇到 `CertificateEncodingException` | |
  47. | INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME | manifest 文件里没有或者使用了无效的包名 | |
  48. | INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID | manifest 文件里指定了无效的共享用户 ID | |
  49. | INSTALL_PARSE_FAILED_MANIFEST_MALFORMED | 解析 manifest 文件时遇到结构性错误 | |
  50. | INSTALL_PARSE_FAILED_MANIFEST_EMPTY | manifest 文件里找不到找可操作标签(instrumentation application | |
  51. | INSTALL_FAILED_INTERNAL_ERROR | 因系统问题安装失败 | |
  52. | INSTALL_FAILED_USER_RESTRICTED | 用户被限制安装应用 | |
  53. | INSTALL_FAILED_DUPLICATE_PERMISSION | 应用尝试定义一个已经存在的权限名称 | |
  54. | INSTALL_FAILED_NO_MATCHING_ABIS | 应用包含设备的应用程序二进制接口不支持的 native code | |
  55. | INSTALL_CANCELED_BY_USER | 应用安装需要在设备上确认,但未操作设备或点了取消 | 在设备上同意安装 |
  56. | INSTALL_FAILED_ACWF_INCOMPATIBLE | 应用程序与设备不兼容 | |
  57. | INSTALL_FAILED_TEST_ONLY | APK 文件是使用 Android Studio 直接 RUN 编译出来的文件 | 通过 Gradle assembleDebug assembleRelease 重新编译,或者 Generate Signed APK |
  58. | does not contain AndroidManifest.xml | 无效的 APK 文件 | |
  59. | is not a valid zip file | 无效的 APK 文件 | |
  60. | Offline | 设备未连接成功 | 先将设备与 adb 连接成功 |
  61. | unauthorized | 设备未授权允许调试 | |
  62. | error: device not found | 没有连接成功的设备 | 先将设备与 adb 连接成功 |
  63. | protocol failure | 设备已断开连接 | 先将设备与 adb 连接成功 |
  64. | Unknown option: -s | Android 2.2 以下不支持安装到 sdcard | 不使用 `-s` 参数 |
  65. | No space left on device | 空间不足 | 清理空间 |
  66. | Permission denied ... sdcard ... | sdcard 不可用 | |
  67. | signatures do not match the previously installed version; ignoring! | 已安装该应用且签名不一致 | 先卸载设备上的该应用,再安装 |
  68. 参考:[PackageManager.java](https://github.com/android/platform_frameworks_base/blob/master/core%2Fjava%2Fandroid%2Fcontent%2Fpm%2FPackageManager.java)<br />`adb install` 实际是分三步完成:
  69. 1. push apk 文件到 /data/local/tmp
  70. 1. 调用 pm install 安装。
  71. 1. 删除 /data/local/tmp 下的对应 apk 文件。
  72. <a name="svjyN"></a>
  73. #### 4.3.3 卸载应用
  74. 卸载应用的基本命令格式是:

adb uninstall [-k] 复制代码

  1. `<package-name>` 表示应用的包名,`-k` 参数可选,表示卸载应用但保留数据和缓存目录。
  2. <a name="fHOdi"></a>
  3. #### 4.3.4 清除应用数据与缓存

adb shell pm clear

  1. `<package-name>` 表示应用名包,这条命令的效果相当于在设置里的应用信息界面点击了「清除缓存」和「清除数据」。
  2. <a name="199YK"></a>
  3. #### 4.3.5 查看前台 Activity

adb shell dumpsys activity activities | grep mFocusedActivity

  1. <a name="DuRTL"></a>
  2. #### 4.3.6 查看正在运行的 Services

adb shell dumpsys activity services []

  1. `<package-name>` 参数不是必须的,指定 `<package-name>` 表示查看与某个包名相关的 Services,不指定表示查看所有 Services`<package-name>` 不一定要给出完整的包名,可以只给一部分,那么所给包名相关的 Services 都会列出来。
  2. <a name="JME2x"></a>
  3. #### 4.3.7 查看应用详细信息

adb shell dumpsys package

  1. `<package-name>` 表示应用包名。运行次命令的输出中包含很多信息,包括 Activity Resolver TableRegistered ContentProviders、包名、userId、安装后的文件资源代码等路径、版本信息、权限信息和授予状态、签名版本信息等。
  2. <a name="P6RpA"></a>
  3. #### 4.3.7 查看应用安装路径

adb shell pm path

  1. <a name="N0uaB"></a>
  2. ### 4.4 与应用交互
  3. 与应用交互主要是使用 `am <command>` 命令,常用的 `<command>` 如下:
  4. | command | 用途 |
  5. | --- | --- |
  6. | `start [options] <intent>` | 启动 `<intent>` 指定的 Activity |
  7. | `startservice [options] <intent>` | 启动 `<intent>` 指定的 Service |
  8. | `broadcast [options] <intent>` | 发送 `<intent>` 指定的广播 |
  9. | `force-stop <package-name>` | 停止 `<package-name>` 相关的进程 |
  10. `<intent>` 参数很灵活,和写 Android 程序时代码里的 Intent 相对应。<br />用于决定 intent 对象的选项如下:
  11. | 参数 | 含义 |
  12. | --- | --- |
  13. | `-a <action>` | 指定 action,比如 `android.intent.action.VIEW` |
  14. | `-c <category>` | 指定 category,比如 `android.intent.category.APP_CONTACTS` |
  15. | `-n <component>` | 指定完整 component 名,用于明确指定启动哪个 Activity |
  16. `<intent>` 里还能带数据,就像写代码时的 Bundle 一样:
  17. | 参数 | 含义 |
  18. | --- | --- |
  19. | `--esn <extra-key>` | null 值(只有 key 名) |
  20. | `-e|--es <extra-key> <extra-string-value>` | string 值 |
  21. | `--ez <extra-key> <extra-boolean-value>` | boolean 值 |
  22. | `--ei <extra-key> <extra-int-value>` | integer 值 |
  23. | `--el <extra-key> <extra-long-value>` | long 值 |
  24. | `--ef <extra-key> <extra-float-value>` | float 值 |
  25. | `--eu <extra-key> <extra-uri-value>` | URI |
  26. | `--ecn <extra-key> <extra-component-name-value>` | component name |
  27. | `--eia <extra-key> <extra-int-value>[,<extra-int-value...]` | integer 数组 |
  28. | `--ela <extra-key> <extra-long-value>[,<extra-long-value...]` | long 数组 |
  29. <a name="E7EGF"></a>
  30. #### 4.4.1 启动应用/ 调起 Activity

adb shell am start [options]

  1. 例如:

adb shell am start -a android.settings.SETTINGS # 打开系统设置页面 adb shell am start -a android.intent.action.DIAL -d tel:10086 # 打开拨号页面 adb shell am start -n com.android.mms/.ui.ConversationList # 打开短信会话列表

  1. options 是一些改变其行为的选项,支持的可选参数及含义如下:
  2. | 选项 | 含义 |
  3. | --- | --- |
  4. | -D | 启用调试 |
  5. | -W | 等待启动完成 |
  6. | --start-profiler `file` | 启动分析器并将结果发送到 `file` |
  7. | -P `file` | 类似于 --start-profiler,但当应用进入空闲状态时分析停止 |
  8. | -R `count` | 重复 Activity 启动次数 |
  9. | -S | 启动 Activity 前强行停止目标应用 |
  10. | --opengl-trace | 启用 OpenGL 函数的跟踪 |
  11. | --user `user_id` &#124; current | 指定要作为哪个用户运行;如果未指定,则作为当前用户运行 |
  12. <a name="TatFl"></a>
  13. #### 4.4.2 调起 Service

adb shell am startservice [options]

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

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

  1. <a name="EFIBU"></a>
  2. #### 4.4.3 停止 Service

adb shell am stopservice [options]

  1. <a name="7AR5D"></a>
  2. #### 4.4.4 发送广播

adb shell am broadcast [options]

  1. 可以向所有组件广播,也可以只向指定组件广播。<br />例如,向所有组件广播 `BOOT_COMPLETED`

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

  1. 又例如,只向 `com.android.receiver.test/.BootCompletedReceiver` 广播 `BOOT_COMPLETED`

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n com.android.receiver.test/.BootCompletedReceiver

  1. 这类用法在测试的时候很实用,比如某个广播的场景很难制造,可以考虑通过这种方式来发送广播。<br />既能发送系统预定义的广播,也能发送自定义广播。如下是部分系统预定义广播及正常触发时机:
  2. | action | 触发时机 |
  3. | --- | --- |
  4. | android.net.conn.CONNECTIVITY_CHANGE | 网络连接发生变化 |
  5. | android.intent.action.SCREEN_ON | 屏幕点亮 |
  6. | android.intent.action.SCREEN_OFF | 屏幕熄灭 |
  7. | android.intent.action.BATTERY_LOW | 电量低,会弹出电量低提示框 |
  8. | android.intent.action.BATTERY_OKAY | 电量恢复了 |
  9. | android.intent.action.BOOT_COMPLETED | 设备启动完毕 |
  10. | android.intent.action.DEVICE_STORAGE_LOW | 存储空间过低 |
  11. | android.intent.action.DEVICE_STORAGE_OK | 存储空间恢复 |
  12. | android.intent.action.PACKAGE_ADDED | 安装了新的应用 |
  13. | android.net.wifi.STATE_CHANGE | WiFi连接状态发生变化 |
  14. | android.net.wifi.WIFI_STATE_CHANGED | WiFi状态变为启用/关闭/正在启动/正在关闭/未知 |
  15. | android.intent.action.BATTERY_CHANGED | 电池电量发生变化 |
  16. | android.intent.action.INPUT_METHOD_CHANGED | 系统输入法发生变化 |
  17. | android.intent.action.ACTION_POWER_CONNECTED | 外部电源连接 |
  18. | android.intent.action.ACTION_POWER_DISCONNECTED | 外部电源断开连接 |
  19. | android.intent.action.DREAMING_STARTED | 系统开始休眠 |
  20. | android.intent.action.DREAMING_STOPPED | 系统停止休眠 |
  21. | android.intent.action.WALLPAPER_CHANGED | 壁纸发生变化 |
  22. | android.intent.action.HEADSET_PLUG | 插入耳机 |
  23. | android.intent.action.MEDIA_UNMOUNTED | 卸载外部介质 |
  24. | android.intent.action.MEDIA_MOUNTED | 挂载外部介质 |
  25. | android.os.action.POWER_SAVE_MODE_CHANGED | 省电模式开启 |
  26. _(以上广播均可使用 adb 触发)_
  27. <a name="KJmay"></a>
  28. #### 4.4.5 强制停止应用

adb shell am force-stop

  1. <a name="Utps3"></a>
  2. #### 4.4.6 收紧内存

adb shell am send-trim-memory

  1. 参数说明:
  2. - `pid`: 进程 ID
  3. - `level`:HIDDENRUNNING_MODERATEBACKGROUNDRUNNING_LOWMODERATERUNNING_CRITICALCOMPLETE
  4. <a name="UU0Bs"></a>
  5. ### 4.5 文件管理
  6. <a name="MBaLw"></a>
  7. #### 4.5.1 从模拟器/设备下载指定的文件到计算机
  8. 从模拟器/设备下载指定的文件到计算机的基本命令格式是:

adb pull [local]

  1. 参数说明:
  2. - `remote`: 模拟器/设备里的文件路径
  3. - `local`:计算机上的目录,参数可以省略,默认复制到当前目录
  4. 例如,将 /sdcard/music.mp4 下载到计算机的当前目录:

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

  1. /sdcard/music.mp4 下载到计算机的当前目录(目录需存在):

adb pull /sdcard/music.mp4 D:\Download

  1. <a name="OGR55"></a>
  2. #### 4.5.2 将指定的文件从计算机上传到模拟器/设备
  3. 将指定的文件从计算机上传到模拟器/设备的基本命令格式是:

adb push

  1. 参数说明:
  2. - `local`:计算机上的文件路径
  3. - `remote`: 模拟器/设备里的目录
  4. 例如,将 D:\Download\music.mp4 下载到设备的/sdcard/music/目录:

adb push D:\Download\music.mp4 /sdcard/music/

  1. <a name="tntlt"></a>
  2. #### 4.5.4 列出指定目录的内容
  3. 列出模拟器/设备上指定目录的内容的基本命令格式是:

adb shell ls [options]

  1. `<directory>` 表示指定目录,可以省略,表示列出根目录下的所有文件和目录。`adb shell ls` 后面可以跟一些可选参数进行过滤查看不同的列表,可用参数及含义如下:
  2. | 参数 | 显示列表 |
  3. | --- | --- |
  4. | | 列出目录下的所有文件和目录 |
  5. | -a | 列出目录下的所有文件(包括隐藏的) |
  6. | -i | 列出目录下的所有文件和索引编号 |
  7. | -s | 列出目录下的所有文件和文件大小 |
  8. | -n | 列出目录下的所有文件及其 UID GID |
  9. | -R | 列出目录下的所有子目录中的文件 |
  10. <a name="gxTKO"></a>
  11. #### 4.5.5 切换到目标目录

adb shell cd 复制代码

  1. 第一步:执行`adb shell`命令; 第二步:执行`cd <directory>`命令切换到目标目录。
  2. <a name="Gm86s"></a>
  3. #### 4.5.6 删除文件或目录

adb shell rm [options]

  1. 第一步:执行`adb shell`命令; 第二步:执行`rm [options] <files or directory>`命令删除文件或目录。<br />`rm` 后面可以跟一些可选参数进行不同的操作,可用参数及含义如下:
  2. | 参数 | 含义 |
  3. | --- | --- |
  4. | | 删除文件 |
  5. | -f | 强制删除文件,系统不提示 |
  6. | -r | 强制删除指定目录中的所有文件和子目录 |
  7. | -d | 删除指定目录,即使它是一个非空目录 |
  8. | -i | 交互式删除,删除前提示 |
  9. `rm -d` 等同于 `rmdir` 命令,有些版本不包含`-d` 参数。
  10. <a name="ipXYi"></a>
  11. #### 4.5.7 创建目录

adb shell mkdir [options]

  1. 第一步:执行`adb shell`命令; 第二步:执行`mkdir [options] <directory-name>`命令创建目录。`mkdir` 后面可以跟一些可选参数进行不同的操作,可用参数及含义如下:
  2. | 参数 | 含义 |
  3. | --- | --- |
  4. | | 创建指定目录 |
  5. | -m | 创建指定目录并赋予读写权限 |
  6. | -p | 创建指定目录及其父目录 |
  7. <a name="DkWKy"></a>
  8. #### 4.5.8 创建空文件或改变文件时间戳

adb shell touch [options]

  1. 第一步:执行`adb shell`命令; 第二步:执行`touch [options] <file>`命令创建空文件或改变文件时间戳。<br />可通过`ls -n <directory>` 命令查看文件的时间。
  2. <a name="YMRjV"></a>
  3. #### 4.5.9 输出当前目录路径

adb shell pwd

  1. 第一步:执行`adb shell`命令; 第二步:执行`pwd`命令输出当前目录路径。
  2. <a name="l4zbY"></a>
  3. #### 4.5.10 复制文件和目录

adb shell cp [options]

  1. 第一步:执行`adb shell`命令; 第二步:执行`cp [options] <source> <dest>`命令复制文件和目录。 参数说明:
  2. - `source`:源文件路径
  3. - `dest`: 目标文件路径
  4. <a name="jv9mj"></a>
  5. #### 4.5.11 移动或重命名文件

adb shell mv [options]

  1. 第一步:执行`adb shell`命令; 第二步:执行`mv [options] <source> <dest>`命令移动或重命名文件。 参数说明:
  2. - `source`:源文件路径
  3. - `dest`: 目标文件路径
  4. <a name="wi3Op"></a>
  5. ### 4.6 网络管理
  6. <a name="Zu1db"></a>
  7. #### 4.6.1 查看网络统计信息

adb shell netstat

  1. 也可以将网络统计信息输出到指定文件:

adb shell netstat>

  1. 例如,可以通过 `adb shell netstat>D:\netstat.log` 将日志输出到 `D:\netstat.log` 中。
  2. <a name="23yLX"></a>
  3. #### 4.6.2 测试两个网络间的连接和延迟
  4. `ping` 命令的格式如下:

adb shell ping [-aAbBdDfhLnOqrRUvV] [-c count] [-i interval] [-I interface] [-m mark] [-M pmtudisc_option] [-l preload] [-p pattern] [-Q tos] [-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp_option] [-w deadline] [-W timeout] [hop1 …] destination

  1. 例如,ping一个域名:

adb shell ping www.google.com

  1. 不结束的话会一直ping下去,可以按 `Ctrl + C` 停止ping操作。<br />也可以指定ping的次数:

adb shell ping -c 4 www.google.com

  1. <a name="vJyjm"></a>
  2. #### 4.6.3 通过配置文件配置和管理网络连接
  3. `netcfg` 命令的格式如下:

adb shell netcfg [ {dhcp|up|down}]

  1. 输出示例:

rmnet_ims10 DOWN 0.0.0.0/0 0x00001002 rmnet_ims00 DOWN 0.0.0.0/0 0x00001002 rmnet_tun04 DOWN 0.0.0.0/0 0x00001002 rmnet_tun03 DOWN 0.0.0.0/0 0x00001002 rmnet_tun02 DOWN 0.0.0.0/0 0x00001002 rmnet_tun01 DOWN 0.0.0.0/0 0x00001002 rmnet_tun00 DOWN 0.0.0.0/0 0x00001002 rmnet_tun14 DOWN 0.0.0.0/0 0x00001002 rmnet_tun13 DOWN 0.0.0.0/0 0x00001002 rmnet_tun12 DOWN 0.0.0.0/0 0x00001002 rmnet_tun11 DOWN 0.0.0.0/0 0x00001002 rmnet_tun10 DOWN 0.0.0.0/0 0x00001002 rmnet1 DOWN 0.0.0.0/0 0x00001002 rmnet0 DOWN 0.0.0.0/0 0x00001002 rmnet4 DOWN 0.0.0.0/0 0x00001002 rmnet3 DOWN 0.0.0.0/0 0x00001002 rmnet2 DOWN 0.0.0.0/0 0x00001002 rmnet6 DOWN 0.0.0.0/0 0x00001002 rmnet5 DOWN 0.0.0.0/0 0x00001002 dummy0 UP 0.0.0.0/0 0x000000c3 rmnet_r_ims10 DOWN 0.0.0.0/0 0x00001002 rmnet_r_ims00 DOWN 0.0.0.0/0 0x00001002 rmnet_emc0 DOWN 0.0.0.0/0 0x00001002 lo UP 127.0.0.1/8 0x00000049 sit0 DOWN 0.0.0.0/0 0x00000080 wlan0 UP 10.0.38.176/23 0x00001043

  1. <a name="3YmaD"></a>
  2. #### 4.6.4 显示、操作路由、设备、策略路由和隧道
  3. `ip` 命令的格式如下:

adb shell ip [ options ] object

  1. - options := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |-f[amily] { inet | inet6 | ipx | dnet | link } |-l[oops] { maximum-addr-flush-attempts } |-o[neline] | -t[imestamp] | -b[atch] [filename] |-rc[vbuf] [size]}
  2. - object := { link | addr | addrlabel | route | rule | neigh | ntable |tunnel | tuntap | maddr | mroute | mrule | monitor | xfrm |netns | l2tp }
  3. `options` 是一些修改ip行为或者改变其输出的选项。所有的选项都是以-字符开头,分为长、短两种形式,支持的可选参数及含义如下:
  4. | 选项 | 含义 |
  5. | --- | --- |
  6. | -V,-Version | 打印ip的版本并退出 |
  7. | -s,-stats,-statistics | 输出更为详尽的信息(如果这个选项出现两次或者多次,输出的信息将更为详尽) |
  8. | -f,-family | 强调使用的协议种类(包括:inetinet6或者link) |
  9. | -4 | 是-family inet的简写 |
  10. | -6 | 是-family inet6的简写 |
  11. | -0 | 是-family link的简写 |
  12. | -o,-oneline | 对每行记录都使用单行输出,回行用字符代替 |
  13. | -r,-resolve | 查询域名解析系统,用获得的主机名代替主机IP地址 |
  14. `object` 是你要管理或者获取信息的对象。目前ip认识的对象包括:
  15. | 参数 | 显示列表 |
  16. | --- | --- |
  17. | link | 网络设备 |
  18. | address | 一个设备的协议(IP或者IPV6)地址 |
  19. | neighbour | ARP或者NDISC缓冲区条目 |
  20. | route | 路由表条目 |
  21. | rule | 路由策略数据库中的规则 |
  22. | maddress | 多播地址 |
  23. | mroute | 多播路由缓冲区条目 |
  24. | tuntap | 管理 TUN/TAP 设备 |
  25. | netns | 管理网络空间 |
  26. 例如,查看 `WiFi IP` 地址:

adb shell ip -f inet addr show wlan0

  1. <a name="VIhTx"></a>
  2. ### 4.7 模拟按键/输入
  3. 在 `adb shell` 里有个很实用的命令叫 `input`,通过它可以做一些有趣的事情。 可以执行`adb shell input`命令查看完整 help 信息如下:

Usage: input [] […] The sources are: dpad keyboard mouse touchpad gamepad touchnavigation joystick touchscreen stylus trackball The commands and default sources are: text (Default: touchscreen) keyevent [—longpress] … (Default: keyboard) tap (Default: touchscreen) swipe [duration(ms)] (Default: touchscreen) draganddrop [duration(ms)] (Default: touchscreen) press (Default: trackball) roll (Default: trackball)

  1. 比如使用 `adb shell input keyevent <keycode>` 命令,不同的 keycode 能实现不同的功能,完整的 keycode 列表详见 [KeyEvent](https://developer.android.com/reference/android/view/KeyEvent.html),摘引部分我觉得有意思的如下:
  2. | keycode | 含义 |
  3. | --- | --- |
  4. | 3 | HOME |
  5. | 4 | 返回键 |
  6. | 5 | 打开拨号应用 |
  7. | 6 | 挂断电话 |
  8. | 24 | 增加音量 |
  9. | 25 | 降低音量 |
  10. | 26 | 电源键 |
  11. | 27 | 拍照(需要在相机应用里) |
  12. | 64 | 打开浏览器 |
  13. | 82 | 菜单键 |
  14. | 85 | 播放/暂停 |
  15. | 86 | 停止播放 |
  16. | 87 | 播放下一首 |
  17. | 88 | 播放上一首 |
  18. | 122 | 移动光标到行首或列表顶部 |
  19. | 123 | 移动光标到行末或列表底部 |
  20. | 126 | 恢复播放 |
  21. | 127 | 暂停播放 |
  22. | 164 | 静音 |
  23. | 176 | 打开系统设置 |
  24. | 187 | 切换应用 |
  25. | 207 | 打开联系人 |
  26. | 208 | 打开日历 |
  27. | 209 | 打开音乐 |
  28. | 210 | 打开计算器 |
  29. | 220 | 降低屏幕亮度 |
  30. | 221 | 提高屏幕亮度 |
  31. | 223 | 系统休眠 |
  32. | 224 | 点亮屏幕 |
  33. | 231 | 打开语音助手 |
  34. | 276 | 如果没有 wakelock 则让系统休眠 |
  35. 下面是 `input` 命令的一些用法举例。
  36. <a name="jEnwa"></a>
  37. #### 4.7.1 电源键

adb shell input keyevent 26

  1. 执行效果相当于按电源键。
  2. <a name="sWT5O"></a>
  3. #### 4.7.2 菜单键

adb shell input keyevent 82

  1. <a name="mH8Dv"></a>
  2. #### 4.7.3 HOME 键

adb shell input keyevent 3

  1. <a name="4o9vN"></a>
  2. #### 4.7.4 返回键

adb shell input keyevent 4

  1. <a name="qT9in"></a>
  2. #### 4.7.5 音量控制
  3. - 增加音量:

adb shell input keyevent 24

  1. - 降低音量:

adb shell input keyevent 25

  1. - 静音:

adb shell input keyevent 164

  1. <a name="bcehr"></a>
  2. #### 4.7.6 媒体控制
  3. - 播放/暂停:

adb shell input keyevent 85

  1. - 停止播放:

adb shell input keyevent 86

  1. - 播放下一首:

adb shell input keyevent 87

  1. - 播放上一首:

adb shell input keyevent 88

  1. - 恢复播放:

adb shell input keyevent 126

  1. - 暂停播放:

adb shell input keyevent 127

  1. <a name="7KyWj"></a>
  2. #### 4.7.7 点亮/熄灭屏幕
  3. - 点亮屏幕:

adb shell input keyevent 224

  1. - 熄灭屏幕:

adb shell input keyevent 223

  1. <a name="87X1w"></a>
  2. #### 4.7.8 滑动解锁
  3. 如果锁屏没有密码,是通过滑动手势解锁,那么可以通过 `input swipe` 来解锁。 命令(参数以机型 Nexus 5,向上滑动手势解锁举例):

adb shell input swipe 300 1000 300 500

  1. 参数 `300 1000 300 500` 分别表示`起始点x坐标 起始点y坐标 结束点x坐标 结束点y坐标`
  2. <a name="mGWwF"></a>
  3. #### 4.7.9 输入文本
  4. 在焦点处于某文本框时,可以通过 `input` 命令来输入文本。

adb shell input text hello

  1. <a name="imrMr"></a>
  2. ### 4.8 日志打印
  3. Android 系统的日志分为两部分,底层的 Linux 内核日志输出到 /proc/kmsg,Android 的日志输出到 /dev/log。
  4. <a name="VvKHv"></a>
  5. #### 4.8.1 Android 日志
  6. 查看 Android 设备系统属性的基本命令格式是:

adb logcat [option] [filter-specs]

  1. 如果需要停止 `logcat` 日志打印,可以按 `Ctrl + C` 停止日志监控。
  2. <a name="0gJkE"></a>
  3. ##### 4.8.1.1 按级别过滤日志
  4. 按级别过滤日志的基本命令格式是:

adb logcat [filter-specs]

  1. Android 的日志分为如下几个优先级(priority):
  2. | 级别 | 含义 |
  3. | --- | --- |
  4. | *:V | 过滤只显示 Verbose 及以上级别(优先级最低) |
  5. | *:D | 过滤只显示 Debug 及以上级别 |
  6. | *:I | 过滤只显示 Info 及以上级别 |
  7. | *:W | 过滤只显示 Warning 及以上级别 |
  8. | *:E | 过滤只显示 Error 及以上级别 |
  9. | *:F | 过滤只显示 Fatal 及以上级别 |
  10. | *:S | 过滤只显示 Silent 及以上级别(优先级最高,什么也不输出) |
  11. 按某级别过滤日志则会将该级别及以上的日志输出。<br />比如,命令:

adb logcat *:W

  1. 会将 WarningErrorFatal Silent 日志输出。<br />(**注:** macOS 下需要给 `*:W` 这样以 `*` 作为 tag 的参数加双引号,如 `adb logcat "*:W"`,不然会报错 `no matches found: *:W`。)
  2. <a name="Bnvg7"></a>
  3. ##### 4.8.1.2 按 tag 和级别过滤日志
  4. tag 和级别过滤日志的基本命令格式是:

adb logcat [tag:level] [tag:level] …

  1. 比如,命令:

adb logcat ActivityManager:I MyApp:D *:S

  1. 表示输出 tag `ActivityManager` Info 以上级别日志,输出 tag `MyApp` Debug 以上级别日志,及其它 tag Silent 级别日志(即屏蔽其它 tag 日志)。
  2. <a name="Xb19K"></a>
  3. ##### 4.8.1.3 将日志格式化输出
  4. 可以用 `adb logcat -v <format>` 选项指定日志输出格式。<br />日志支持按以下几种 `<format>`
  5. | 参数 | 显示格式 |
  6. | --- | --- |
  7. | brief | `<priority>/<tag>(<pid>): <message>` |
  8. | process | `<priority>(<pid>) <message>` |
  9. | tag | `<priority>/<tag>: <message>` |
  10. | raw | `<message>` |
  11. | time | `<datetime> <priority>/<tag>(<pid>): <message>` |
  12. | threadtime | `<datetime> <pid> <tid> <priority> <tag>: <message>` |
  13. | long | `[ <datetime> <pid>:<tid> <priority>/<tag> ] <message>` |
  14. 日志格式默认为 `brief`,指定格式可与上面的过滤同时使用。比如:

adb logcat -v long ActivityManager:I *:S

  1. <a name="8R351"></a>
  2. ##### 4.8.1.3 清空已存在的日志

adb logcat -c

  1. <a name="ReTKJ"></a>
  2. ##### 4.8.1.4 将日志显示在控制台

adb logcat -d

  1. <a name="tRNG4"></a>
  2. ##### 4.8.1.5 将日志输出到文件

adb logcat -f

  1. <a name="JbdTh"></a>
  2. ##### 4.8.1.6 加载一个可使用的日志缓冲区供查看

adb logcat -b

  1. `Android log` 输出量巨大,特别是通信系统的log,因此,Androidlog输出到不同的缓冲区中,目前定义了四个log缓冲区:
  2. | 缓冲区 | 含义 |
  3. | --- | --- |
  4. | Radio | 输出通信系统的 log |
  5. | System | 输出系统组件的 log |
  6. | Event | 输出 event 模块的 log |
  7. | Main | 所有 java 层的 log 以及不属于上面3层的 log |
  8. 缓冲区主要给系统组件使用,一般的应用不需要关心,应用的log都输出到main缓冲区中。默认log输出(不指定缓冲区的情况下)是输出SystemMain缓冲区的log
  9. <a name="2F2iH"></a>
  10. ##### 4.8.1.7 打印指定日志缓冲区的大小

adb logcat -g

  1. <a name="lsTZN"></a>
  2. #### 4.8.2 内核日志

adb shell dmesg

  1. 输出示例:

<6>[14201.684016] PM: noirq resume of devices complete after 0.982 msecs

<6>[14201.685525] PM: early resume of devices complete after 0.838 msecs

<6>[14201.753642] PM: resume of devices complete after 68.106 msecs

<4>[14201.755954] Restarting tasks … done.

<6>[14201.771229] PM: suspend exit 2016-08-28 13:31:32.679217193 UTC

<6>[14201.872373] PM: suspend entry 2016-08-28 13:31:32.780363596 UTC

<6>[14201.872498] PM: Syncing filesystems … done.

  1. 中括号里的 `[14201.684016]` 代表内核开始启动后的时间,单位为秒。<br />通过内核日志我们可以做一些事情,比如衡量内核启动时间,在系统启动完毕后的内核日志里找到 `Freeing init memory` 那一行前面的时间就是。
  2. <a name="OIn4D"></a>
  3. ### 4.9 查看 Android 设备系统属性
  4. 查看 Android 设备系统属性的基本命令格式是:

adb shell getprop [options]

  1. 除了可以查看 Android 设备系统属性之外,还可以设置系统属性,设置系统属性的基本命令格式是:

adb shell setprop

  1. <a name="MbEFR"></a>
  2. #### 4.9.1 查看设备型号

adb shell getprop ro.product.model

  1. 输出示例:

Nexus 5

  1. <a name="iDQ0B"></a>
  2. #### 4.9.2 查看设备电池状况

adb shell dumpsys battery

  1. 输出示例:

Current Battery Service state: AC powered: false USB powered: true Wireless powered: false status: 2 health: 2 present: true level: 44 scale: 100 voltage: 3872 temperature: 280 technology: Li-poly

  1. 其中 `scale` 代表最大电量,`level` 代表当前电量。上面的输出表示还剩下 44% 的电量。
  2. <a name="zniba"></a>
  3. #### 4.9.3 查看设备屏幕分辨率

adb shell wm size

  1. 输出示例:

Physical size: 1080x1920

  1. 该设备屏幕分辨率为 1080px * 1920px。<br />如果使用命令修改过,那输出可能是:

Physical size: 1080x1920 Override size: 480x1024

  1. 表明设备的屏幕分辨率原本是 1080px * 1920px,当前被修改为 480px * 1024px
  2. <a name="4VeRN"></a>
  3. #### 4.9.4 查看设备屏幕密度

adb shell wm density

  1. 输出示例:

Physical density: 420

  1. 该设备屏幕密度为 420dpi。<br />如果使用命令修改过,那输出可能是:

Physical density: 480 Override density: 160

  1. 表明设备的屏幕密度原来是 480dpi,当前被修改为 160dpi
  2. <a name="XUeiX"></a>
  3. #### 4.9.5 查看设备显示屏参数

adb shell dumpsys window displays

  1. 输出示例:

WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays) Display: mDisplayId=0 init=1080x1920 420dpi cur=1080x1920 app=1080x1794 rng=1080x1017-1810x1731 deferred=false layoutNeeded=false

  1. 其中 `mDisplayId` 显示屏编号,`init` 是初始分辨率和屏幕密度,`app` 的高度比 `init` 里的要小,表示屏幕底部有虚拟按键,高度为 1920 - 1794 = 126px 42dp
  2. <a name="i01ji"></a>
  3. #### 4.9.6 查看设备 android_id

adb shell settings get secure android_id

  1. 输出示例:

51b6be48bac8c569 复制代码

  1. <a name="op2iS"></a>
  2. #### 4.9.7 查看设备IMEI
  3. 在 Android 4.4 及以下版本可通过如下命令获取 IMEI:

adb shell dumpsys iphonesubinfo 复制代码

  1. 输出示例:

Phone Subscriber Info: Phone Type = GSM Device ID = 860955027785041 复制代码

  1. 其中的 `Device ID` 就是 IMEI。<br />而在 Android 5.0 及以上版本里这个命令输出为空,得通过其它方式获取了(需要 root 权限):

adb shell su service call iphonesubinfo 1 复制代码

  1. 把里面的有效内容提取出来就是 IMEI 了,比如这里的是 `860955027785041`。<br />参考:[adb shell dumpsys iphonesubinfo not working since Android 5.0 Lollipop](http://stackoverflow.com/questions/27002663/adb-shell-dumpsys-iphonesubinfo-not-working-since-android-5-0-lollipop)
  2. <a name="e3QXx"></a>
  3. #### 4.9.8 查看设备 Android 系统版本

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

  1. 输出示例:

5.0.2 复制代码

  1. <a name="KA8AK"></a>
  2. #### 4.9.9 查看设备 IP 地址

adb shell ifconfig | grep Mask 复制代码

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

adb shell ifconfig wlan0 复制代码

  1. 如果以上命令仍然不能得到期望的信息,那可以试试以下命令(部分系统版本里可用):

adb shell netcfg 复制代码

  1. <a name="zdqrw"></a>
  2. #### 4.9.10 查看设备 Mac 地址

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

  1. 输出示例:

f8:a9:d0:17:42:4d 复制代码

  1. 这查看的是局域网 Mac 地址,移动网络或其它连接的信息可以通过前面的小节「IP 地址」里提到的 `adb shell netcfg` 命令来查看。
  2. <a name="5y1zr"></a>
  3. #### 4.9.11 查看设备 CPU 信息

adb shell cat /proc/cpuinfo 复制代码

  1. <a name="qO6g5"></a>
  2. #### 4.9.12 查看设备内存信息

adb shell cat /proc/meminfo 复制代码

  1. <a name="2yLok"></a>
  2. #### 4.9.13 查看设备更多硬件与系统属性
  3. 设备的更多硬件与系统属性可以通过如下命令查看:

adb shell cat /system/build.prop 复制代码

  1. 这会输出很多信息,包括前面几个小节提到的「型号」和「Android 系统版本」等。<br />输出里还包括一些其它有用的信息,它们也可通过 `adb shell getprop <属性名>` 命令单独查看,列举一部分属性如下:
  2. | 属性名 | 含义 |
  3. | --- | --- |
  4. | ro.build.version.sdk | SDK 版本 |
  5. | ro.build.version.release | Android 系统版本 |
  6. | ro.build.version.security_patch | Android 安全补丁程序级别 |
  7. | ro.product.model | 型号 |
  8. | ro.product.brand | 品牌 |
  9. | [ro.product.name](http://ro.product.name) | 设备名 |
  10. | ro.product.board | 处理器型号 |
  11. | ro.product.cpu.abilist | CPU 支持的 abi 列表[_节注一_] |
  12. | persist.sys.isUsbOtgEnabled | 是否支持 OTG |
  13. | dalvik.vm.heapsize | 每个应用程序的内存上限 |
  14. | ro.sf.lcd_density | 屏幕密度 |
  15. _节注一:_<br />一些小厂定制的 ROM 可能修改过 CPU 支持的 abi 列表的属性名,如果用 `ro.product.cpu.abilist` 属性名查找不到,可以这样试试:

adb shell cat /system/build.prop | grep ro.product.cpu.abi 复制代码

  1. 示例输出:

ro.product.cpu.abi=armeabi-v7a ro.product.cpu.abi2=armeabi 复制代码

  1. <a name="dP4bi"></a>
  2. ### 4.10 修改设置
  3. **注:** 修改设置之后,运行恢复命令有可能显示仍然不太正常,可以运行 `adb reboot` 重启设备,或手动重启。<br />修改设置的原理主要是通过 settings 命令修改 /data/data/com.android.providers.settings/databases/settings.db 里存放的设置值。
  4. <a name="IszDU"></a>
  5. #### 4.10.1 修改分辨率

adb shell wm size 480x1024 复制代码

  1. 表示将分辨率修改为 480px * 1024px。<br />恢复原分辨率命令:

adb shell wm size reset 复制代码

  1. <a name="6cPx4"></a>
  2. #### 4.10.2 修改屏幕密度

adb shell wm density 160 复制代码

  1. 表示将屏幕密度修改为 160dpi。<br />恢复原屏幕密度命令:

adb shell wm density reset 复制代码

  1. <a name="HAOPS"></a>
  2. #### 4.10.3 修改显示区域

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

  1. 四个数字分别表示距离左、上、右、下边缘的留白像素,以上命令表示将屏幕底部 200px 留白。<br />恢复原显示区域命令:

adb shell wm overscan reset 复制代码

  1. <a name="lmyLH"></a>
  2. #### 4.10.4 修改关闭 USB 调试模式

adb shell settings put global adb_enabled 0 复制代码

  1. 用命令恢复不了了,毕竟关闭了 USB 调试 adb 就连接不上 Android 设备了。 去设备上手动恢复吧:「设置」-「开发者选项」-「Android 调试」。
  2. <a name="XzQUf"></a>
  3. #### 4.10.5 修改允许/禁止访问非 SDK API
  4. 允许访问非 SDK API

adb shell settings put global hidden_api_policy_pre_p_apps 1 adb shell settings put global hidden_api_policy_p_apps 1 复制代码

  1. 禁止访问非 SDK API

adb shell settings delete global hidden_api_policy_pre_p_apps adb shell settings delete global hidden_api_policy_p_apps 复制代码

  1. 不需要设备获得 Root 权限。<br />命令最后的数字的含义:
  2. | | 含义 |
  3. | --- | --- |
  4. | 0 | 禁止检测非 SDK 接口的调用。该情况下,日志记录功能被禁用,并且令 strict mode API,即 detectNonSdkApiUsage() 无效。不推荐。 |
  5. | 1 | 仅警告——允许访问所有非 SDK 接口,但保留日志中的警告信息,可继续使用 strick mode API |
  6. | 2 | 禁止调用深灰名单和黑名单中的接口。 |
  7. | 3 | 禁止调用黑名单中的接口,但允许调用深灰名单中的接口。 |
  8. <a name="NXcBo"></a>
  9. #### 4.10.6 修改状态栏和导航栏的显示隐藏

adb shell settings put global policy_control 复制代码

  1. `<key-values>` 可由如下几种键及其对应的值组成,格式为 `<key1>=<value1>:<key2>=<value2>`
  2. | key | 含义 |
  3. | --- | --- |
  4. | immersive.full | 同时隐藏 |
  5. | immersive.status | 隐藏状态栏 |
  6. | immersive.navigation | 隐藏导航栏 |
  7. | immersive.preconfirms | ? |
  8. 这些键对应的值可则如下值用逗号组合:
  9. | value | 含义 |
  10. | --- | --- |
  11. | `apps` | 所有应用 |
  12. | `*` | 所有界面 |
  13. | `package-name` | 指定应用 |
  14. | `-package-name` | 排除指定应用 |
  15. 例如:

adb shell settings put global policy_control immersive.full=* 复制代码

  1. 表示设置在所有界面下都同时隐藏状态栏和导航栏。

adb shell settings put global policy_control immersive.status=com.package1,com.package2:immersive.navigation=apps,-com.package3 复制代码

  1. 表示设置在包名为 `com.package1` `com.package2` 的应用里隐藏状态栏,在除了包名为 `com.package3` 的所有应用里隐藏导航栏。
  2. <a name="RMOGa"></a>
  3. ### 4.11 实用功能
  4. <a name="Gm6xw"></a>
  5. #### 4.11.1 屏幕截图
  6. 截图保存到电脑:

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

  1. 如果 adb 版本较老,无法使用 `exec-out` 命令,这时候建议更新 adb 版本。无法更新的话可以使用以下麻烦点的办法:<br />先截图保存到设备里:

adb shell screencap -p /sdcard/sc.png 复制代码

  1. 然后将 png 文件导出到电脑:

adb pull /sdcard/sc.png 复制代码

  1. 可以使用 `adb shell screencap -h` 查看 `screencap` 命令的帮助信息,下面是两个有意义的参数及含义:
  2. | 参数 | 含义 |
  3. | --- | --- |
  4. | -p | 指定保存文件为 png 格式 |
  5. | -d display-id | 指定截图的显示屏编号(有多显示屏的情况下) |
  6. 实测如果指定文件名以 `.png` 结尾时可以省略 -p 参数;否则需要使用 -p 参数。如果不指定文件名,截图文件的内容将直接输出到 stdout。<br />另外一种一行命令截图并保存到电脑的方法:_Linux Windows_

adb shell screencap -p | sed “s/\r$//“ > sc.png 复制代码

  1. _Mac OS X_

adb shell screencap -p | gsed “s/\r$//“ > sc.png 复制代码

  1. 这个方法需要用到 gnu sed 命令,在 Linux 下直接就有,在 Windows Git 安装目录的 bin 文件夹下也有。如果确实找不到该命令,可以下载 [sed for Windows](http://gnuwin32.sourceforge.net/packages/sed.htm) 并将 sed.exe 所在文件夹添加到 PATH 环境变量里。<br />而在 Mac 下使用系统自带的 sed 命令会报错:

sed: RE error: illegal byte sequence 复制代码

  1. 需要安装 gnu-sed,然后使用 gsed 命令:

brew install gnu-sed 复制代码

  1. <a name="4D2Q2"></a>
  2. #### 4.11.2 录制屏幕
  3. 录制屏幕以 mp4 格式保存到 /sdcard:

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

  1. 需要停止时按 Ctrl-C,默认录制时间和最长录制时间都是 180 秒。<br />如果需要导出到电脑:

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

  1. 可以使用 `adb shell screenrecord --help` 查看 `screenrecord` 命令的帮助信息,下面是常见参数及含义:
  2. | 参数 | 含义 |
  3. | --- | --- |
  4. | --size WIDTHxHEIGHT | 视频的尺寸,比如 `1280x720`,默认是屏幕分辨率。 |
  5. | --bit-rate RATE | 视频的比特率,默认是 4Mbps |
  6. | --time-limit TIME | 录制时长,单位秒。 |
  7. | --verbose | 输出更多信息。 |
  8. <a name="iwABL"></a>
  9. #### 4.11.3 查看连接过的 WiFi 密码
  10. **注:需要 root 权限。**

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

  1. <a name="bKfBC"></a>
  2. #### 4.11.4 设置系统日期和时间
  3. **注:需要 root 权限。**

adb shell su date -s 20160823.131500 复制代码

  1. 表示将系统日期和时间更改为 2016 08 23 13 15 00 秒。
  2. <a name="MUfiW"></a>
  3. #### 4.11.5 重启手机

adb reboot 复制代码

  1. <a name="mPIUU"></a>
  2. #### 4.11.6 检测设备是否已 root

adb shell su 复制代码

  1. 此时命令行提示符是 `$` 则表示没有 root 权限,是 `#` 则表示已 root
  2. <a name="wJ6gH"></a>
  3. #### 4.11.7 使用 Monkey 进行压力测试
  4. Monkey 可以生成伪随机用户事件来模拟单击、触摸、手势等操作,可以对正在开发中的程序进行随机压力测试。<br />简单用法:

adb shell monkey -p -v 500

  1. 表示向 `<packagename>` 指定的应用程序发送 500 个伪随机事件。 Monkey 的详细用法参考 [官方文档](https://developer.android.com/studio/test/monkey.html)。
  2. <a name="QPM10"></a>
  3. #### 4.11.8 开启/关闭 WiFi
  4. **注:需要 root 权限。**
  5. - 开启 WiFi

adb root adb shell svc wifi enable

  1. - 关闭 WiFi

adb root adb shell svc wifi disable

  1. 若执行成功,输出为空;若未取得 root 权限执行此命令,将执行失败,输出 `Killed`
  2. <a name="cx9F6"></a>
  3. ### 4.12 刷机相关命令
  4. <a name="ngNvL"></a>
  5. #### 4.12.1 重启到 Recovery 模式

adb reboot recovery

  1. <a name="c6CTY"></a>
  2. #### 4.12.2 从 Recovery 重启到 Android

adb reboot

  1. <a name="AqnlJ"></a>
  2. #### 4.12.2 重启到 Fastboot 模式

adb reboot bootloader

  1. <a name="HBkKq"></a>
  2. #### 4.12.4 通过 sideload 更新系统
  3. 如果我们下载了 Android 设备对应的系统更新包到电脑上,那么也可以通过 adb 来完成更新。<br />以 Recovery 模式下更新为例:
  4. 1. 重启到 Recovery 模式。

adb reboot recovery

  1. 2. 在设备的 Recovery 界面上操作进入 `Apply update`-`Apply from ADB` 注:不同的 Recovery 菜单可能与此有差异,有的是一级菜单就有 `Apply update from ADB`
  2. 2. 通过 adb 上传和更新系统。

adb sideload

  1. <a name="J4fkn"></a>
  2. ### 4.13 安全相关命令
  3. <a name="LxMNN"></a>
  4. #### 4.13.1 启用/禁用 SELinux
  5. 启用 SELinux

adb root adb shell setenforce 1

  1. 禁用 SELinux

adb root adb shell setenforce 0

  1. <a name="J6qZd"></a>
  2. #### 4.13.2 启用/禁用 dm_verity
  3. 启用 dm_verity

adb root adb enable-verity

  1. 禁用 dm_verity

adb root adb disable-verity

  1. <a name="g47VZ"></a>
  2. ### 4.14 更多 adb shell 命令
  3. Android 系统是基于 Linux 内核的,所以 Linux 里的很多命令在 Android 里也有相同或类似的实现,在 `adb shell` 里可以调用。本文档前面的部分内容已经用到了 `adb shell` 命令。
  4. <a name="NOien"></a>
  5. #### 4.14.1 查看进程状态

adb shell ps 复制代码

  1. 输出信息各列含义:
  2. | 列名 | 含义 |
  3. | --- | --- |
  4. | USER | 所属用户 |
  5. | PID | 进程 ID |
  6. | PPID | 父进程 ID |
  7. | NAME | 进程名 |
  8. <a name="uywEA"></a>
  9. #### 4.14.2 查看处理器实时状态

adb shell top [-m max_procs] [-n iterations] [-d delay] [-s sort_column] [-t] [-h] 复制代码

  1. `adb shell top` 后面可以跟一些可选参数进行过滤查看不同的列表,可用参数及含义如下:
  2. | 参数 | 含义 |
  3. | --- | --- |
  4. | -m | 最多显示多少个进程 |
  5. | -n | 刷新多少次后退出 |
  6. | -d | 刷新时间间隔(单位秒,默认值5) |
  7. | -s | 按某列排序(可用col值:cpu, vss, rss, thr) |
  8. | -t | 显示线程信息 |
  9. | -h | 显示帮助文档 |
  10. 输出信息各列含义:
  11. | 列名 | 含义 |
  12. | --- | --- |
  13. | PID | 进程 ID |
  14. | PR | 优先级 |
  15. | CPU% | 当前瞬间占用 CPU 百分比 |
  16. | S | 进程状态(R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程) |
  17. | #THR | 线程数 |
  18. | VSS | Virtual Set Size 虚拟耗用内存(包含共享库占用的内存) |
  19. | RSS | Resident Set Size 实际使用物理内存(包含共享库占用的内存) |
  20. | PCY | 调度策略优先级,SP_BACKGROUND/SPFOREGROUND |
  21. | UID | 进程所有者的用户 ID |
  22. | NAME | 进程名 |
  23. <a name="quiQC"></a>
  24. #### 4.14.3 查看进程 UID
  25. 有两种方案:
  26. 1. `adb shell dumpsys package <packagename> | grep userId=`如:

adb shell dumpsys package org.mazhuang.guanggoo | grep userId= userId=10394 复制代码

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

adb shell gemini:/ $ ps | grep org.mazhuang.guanggoo u0a394 28635 770 1795812 78736 SyS_epoll 0000000000 S org.mazhuang.guanggoo gemini:/ $ cat /proc/28635/status | grep Uid Uid: 10394 10394 10394 10394 gemini:/ $ 复制代码 ```

五、致谢

  1. ADB Shell
  2. Awesome Adb
  3. Android Debug Bridge