adb其他命令介绍详见上一篇: Android SDK: adb 常用命令的使用(无线连接、端口转发、文件传输、APK安装卸载、Logcat日志)

1. adb shell

通过 Android SDK 的adb shell命令可以向已连接的 Android 设备或模拟器发送 shell 命令。adb shell 命令官网介绍

执行 shell 命令方式一:

# 不进入远程 shell 的情况下, 直接执行 shell 命令, 执行完后退出
adb shell <shell_commands>

执行 shell 命令方式二:

adb shell           # 先远程登录到 Android 设备的 shell 环境, 
shell_commands      # 然后再持续执行 shell 命令
...
exit                # 退出登录

命令示例:

adb shell getprop       # 获取设备的属性信息

# 或

adb shell               # 先登录到远程 shell 环境
getprop                 # 再执行命令(获取设备的属性信息)

Android 系统内核是 Linux,所以许多 Linux 系统的命令在 Android 系统中都可以使用,Linux 系统常用命令参考:

  • Linux常用命令:文件操作、压缩解压(tar/gzip/bzip2/zip/unzip)
  • Linux用户和权限管理:用户/组增删改查、文件权限
  • Linux系统管理命令:进程、网络、磁盘、关机重启等

下面介绍几个 Android 系统特有的几个实用的命令(am, pm, wm, ...)。

2. Activity Manager: am

am是 Activity 管理命令,可以使用该命令执行各种系统操作,例如 启动Activity、强行停止进程、开启服务、发送广播等。Activity Manager(am)命令官网介绍

  • 查看帮助
am
# 或
am help
  • 启动 Activity
命令格式: am start <intent>

intent 参数:
    -n      # component, intent 组件, 格式为: "包名/组件名", 例如 "com.example.app/.StartActivity"
    -a      # action, intent 动作, 例如 "android.intent.action.VIEW"
    -c      # category, intent 类别, 例如 "android.intent.category.BROWSABLE"
    -f      # flags, 和 intent.setFlags(int) 方法相同
    
    -d      # data_uri,  intent 数据URI, 例如 "file:///mnt/sdcard/aa.png"
    -t      # mime_type, intent MIME类型, 例如 "image/png"
    
    -e      # 和 --es 相同
    --esn   # 添加 null extra,     格式: --esn extra_key
    --es    # 添加 string extra,   格式: --es extra_key string_value
    --ei    # 添加 int extra,      格式: --ei extra_key int_value
    --el    # 添加 long extra,     格式: --el extra_key long_value
    --ef    # 添加 float extra,    格式: --ef extra_key float_value
    --ez    # 添加 boolean extra,  格式: --ez extra_key boolean_value
    --eu    # 添加 uri extra,      格式: --es extra_key uri_value

命令示例:
    # 让手机默认浏览器打开一个网页
    am start -a android.intent.action.VIEW -c android.intent.category.BROWSABLE -d https://m.baidu.com
    
    # 打开电话拨号盘
    am start -a android.intent.action.DIAL -d tel:10086
    
    # 打电话
    am start -a android.intent.action.CALL -d tel:10086
    
    # 打开微信, 微信(v6.7.3)的主入口 Activity 为 com.tencent.mm.ui.LauncherUI
    am start -n com.tencent.mm/.ui.LauncherUI
    
    # 打开微信(完整的启动 APP 命令)
    am start -n com.tencent.mm/.ui.LauncherUI -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
  • 启动服务
命令格式: am startservice <intent>

intent 参数参考 am start 命令中的介绍

命令示例:
    # 启动包名为 com.example.app 的 APP 中的 com.example.app.MyService 服务
    am startservice -n com.example.app/.MyService
  • 发送广播
命令格式: am broadcast <intent>

intent 参数参考 am start 命令中的介绍

命令示例:
    # 发送 SD 卡挂载完成的广播
    am broadcast -a android.intent.action.MEDIA_MOUNTED -d file:///mnt/sdcard/
  • 终止进程
