10、Shell 命令入门:adb shell 进入 Linux 环境、常用 Linux 命令(ls、cd、cat、ps、grep)、实战:查看 CPU 占用

说实话,很多做 Android 开发的朋友,对 adb 的认知就停留在「装个 apk、看个 logcat」。但你要真想深入调试、排查线上问题,adb shell 这关必须过。它就像一把钥匙,能把你带进 Android 设备底层的 Linux 世界。

我个人习惯,拿到一台新手机或者平板,第一件事就是 adb shell 进去逛一圈。看看系统版本、进程列表、CPU 负载……嗯,心里就有底了。今天咱们就聊聊怎么用好这个 shell 环境。

10.1 adb shell:通往 Linux 内核的大门

Android 底层跑的是 Linux 内核。adb shell 说白了,就是让你在电脑上开一个远程终端,直接操作手机里的 Linux 系统。你敲的每一条命令,都会在手机上执行。

怎么进去?很简单:

adb shell

敲完回车,你的命令行提示符会变成 generic_x86_64:/ $ 或者类似的样子。这就说明你已经进入 Android 设备的 Linux 环境了。

小提示:如果你只想执行一条命令,不想进入交互式 shell,可以这样写:adb shell "ls -l /data"。这样更高效,适合写脚本。

10.2 常用 Linux 命令:ls、cd、cat、ps、grep

进了 shell,你面对的就是一个精简的 Linux 文件系统。我挑几个最常用的命令讲讲,这些我在项目里几乎天天用。

10.2.1 ls —— 列出目录内容

查看当前目录下有什么文件或文件夹:

ls
ls -l
ls -a
ls -la

-l 显示详细信息(权限、大小、修改时间),-a 显示隐藏文件(以点开头的文件)。

我曾经排查一个存储空间不足的问题,就是用 ls -la 发现某个应用在 /data/data/ 下生成了大量日志文件,直接占了几百兆空间。

10.2.2 cd —— 切换目录

在文件系统里跳转:

cd /data
cd /system
cd /sdcard
cd ..

注意,Android 的 shell 环境里,/sdcard 通常指向内部存储,但不同厂商可能有差异。我建议你进去后先 ls / 看看根目录结构。

10.2.3 cat —— 查看文件内容

查看文本文件内容,比如查看 CPU 信息:

cat /proc/cpuinfo

或者查看内存信息:

cat /proc/meminfo

cat 命令在 Android 里特别有用,因为很多系统信息都暴露在 /proc 虚拟文件系统下。你想想看,这些文件不是真实存在的,而是内核动态生成的,读它们就能拿到系统状态。

10.2.4 ps —— 查看进程列表

查看当前系统中运行的进程:

ps
ps -A

ps -A 会显示所有进程,包括系统进程。输出里包含 PID(进程 ID)、PPID(父进程 ID)、CPU 占用、内存占用等信息。

注意:Android 的 ps 命令和标准 Linux 的 ps 有些差异。比如 ps aux 在 Android 上可能不支持。我建议直接用 ps -A 或者 ps -ef,兼容性更好。

10.2.5 grep —— 文本搜索神器

grep 用来在输出中过滤关键字。它和 ps、cat 组合使用,威力巨大:

ps -A | grep com.android.phone
cat /proc/meminfo | grep MemTotal

管道符 | 把前一个命令的输出传给 grep,grep 只显示包含指定关键字的行。这个组合拳,我在定位进程、查日志时几乎必用。

10.3 实战:查看 CPU 占用

好,理论讲完了,咱们来点实际的。怎么用 adb shell 查看 CPU 占用?

最直接的方法:

adb shell top

top 命令会实时显示进程的 CPU 和内存占用,类似 Windows 的任务管理器。输出大概长这样:

PID   USER     PR  NI  VIRT  RES  SHR S  %CPU  %MEM     TIME+  NAME
1234  u0_a123  10  -10  1.2G  120M  80M S  12.5   3.2   0:15.30  com.example.app
5678  system   18  -2   1.5G  200M  90M S   8.1   5.4   1:02.10  system_server
...

重点看 %CPU 这一列,数值越高说明该进程越吃 CPU。

如果你只想看某个应用的 CPU 占用,可以配合 grep:

adb shell top -n 1 | grep com.example

-n 1 表示只刷新一次就退出,适合脚本调用。

核心思路:CPU 占用高,通常意味着应用在做大量计算、频繁的垃圾回收、或者死循环。用 top 定位到具体进程后,再结合 logcat 或者 trace 文件进一步分析。

还有一种方法,读取 /proc/stat 文件:

adb shell cat /proc/stat

这个文件里记录了系统整体的 CPU 时间片分配情况。不过解析起来稍微复杂一些,一般调试用 top 就够了。

我曾经遇到一个线上问题:某款手机在播放视频时发热严重。我通过 adb shell top -d 1 实时监控,发现一个名为 mediaserver 的进程 CPU 占用飙到 80% 以上。进一步排查,是某个第三方解码库在循环重试,导致 CPU 满载。嗯,定位到问题后,替换解码库就解决了。

10.4 知识体系一览

为了让你更直观地理解本章的知识结构,我画了一张图:

adb shell 进入 Android Linux 环境 常用 Linux 命令 ls 列出目录 cd 切换目录 cat 查看文件 ps 查看进程 grep 过滤 实战:查看 CPU 占用 (top)

这张图把本章的核心脉络串起来了:adb shell 是入口,常用命令是工具,实战是目标。你只要把 ls、cd、cat、ps、grep 这五个命令练熟,再配合 top 命令,日常的 CPU 问题排查基本够用了。

10.5 避坑指南

最后分享几个我踩过的坑:

  • 权限问题:有些目录(比如 /data/data)普通用户权限进不去。这时候需要 adb root 或者 adb shell su。但注意,很多量产手机没有 root 权限。
  • 命令不存在:Android 的 shell 环境是精简版,有些 Linux 命令(比如 htopiotop)可能没有。别慌,用 topps 也能凑合。
  • 输出格式差异:不同 Android 版本的 ps 输出列顺序可能不同。我建议先跑一次看看表头,再写脚本解析。

我曾经在调试某款低端机时,发现 top 命令居然不支持 -n 参数。后来改用 cat /proc/stat 手动计算 CPU 占用,虽然麻烦点,但也能解决问题。嗯,这就是经验——工具不顺手时,换条路走。

好了,这一章的内容就到这里。记住,adb shell 是你深入 Android 系统的一把钥匙,多用、多练,自然就熟了。


公众号:蓝海资料掘金营,微信 deep3321