Android 是一个相对开放的系统,有着许多隐藏的可能性等待挖掘。

ADB ADB 全称 Android Debug Bridge,即安卓调试桥。使用 ADB,可以用电脑进行文件传输、应用安装(无需手机端反复点击确认)、执行终端命令等操作。【Android 官方的 ADB 文档】

Android 终端 Android 基于 Linux 系统的内核,因此继承了 Linux 的终端。使用终端命令,可以进行修改分辨率、禁用/启用应用(包括系统应用)、打开应用隐藏页面等操作。利用终端还可以像在 Linux 上一样进行编程。终端可以使用 ADB 访问,也可以用“终端模拟器”应用访问。【一款终端模拟器】

Android 用户权限 Android 终端中有一些操作,例如禁用/启用应用,只能由 ADB 终端执行,而不能由“终端模拟器”应用执行,这是因为每个应用以独立的用户身份运行(尽管这个说法并不严谨),而 ADB 终端以 shell 用户身份运行。Root 权限是对 Linux 系统的最高访问权,但出于安全性考虑,安卓系统中的用户无法直接使用 Root 权限。

本文将介绍关于 ADB、Android 终端和 Android 用户权限的基础知识。所有 PC 上进行的操作以 Windows 系统为例。

此文章的发布时间是 2021 年第四季度,相关内容于 2021/12/18 之后被验证。
请留意内容的时效性。

本文不是教程,你不需要亲自尝试其中的每一个操作。如果你不知道自己在做什么,那就不要做。
若阅读本文并执行相关操作后出现设备损坏、隐私泄露、数据丢失等情况,则机主需要自行承担损失。

ADB 下载与安装

ADB 不是 Windows 系统内置软件,需要自行安装才能使用。

若已安装 Android SDK,请使用其附带的 adb,不要另外安装 platform-tools。

1. 下载正确的 platform-tools。【platform-tools 官方下载】

2. 将压缩包解压至适当的文件夹,并将其设置为 Path。【搜索“设置为 Path”】

3. 打开命令行界面,输入 adb version。若正常显示 ADB 版本,说明安装已经完成。

Microsoft Windows [版本 10.0.22509.1000]
(c) Microsoft Corporation。保留所有权利。

C:\Users\[redacted]>adb version
Android Debug Bridge version 1.0.41
Version 31.0.3-7562133
Installed as D:\android_sdk\platform-tools\adb.exe

C:\Users\[redacted]>

ADB 连接真机

ADB 连接,即 USB 调试是开发专用的功能,Android 中默认不开启。

启用开发者选项

若设置中已经有开发者选项,则无须重复启用。

1. 在设置中进入“关于设备”。

2. 连续点击“版本号”一项 7 次。

点击版本号

3. 在设置中找到新增的“开发者选项”,并进入。

开发者选项的位置

若第 3 步仍然无法在设置中找到“开发者选项”(这一般发生在智能学习机、播放器等设备中),说明设备制造商隐藏了开发者选项。
此时可以安装 Nova Launcher 等带有活动选择列表的工具软件并用其打开开发者选项。【Nova Launcher 下载】

Nova Launcher 使用提示:打开后完成初步设置进入桌面,长按桌面空白处,选择添加“活动”小部件,在弹出的菜单中选择“设置”-“开发者选项”,然后点击桌面上创建的图标即可进入。

开启 USB 调试

4. 打开“开发者设置”。

5. 找到“调试”分类目录,打开 USB 调试。

USB 调试选项的位置

连接到电脑

6. 将设备在开机状态下用 USB 数据线连接至电脑。

7. 若设备使用“仅充电”模式连接(此状态提示会出现在通知栏中),请改用其他模式,然后拔下设备重新插入。

8. 打开命令行界面,输入 adb devices。此时移动设备上将显示 USB 调试授权窗口。点击“确认”。

C:\Users\[redacted]>adb devices
List of devices attached
0123456789ABCDEF        unauthorized

调试授权窗口

若调试授权窗口没有出现,请确保电脑上没有安卓模拟器在运行。然后依次运行 adb kill-server adb start-server,再次检查授权窗口。

不要在公用电脑上勾选“一律允许”。ADB 对设备的访问权限较高,被恶意程序利用将导致隐私泄露。
若不慎勾选,可以进入开发者选项,选择“撤销 USB 调试授权”。