命令格式: am kill <package>  或  am kill-all

命令示例:
    # 终止与包名 com.example.app 关联的所有进程
    am kill com.example.app
    
    # 终止所有后台进程
    am kill-all
  • 强行停止应用
命令格式: am force-stop <package>

命令示例:
    # 强行停止与包名 com.example.app 关联的所有应用
    am force-stop com.example.app

3. Package Manager: pm

pm是包管理命令,即应用管理器,可以使用该命令对设备的软件包(APP)进行管理,例如安装、查看、卸载等。Package Manager(pm)命令官网介绍

  • 查看帮助
pm
# 或
pm help
  • 查看软件包列表
命令格式: pm list packages [options] [package_name_filter]

options 常用参数:
    -f      # 查看它们关联的文件
    -d      # 过滤, 只显示停用软件的包(disabled)
    -e      # 过滤, 只显示启用的软件包(enabled)
    -s      # 过滤, 只显示系统的软件包(system)
    -3      # 过滤, 只显示第三方的软件包(third)
    -i      # 查看软件包的安装器
    -u      # 包含已卸载的软件包

命令示例:
    pm list packages                # 列出所有已安装的软件包
    pm list packages com.example    # 列出所有包名包含 com.example 的软件包
    pm list packages -3             # 列出所有第三方软件包(非系统自带的, 自己安装的APP)
    pm list packages -d             # 列出所有被停用的软件包
  • 安装软件包
命令格式: pm install [options] <apk_path>

options 常用参数:
    -r      # 替换已安装的包,保留其数据
    -d      # 允许版本降级安装(只限 debug 包)
    -g      # 授予所有运行时权限

apk_path 参数: 注意这里的 apk 路径指的是 Android 文件系统中的路径

命令示例:
    pm install /sdcard/demo.apk             # 从 SD 卡中安装 APK
    pm install /data/local/tmp/temp.apk     # 从 Android 设备临时目录安装一个 APK
    pm install -r /sdcard/demo.apk          # 安装 APK, 替换掉当前版本
  • 卸载软件包
命令格式: pm uninstall [options] <package>

options 参数:
    -k      # 移除软件包后保留其数据和缓存目录

命令示例:
    pm uninstall com.example.app        # 卸载软件包, 并删除数据
    pm uninstall -k com.example.app     # 卸载软件包, 保留其数据
  • 删除软件包数据
命令格式: pm clear <package>

命令示例:
    pm clear com.example.app            # 删除软件包关联的所有数据
  • 停用软件包
命令格式: pm enable <package_or_component>

命令示例:
    pm enable com.example.app           # 停用软件包, 停用后 APP 启动图标将被隐藏
  • 启用软件包
命令格式: pm disable <package_or_component>

命令示例:
    pm disable com.example.app           # 启用软件包
  • 软件包授权
命令格式: pm grant <package> <permission>

命令示例:
    # 给软件包授予写外部存储器的权限
    pm grant com.example.app android.permission.WRITE_EXTERNAL_STORAGE
  • 软件包撤销权限
命令格式: pm revoke <package> <permission>

命令示例:
    # 撤回软件包读写外部存储器的权限
    pm revoke com.example.app android.permission.READ_EXTERNAL_STORAGE
    pm revoke com.example.app android.permission.WRITE_EXTERNAL_STORAGE

4. Window Manager: wm

wm窗口管理命令可以获取屏幕的 分辨率像素密度 等信息,甚至可以临时修改屏幕的 分辨率像素密度 等参数,可以很方便地查看 APP 在不同像分辨率和素密度手机/平板上的显示效果。

  • 查看帮助
wm
# 或
wm help
  • 查看 屏幕分辨率 和 像素密度
wm size                 # 查看屏幕的 分辨率, 单位: px
wm density              # 查看屏幕的 像素密度, 单位: dpi(dots per inch)
  • 修改 屏幕分辨率 和 像素密度
