![[基础预科] ADB、Android 终端、Android 用户权限](/_astro/hero.DXYW7Bkl_Z2s68vP.webp)

[基础预科] ADB、Android 终端、Android 用户权限
Android 是一个相对开放的系统,有着许多隐藏的可能性等待挖掘。本文是对 ADB 相关内容的预科。
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 系统为例。
ADB 下载与安装#
ADB 不是 Windows 系统内置软件,需要自行安装才能使用。
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]>
plainADB 连接真机#
ADB 连接,即 USB 调试是开发专用的功能,Android 中默认不开启。
启用开发者选项#
1. 在设置中进入“关于设备”。
2. 连续点击“版本号”一项 7 次。
3. 在设置中找到新增的“开发者选项”,并进入。
开启 USB 调试#
4. 打开“开发者设置”。
5. 找到“调试”分类目录,打开 USB 调试。
连接到电脑#
6. 将设备在开机状态下用 USB 数据线连接至电脑。
7. 若设备使用“仅充电”模式连接(此状态提示会出现在通知栏中),请改用其他模式,然后拔下设备重新插入。
8. 打开命令行界面,输入 adb devices
。此时移动设备上将显示 USB 调试授权窗口。点击“确认”。
C:\Users\[redacted]>adb devices
List of devices attached
0123456789ABCDEF unauthorized
plain9. 再次执行 adb devices
。设备状态显示为 device
,则连接成功。
C:\Users\yezhiyi9670>adb devices
List of devices attached
0123456789ABCDEF device
plainADB 连接模拟器#
正常情况下,模拟器会使用内置的 adb 程序自动完成连接,连接后使用方法与真机一致。但若模拟器内置 adb 与用户安装的 adb 版本不兼容,则无法进行调试操作。
将模拟器的内置 adb 替换为新版#
1. 找到自己安装的(或 Android SDK 中的)adb.exe。
2. 打开模拟器安装目录,找到其中的 adb.exe。用自己的 adb.exe 将其替换。
ADB 常见命令#
多设备访问#
ADB 一次命令只能操作一个设备。若有多个设备连接至 ADB(实际使用时尽量避免这种情况),则执行命令时必须指定设备。
要指定设备,应当添加 -s <设备序列号>
参数。设备序列号即为 adb devices
命令中看到的名称。例如,命令 adb install com.android.chrome.apk
应当改为 adb -s 0123456789ABCDEF install com.android.chrome.apk
。
下文的操作不再考虑多个设备连接至 ADB 的情况。
重启设备#
使用命令 adb reboot
可以立即重启设备。
adb reboot
正常重启。adb reboot recovery
重启进入 recovery,此模式用于进行系统更新,也可用来刷入官方刷机包修复受损的系统。
通常,也可以通过关机状态下长按电源+音量上(若有实体 HOME 键,可能也需要按)进入。adb reboot bootloader
重启进入 fastboot 模式,此模式用于刷入自定义镜像。
通常,也可以通过关机状态下长按电源+音量上(若有实体 HOME 键,可能也需要按)进入。
访问终端#
命令 adb shell
可以以 shell 身份(权限)打开 Android 系统的终端。adb shell <命令>
将立即执行命令并退出终端。
安装应用#
使用命令 adb install <apk软件包路径>
安装软件。大多数设备中,这会直接安装软件,不需要用户确认;少数设备需要用户选择是否允许安装。
卸载应用#
使用命令 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/
)。此命令也能操作内置存储器以外的文件。
备份还原#
使用命令 adb backup <package>
可以将应用的数据备份到电脑。
使用 adb restore <package>
可以还原备份。
注意这两个命令执行后,需要在移动设备上确认。
应用数据内带有签名验证,因此应用的签名必须一致,数据才能够还原。并不能在破解游戏后通过这种方法恢复进度。
使用 Android 终端#
进入终端#
设备已连接 ADB 的情况下,在 Windows 端命令行界面输入 adb shell
,即可进入终端。
C:\Users\[redacted]>adb shell
shell@m2:/ $
plain在 Android 系统下,可以通过“终端模拟器”应用访问终端。【一款终端模拟器】 ↗
u0_a64@m2:/ $
plain需要注意,这两种方式进入的终端是相同的,但能执行的操作却不一样。这是因为 adb shell
进入终端,终端以 shell 身份权限打开;终端模拟器进入终端,终端以应用本身的身份(u0_a64)打开。shell 权限对设备的访问权更高,而应用本身则不能执行大部分常用命令。
基本初等命令#
使用终端,可以完成基础的文件操作。【搜索“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> | 同时执行命令 |
<command> && <command> | 顺序执行直到出现返回值不为 0 为止 |
<command> > <filename> | 执行结果输出到文件 |
<command> < <filename> | 文件作标准输入 |
<command> | <command> | 执行多个命令,无论返回值,并将前一个的输出作为下一个的输入 |
软件包管理器 - 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 路径 |
注:所谓“系统内置”,不是“系统预装”,而是指不能卸载的系统预装应用。
显示(窗口)管理器 - 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 |
在终端模拟器中获取 shell 权限#
终端模拟器打开的终端使用的是应用的身份,而非 shell 身份。这导致很多命令(例如 pm
wm
)不能执行。
若要不借助电脑执行这些命令,则需要找到在终端模拟器中获取 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 权限的具体方法。
Shell 权限#
使用 ADB 打开的终端具有 Shell 权限。Shell 权限能够操作 Android 中大多数命令,但限制仍然较多,不能修改系统文件,也无法访问应用的数据。
在具有 shell 权限的终端下,可以执行 run-as <package>
(目标应用包必须被指定为“可调试”)。执行后,终端仍然以 shell 身份运行,并且会被额外授予对该应用数据的访问权(还会自动帮你切到应用的数据目录)。这对游戏破解等工作的帮助较大。
应用权限#
系统内应用及其打开的终端将具有应用本身的权限。应用权限受到严格限制(显然受 Android 权限管理限制),无法执行大多数终端命令。但是,应用可以访问自己的数据文件。
封面图来自网络,未经明确授权。