9. 再次执行 adb devices。设备状态显示为 device,则连接成功。

C:\Users\yezhiyi9670>adb devices
List of devices attached
0123456789ABCDEF        device

若调试授权窗口始终不出现,且 adb devices 命令不显示任何设备,则可能是 ADB 驱动缺失(少数较旧的电脑会出现这一情况)。【搜索“adb 驱动缺失”】

ADB 连接模拟器

正常情况下,模拟器会使用内置的 adb 程序自动完成连接,连接后使用方法与真机一致。但若模拟器内置 adb 与用户安装的 adb 版本不兼容,则无法进行调试操作。

将模拟器的内置 adb 替换为新版

1. 找到自己安装的(或 Android SDK 中的)adb.exe。

2. 打开模拟器安装目录,找到其中的 adb.exe。用自己的 adb.exe 将其替换。

夜神模拟器还需要用自己的 adb.exe 替换安装目录下的 nox_adb.exe。

ADB 常见命令

多设备访问

ADB 一次命令只能操作一个设备。若有多个设备连接至 ADB(实际使用时尽量避免这种情况),则执行命令时必须指定设备。

要指定设备,应当添加 -s <设备序列号> 参数。设备序列号即为 adb devices 命令中看到的名称。例如,命令 adb install com.android.chrome.apk 应当改为 adb -s 0123456789ABCDEF install com.android.chrome.apk

若无法避免多个设备连接,且需要执行大量命令,则使用 -t <transport_id> 指定设备更加方便。

使用 adb devices -l 可以获取设备的 transport_id。

下文的操作不再考虑多个设备连接至 ADB 的情况。

重启设备

使用命令 adb reboot 可以立即重启设备。

  • adb reboot 正常重启。
  • adb reboot recovery 重启进入 recovery,此模式用于进行系统更新,也可用来刷入官方刷机包修复受损的系统。
    通常,也可以通过关机状态下长按电源+音量上(若有实体 HOME 键,可能也需要按)进入。
  • adb reboot bootloader 重启进入 fastboot 模式,此模式用于刷入自定义镜像。
    通常,也可以通过关机状态下长按电源+音量上(若有实体 HOME 键,可能也需要按)进入。

关于启动模式的介绍

Recovery 中的 Wipe data / Factory reset 选项是恢复出厂设置,慎用!

解锁 Bootloader 会清空数据,不当使用 fastboot 模式会使设备无法启动或无法正常使用。请确保你知道自己在干什么!

访问终端

命令 adb shell 可以以 shell 身份(权限)打开 Android 系统的终端。adb shell <命令> 将立即执行命令并退出终端。

安装应用

使用命令 adb install <apk软件包路径> 安装软件。大多数设备中,这会直接安装软件,不需要用户确认;少数设备需要用户选择是否允许安装。

Android 6.0 及以上版本,会使用 Streamed Install 方法,该方法速度较快。早于 Android 6.0 的版本会使用传统 Push Install 方法,这种情况下,apk 文件的名称不能包含非 ASCII 字符(不严谨地说,不能包含中文),否则会引发编码问题无法成功安装。

卸载应用

使用命令 adb uninstall <软件包名> 即可卸载软件。

使用 adb uninstall -k <软件包名> 会保留数据。若需要重新安装该软件,则新的安装包必须满足覆盖安装条件(应用签名一致,版本相同或更新),否则无法安装。若要清除数据和覆盖安装条件,使用 adb shell pm clear <软件包名>

Root 模式(仅限模拟器)

命令 adb root 可以使 ADB 命令直接以 root 身份执行,此时可以执行 adb remount 等操作,且 adb shell 会默认以 root 身份运行。adb unroot 可以撤销。

这是非常不安全的,故生产环境下的设备不能使用,即使设备已经获取 Root 权限。

挂载系统分区为可读写(仅限模拟器)

系统文件分区默认为只读挂载,无法修改。

Root 模式下,命令 adb remount 将暂时挂载 /system 系统分区为可读写,这样可以修改系统文件。

修改系统文件可能导致系统无法启动或正常使用,这种情况称为设备“变砖”。永远不要做没有十足把握的修改!
对系统文件的修改不能通过恢复出厂设置还原!

等效的 Android 终端命令为 remount -o rw,remount /system

传递文件

传入文件:adb push <Windows 上的文件或文件夹> <Android 上的目标目录>