wm size 720x1280        # 把屏幕分辨率(宽x高)修改为: 720px * 1280px
wm size 360dpx640dp     # 把屏幕分辨率(宽x高)修改为: 360dp * 640dp
                        # dp 单位将根据当前 density 自动转换为 px

wm density 360          # 把屏幕像素密度改为 360 dpi

wm size reset           # 撤销对屏幕分辨率的修改(改回真实的物理分辨率)
wm density reset        # 撤销对屏幕像素密度的修改(改回真实的像素密度)

屏幕尺寸、分辨率、像素密度 这三个参数时相互关联的,可以由其中两个参数算出第三个参数,像素密度的单位是 dpi(即每英寸的像素点数量),因此有下列公式:

像素点数(px)
物理尺寸(inch) = ---------------------
                  像素密度(px/inch)

修改 分辨率 和 像素密度,实际上修改后导致的是屏幕尺寸的变化,当然这个改变是虚拟的,只不过是修改成和指定尺寸屏幕的显示效果(显示内容的多少)一致:

  • 分辨率相同,像素密度(density) 越大,屏幕尺寸越小,显示的内容越少(dp/sp 作为显示单位)。
  • 分辨率相同,像素密度(density) 越小,屏幕尺寸越大,显示的内容越多(dp/sp 作为显示单位)。

5. 屏幕截图: screencap

screencap命令可以对设备显示屏当前显示的内容进行截屏。语法格式:

命令格式: screencap [options] <save_file>

options 参数:
    -h      # 输出帮助信息
    -p      # 保存为 png 格式
    -d      # 指定显示器(多屏幕显示的情况), 默认为0

命令示例:
    screencap /mnt/sdcard/demo.png      # 截屏保存到 SD 卡

# PS: 命令是在 Android 设备中, 保存的文件路径是 Android 系统的文件路径;
#     如果保存的文件名后缀为 .png, 将自动保存为 png 格式;
#     如果没有给定保存的文件位置, 截屏结果将输出到标准输出流。

不登录远程 shell,直接截屏并把图片拉取到 PC 本地:

# 截屏临时保存到 Android 系统的临时目录
adb shell screencap /data/local/tmp/demo.png

# 拉取截取的图片保存到本地
adb pull /data/local/tmp/demo.png

# 删除在 Android 系统临时目录生成的截屏
adb shell rm /data/local/tmp/demo.png

6. 屏幕录制: screenrecord

screenrecord命令是一个录制 Android 设备(Android 4.4+ 版本)屏幕视频的实用工具,该命令将屏幕录制成 MPET-4 格式的视频文件。

语法格式:

命令格式: screenrecord [options] <save_file>

options 参数:
    --help          # 输出帮助信息

    --size          # 录制的尺寸, 宽x高, 默认值是设备屏幕的原生分辨率(如果支持), 
                    # 如果不支持, 则使用 1280x720。

    --bit-rate      # 设置录制视频的比特率(bit/s), 比特率越高视频质量越高, 
                    # 但文件存储也会变大。例如设置为 4Mbps: --bit-rate 4000000

    --time-limit    # 设置最大录制时长(单位为秒), 默认值和最大值均为 180(3分钟)
    
    --verbose       # 录制时显示日志信息
    
    --rotate        # 旋转 90 度输出(此功能为实验性)

结束录制: 录制时按下 Ctrl+C 或 到达 --time-limit 指定时间

命令示例:
    # 录制屏幕, 保存到 SD 卡
    screenrecord /sdcard/demo.mp4
    
    # 录制屏幕, 指定录制宽高为 720x1280, 比特率为 4Mbps, 录制 30 秒
    screenrecord --size 720x1280 --bit-rate 4000000 --time-limit 30

录制屏幕,完成后拉取到 PC 本地:

# 录制屏幕, 保存到 SD 卡
adb shell screenrecord /sdcard/demo.mp4

# 把 SD 卡保存的录屏拉取到 PC 本地
adb pull /sdcard/demo.mp4

PS: 有些手机系统把 screenrecord 命令移除了,通常移除了该命令的手机系统都会另外提供自带的录屏工具,但需要在手机上操作录屏。

7. 获取设备属性信息: getprop

getprop命令用于获取 Android 系统的各项属性信息。语法格式:

getprop [NAME [DEFAULT]]

常用属性示例:

getprop                             # 列出所有属性信息

getprop ro.product.manufacturer		# 获取设备的厂商, 例如: HUAWEI
getprop ro.product.brand            # 获取设备的商标, 例如: HUAWEI
getprop ro.product.model            # 获取设备的型号, 例如: BLA-AL00

getprop ro.build.version.release    # 获取设备的 Android 版本, 例如: 8.1.0
getprop ro.build.version.sdk        # 获取设备的 SDK Version, 例如: 27

getprop ro.boot.serialno            # 获取设备的序列号, 例如: 8FE0917B20005668
getprop ro.board.platform           # 获取设备的 CUP 平台, 例如: kirin970

getprop dalvik.vm.heapstartsize     # 虚拟机进程的分配的初始堆内存大小
getprop dalvik.vm.heapgrowthlimit   # 虚拟机进程的堆内存增长极限大小
getprop dalvik.vm.heapsize          # 虚拟机进程的堆内存大小

8. 自动化测试: monkey

monkey命令是一个用于对应用程序进行压力测试的实用工具,该命令随机发送指定次数的用户事件流(按键输入、触屏、手势等)到 APP 界面。monkey 是猴子的单词,顾名思义就是在手机 APP 上蹿下跳不断地随意乱输入一通。

  • 语法格式:
Usage: monkey [options] <COUNT>

options 参数:
    -p <allowed_package>            # 允许测试的软件包, 可以指定多个 -p 参数支持多个软件包
    -c <main_category>              # 主分类, 可以指定多个 -c 参数
    
    --ignore-crashes                # 忽略崩溃, 继续执行事件
    --ignore-native-crashes         # 忽略 native 崩溃, 继续执行事件
    --ignore-timeouts               # 忽略超时, 继续执行事件
    --ignore-security-exceptions    # 忽略安全异常, 继续执行事件
    --monitor-native-crashes        # 监控 native 崩溃
    
    --kill-process-after-error      # 发生错误时杀死进程
    --hprof
    --match-description <text>
    
    --pct-touch <percent>           # 触摸事件百分比, 例如指定触摸事件比例为 30%, 格式为: --pct-touch 30
    --pct-motion <percent>          # 手势动作事件百分比, 所有事件百分比之和不能超过 100%
    --pct-trackball <percent>       # 轨迹事件百分比 
    --pct-syskeys <percent>         # 系统按键事件百分比
    --pct-nav <percent>             # 基本导航事件百分比
    --pct-majornav <percent>        # 主要导航事件百分比
    --pct-appswitch <percent>       # APP 切换事件百分比
    --pct-flip <percent>            # 弹事件百分比
    --pct-anyevent <percent>        # 其他事件百分比
    --pct-pinchzoom <percent>       # 缩放(捏)事件百分比
    --pct-permission <percent>      # 权限事件百分比
    
    --pkg-blacklist-file <file>     # 
    --pkg-whitelist-file <file>     # 
    
    --wait-dbg                      # 如果 adb 断开, 等待 adb 连接, 直到 adb 恢复连接后继续执行 monkey
    --dbg-no-events                 
    --setup scriptfile
    -f <scriptfile>                 # 指定用于测试的脚步文件, 可以指定多个 -f 参数
    --port <port>
    -s <seed>                       # 产生伪随机事件的种子, 相同的 -s 产生的事件流相同, 格式(可指定多个-s): -s 1
    -v                              # 反馈信息级别, -v 越多个, 输如的日志信息越详细, 最多支持 3 个 -v
    --throttle <ms>                 # 事件之间的间隔(单位为毫秒), 例如 200毫秒 的格式: --throttle 200
    --randomize-throttle            # 随机事件间隔时间
    --profile-wait <ms>             # 
    --device-sleep-time <ms>        # 
    --randomize-script              #
    --script-log                    # 
    --bugreport                     # 
    --periodic-bugreport            # 
    --permission-target-system      #
  • 命令示例:
# 在 com.example.app 这个 APP 上随机发送 10000 个事件
monkey -p com.example.app 10000
    
# 事件间隔10毫秒, 随机发送 10000 个事件
monkey -p com.example.app --throttle 10 10000
    
# 触屏事件占 30%, 手势事件占 10%, 发送 10000 个事件
monkey -p com.example.app --pct-touch 30 --pct-motion 10 10000

9. 其他 Shell 命令: /system/bin

acpi              am                     app_process      app_process32
app_process64     applypatch             appops           appwidget
atrace            awk                    base64           basename
bcc               blockdev               bmgr             bu
bugreport         bugreportz             bunzip2          bzcat
bzip2             cal                    cat              chcon
chgrp             chmod                  chown            chroot
chrt              cksum                  clear            cmd
cmp               comm                   content          cp
cpio              crash_dump32           crash_dump64     cut
dalvikvm          dalvikvm32             dalvikvm64       date
dd                debuggerd              dex2oat          dexdiag
dexdump           dexlist                df               diff
dirname           dmesg                  dos2unix         dpm
du                dumpsys                echo             egrep
env               expand                 expr             fallocate
false             fgrep                  file             find
flock             fmt                    free             getenforce
getevent          getprop                grep             groups
gunzip            gzip                   head             hid
hostname          hw                     hwclock          id
ifconfig          ime                    incident         inotifyd
input             insmod                 ionice           iorenice
ip                ip-wrapper-1.0         ip6tables        ip6tables-restore
ip6tables-save    ip6tables-wrapper-1.0  iptables         iptables-restore
iptables-save     iptables-wrapper-1.0   keystore_cli_v2  kill
killall           ld.mc                  linker           linker64
linker_asan       linker_asan64          ln               load_policy
locksettings      log                    logcat           logname
logwrapper        losetup                ls               lshal
lsmod             lsof                   lspci            lsusb
md5sum            media                  microcom         mkdir
mkfifo            mkfs.ext2              mkfs.ext3        mkfs.ext4
mknod             mkswap                 mktemp           modinfo
modprobe          monkey                 more             mount
mountpoint        mv                     ndc              ndc-wrapper-1.0
netstat           newfs_msdos            nice             nl
nohup             oatdump                od               otapreopt
otapreopt_script  paste                  patch            patchoat
perfetto          pgrep                  pidof            ping
ping6             pkill                  pm               pmap
printenv          printf                 ps               pwd
readlink          realpath               reboot           renice
requestsync       resize2fs              restorecon       rm
rmdir             rmmod                  run-as           runcon
schedtest         screencap              screenrecord     secdiscard
secilc            sed                    sendevent        sensorservice
seq               service                setenforce       setprop
setsid            settings               sh               sha1sum
sha224sum         sha256sum              sha384sum        sha512sum
sleep             sm                     sort             split
start             stat                   stop             strings
stty              svc                    swapoff          swapon
sync              sysctl                 tac              tail
tar               taskset                tc               tc-wrapper-1.0
tee               telecom                time             timeout
toolbox           top                    touch            toybox
tr                true                   truncate         tty
tzdatacheck       uiautomator            ulimit           umount
uname             uniq                   unix2dos         uptime
usleep            uudecode               uuencode         vmstat
vr                wc                     which            whoami
wm                xargs                  xxd              yes
zcat