仅传入修改日期更晚的文件:adb push --sync <Windows 上的文件或文件夹> <Android 上的目标目录>

取出文件:adb pull <Android 上的文件或文件夹> <Windows 上的目标目录>

注意,Android 内置存储器的路径是 /storage/emulated/0/(或简写 /sdcard/)。此命令也能操作内置存储器以外的文件。

若需要操作的文件存储在内置存储器中,且可以通过 MTP 模式 USB 连接访问,则仍然更提倡使用 MTP 模式传输,因为 MTP 协议有压缩机制,速度比 ADB 文件传输快得多。【搜索“MTP 模式 USB 连接”】

备份还原

此功能已经弃用,未来可能被移除。

使用命令 adb backup <package> 可以将应用的数据备份到电脑。

使用 adb restore <package> 可以还原备份。

注意这两个命令执行后,需要在移动设备上确认。

应用数据内带有签名验证,因此应用的签名必须一致,数据才能够还原。并不能在破解游戏后通过这种方法恢复进度。

使用 Android 终端

进入终端

设备已连接 ADB 的情况下,在 Windows 端命令行界面输入 adb shell,即可进入终端。

C:\Users\[redacted]>adb shell
shell@m2:/ $

在 Android 系统下,可以通过“终端模拟器”应用访问终端。【一款终端模拟器】

u0_a64@m2:/ $

需要注意,这两种方式进入的终端是相同的,但能执行的操作却不一样。这是因为 adb shell 进入终端,终端以 shell 身份权限打开;终端模拟器进入终端,终端以应用本身的身份(u0_a64)打开。shell 权限对设备的访问权更高,而应用本身则不能执行大部分常用命令。

若终端命令提示符中未显示当前用户名,可以输入 whoami 获取。

基本初等命令

使用终端,可以完成基础的文件操作。【搜索“Linux 终端入门”】

命令 用途
cd <dir> 切换到目录
exit Ctrl-D,退出终端
rm <-rf> <filename> 删除文件,参数 r 允许删除目录,参数 f 强制
cat <filename> 输出文本文件的内容(不是文本文件也行,随便)
mkdir <dirname> 创建文件夹
mv <old-path> <new-path> 重命名,或同分区内文件移动
cp <old-path> <new-path> 复制
ls <-la> [<dir>] 列出目录内文件,默认为当前目录
chmod <mode> <filename> 修改文件的权限
chown <mode> <filename> 修改文件的所有者
组合符号 用途
<command> & <command> 一次性执行多个命令,遇到返回值不为 0 终止
<command> > <filename> 执行结果输出到文件
<command> < <filename> 文件作标准输入
<command> | <command> 执行多个命令,无论返回值,并将前一个的输出作为下一个的输入

跨分区移动的方法:复制后删除源文件。

Android 系统中,文件权限有严格限制。内置 SD 卡中,chmod 命令不能改变权限。要暂时执行可执行文件,应当将文件放入 /data/local/tmp/ 目录下,修改权限并执行。

软件包管理器 - pm

pm 命令用于管理系统上已经安装的软件包。

包名是系统中软件包的唯一标识符。系统设置的“应用”页面一般不会显示包名,可以使用幸运破解器等软件查看包名。【幸运破解器 下载】幸运破解器 ×  应用工具箱 √

命令 用途
pm list packages 列出所有软件包名
pm list packages -s 列出系统内置软件包名
pm list packages -3 列出用户安装的软件包名
pm install <filename> 安装 APK 文件
pm uninstall <package> 卸载软件
pm uninstall -k <package> 卸载软件但保留数据,重新安装的软件必须满足覆盖安装条件
pm clear <package> 清除软件数据(若软件包已卸载,同时移除覆盖安装条件)
pm uninstall --user 0 <package> 为默认用户卸载,可以卸载系统内置软件
pm hide <package> 禁用应用[仅 6 及以下]
pm disable-user <package> 禁用应用[仅 7 及以上]
pm unhide <package> 启用应用[仅 6 及以下]
pm enable <package> 启用应用[仅 7 及以上]
pm path <package> 获取应用在系统内的 APK 路径

注:所谓“系统内置”,不是“系统预装”,而是指不能卸载的系统预装应用。

应用禁用后,桌面图标将被删除。因机型不同,这些应用在应用列表中可能显示为“已停用”,也可能完全隐藏。
禁用的应用将不能使用,也无法后台运行。
在设置中“重置应用偏好设置”,或覆盖安装被禁用的应用,均能解除禁用。

获取应用的 APK 路径后,可以直接用 adb pull 命令取出 APK。

系统内置应用卸载后,同包名应用仍然需要满足覆盖安装条件才能安装(这是因为应用无法从 /system 分区被删除)。
若未备份原始的 APK 文件,则被卸载的系统应用只能通过恢复出厂设置还原(某些预构建的应用,例如时钟,甚至无法使用原有 APK 还原),请谨慎操作!

显示(窗口)管理器 - wm

使用 wm 命令,可以为设备设置自定义分辨率和 DPI(DPI 相当于 Windows 的缩放比例)。

命令 用途
wm size 查看当前分辨率
wm size <width>x<height> 设置分辨率
wm size reset 重置默认分辨率
wm density 查看当前 DPI
wm density <dpi> 设置 DPI
wm density reset 重置 DPI

Android 7 或更高版本中,可以直接通过设置调节显示项目的大小。

  • 显示 > 显示大小,可以选择系统预先设定的值。
  • 系统 > 开发者选项 > 最小宽度,可以指定自定义值。

分辨率调节容易出现问题,若仅仅需要调整显示项目的大小,仅修改 DPI。
不合理的分辨率或 DPI 设置将导致显示异常,甚至阻止设备正常使用。

在终端模拟器中获取 shell 权限

终端模拟器打开的终端使用的是应用的身份,而非 shell 身份。这导致很多命令(例如 pm wm)不能执行。

若要不借助电脑执行这些命令,则需要找到在终端模拟器中获取 shell 权限的方法。

对于已经获取 root 权限的设备,可以在终端模拟器中输入 su 直接获得最高访问权,不需要使用其他方法获取 shell 权限。

此处介绍的方法仅有少数设备能成功。

1. 打开 USB 调试,断开与电脑的连接,然后重启设备。

2. 在终端模拟器中输入 adb shell。(若系统内没有 ADB,可以尝试使用 Termux 终端模拟器,然后执行 pkg install android-tools

3. 系统应当弹出授权窗口。尽快点击“确定”,几秒后,具有 shell 权限的终端将会打开。

Shell、Root 和应用权限

Root 权限

Android 基于 Linux 内核,Root 权限就是 Linux 中对系统的最高访问权。为保证基本的安全性,Android 系统不对用户开放这一权限。通过漏洞或刷机获得这一权限的过程称为“Root”。

获取到 Root 权限的应用几乎无所不能,因此,Root 权限也常常被称为“超级用户”权限(Superuser Access)。按通常的方案获得 Root 权限后,申请 Root 权限的终端命令也因此称为 su

通常,获取 Root 权限有三类手段:

  • 漏洞破解。通常,一键 Root 软件以这种方式工作。如今,这种方式比较难成功。
  • 开启 Root。部分设备制造商会内置 Root 权限,并允许用户自行按需要启用。
  • 刷机修改。这种方法具有理论可行性,是公认的“通解通法”,也这是目前的主流方法。这种方法需要设备制造商允许刷机。

现在经常有“设备获取 Root 权限不安全”的说法,这种说法过于绝对。目前的 Root 方案较为完善,用户获取 Root 权限并不一定不安全,善用 Root 还能保护隐私,但是,对于使用不谨慎或喜欢冒险的用户,确实会大大增加隐私泄露、数据丢失、设备损坏的风险。若设备遭已获取 Root 权限的恶意软件攻击,则后果也会比一般的恶意软件攻击严重得多。

此处不赘述获得 Root 权限的具体方法。

Shell 权限

使用 ADB 打开的终端具有 Shell 权限。Shell 权限能够操作 Android 中大多数命令,但限制仍然较多,不能修改系统文件,也无法访问应用的数据。

在具有 shell 权限的终端下,可以执行 run-as <package>(目标应用包必须被指定为“可调试”)。执行后,终端仍然以 shell 身份运行,并且会被额外授予对该应用数据的访问权(还会自动帮你切到应用的数据目录)。这对游戏破解等工作的帮助较大。

应用权限

系统内应用及其打开的终端将具有应用本身的权限。应用权限受到严格限制(显然受 Android 权限管理限制),无法执行大多数终端命令。但是,应用可以访问自己的数据文件。


undefined