1. 项目概述:为什么ADB是Android开发的瑞士军刀?
如果你在Android开发、测试或者设备管理的路上摸索过一阵子,大概率会听过“ADB”这个词。它全称是Android Debug Bridge,中文叫安卓调试桥。听起来有点技术范儿,但说白了,它就是一条连接你电脑和Android设备(手机、平板、电视盒子、甚至车机)的“数据线”,只不过这条线是虚拟的,可以通过USB或者Wi-Fi建立。我干了这么多年移动端,ADB绝对是我工具箱里使用频率排前三的命令行工具,没有之一。它的核心价值在于,让你能绕过设备上那些花里胡哨的UI界面,直接对系统底层进行操作和查询,效率提升不是一点半点。
今天要聊的,就是ADB命令里最基础、最实用,也是新手入门必学的几个操作:查看设备上所有的Apk包,以及安装(install)和卸载(uninstall)应用。别看这几个命令简单,它们是你进行应用调试、批量管理、问题排查的基石。比如,测试同事报了个Bug,说某个预装应用有问题,你怎么快速确认这个应用在设备上的完整包名?又比如,你需要给一批测试机安装内测包,难道要一个个手动点击APK文件吗?或者,你想彻底清理某个顽固应用的残留数据,光在桌面上卸载够吗?这些场景的答案,都藏在这几个看似简单的命令里。
这篇文章,我会从一个老手的视角,带你重新认识这些基础命令。我不会只给你干巴巴的命令列表,而是会拆解每个命令背后的逻辑、常见的坑,以及我在实际工作中总结出来的高效用法。无论你是刚接触Android的开发者,还是负责设备管理的测试工程师,甚至是喜欢折腾手机的极客,这篇内容都能让你把ADB用得更加得心应手。
2. ADB环境准备与连接确认
工欲善其事,必先利其器。在敲下任何命令之前,确保你的ADB环境是正常可用的,这是第一步,也是最容易出问题的一步。
2.1 获取ADB工具包
ADB工具是Android SDK Platform-Tools组件的一部分。通常有三种获取方式:
通过Android Studio安装(推荐给开发者):如果你安装了Android Studio,那么SDK Platform-Tools通常已经一并安装了。你可以在Android Studio的“Settings”(或Mac上的“Preferences”)中,找到“Appearance & Behavior” -> “System Settings” -> “Android SDK”,然后在“SDK Tools”标签页里确认“Android SDK Platform-Tools”是否已勾选安装。安装后,工具路径一般在
[你的用户目录]/AppData/Local/Android/Sdk/platform-tools/(Windows) 或~/Library/Android/sdk/platform-tools/(Mac) 或~/Android/Sdk/platform-tools/(Linux)。独立下载Platform-Tools:如果你不想安装庞大的Android Studio,可以直接从谷歌的Android开发者网站下载独立的SDK Platform-Tools包。解压后就是一个包含
adb.exe(Windows)或adb(Mac/Linux)的文件夹。通过系统包管理器安装(Linux/Mac):在一些Linux发行版(如Ubuntu)或Mac(通过Homebrew)上,可以直接用包管理器安装。例如,在Ubuntu上可以
sudo apt install adb,在Mac上可以brew install android-platform-tools。这种方式安装的版本可能不是最新的,但对于基础使用通常足够。
注意:我强烈建议,尤其是Windows用户,将ADB工具所在目录的路径添加到系统的环境变量
PATH中。这样你可以在任何命令行窗口(如CMD、PowerShell)中直接输入adb命令,而不用每次都cd到工具目录。这是提升效率的关键一步,具体添加方法可以搜索“Windows添加环境变量PATH”,教程很多。
2.2 连接设备与授权
准备好工具后,下一步就是连接设备。
对于USB连接:
- 用数据线将Android设备连接到电脑。
- 在设备上开启“开发者选项”。这个选项默认是隐藏的,需要进入“设置”->“关于手机”,连续点击“版本号”7次来激活。
- 进入“开发者选项”,开启“USB调试”。
- 首次连接时,设备屏幕上会弹出一个“允许USB调试吗?”的对话框,勾选“始终允许此计算机”然后点击“确定”。这一步至关重要,如果没授权,电脑将无法识别设备。
对于Wi-Fi连接(无线调试): 无线调试非常方便,特别是当你的设备需要频繁移动或者USB口紧张时。从Android 11开始,系统原生支持了更稳定的无线调试配对方式。
- 确保设备和电脑在同一个局域网(Wi-Fi)下。
- 先用USB线连接设备,执行命令
adb pair <设备IP:端口>。这个IP和端口需要在设备的“开发者选项”->“无线调试”里查看。 - 配对成功后,就可以断开USB线,使用
adb connect <设备IP:端口>进行无线连接了。
连接状态检查: 连接好后,打开你的命令行终端(Windows的CMD/PowerShell, Mac/Linux的Terminal),输入:
adb devices这个命令会列出当前所有连接到电脑的Android设备。如果一切正常,你会看到类似下面的输出:
List of devices attached abcdefgh0123 device这里的abcdefgh0123是你的设备序列号,后面的device状态表示设备已授权并准备就绪。如果显示unauthorized,说明你还没在设备上点击授权;如果什么都没显示,检查数据线、驱动或Wi-Fi连接。
实操心得:很多新手卡在第一步就是因为没授权。另外,一些定制化深的国产手机(如小米、华为)可能需要在“开发者选项”里额外开启“USB调试(安全设置)”或关闭“监控ADB安装应用”,才能正常使用
adb install。遇到安装失败时,记得检查这里。
3. 核心命令深度解析:查看、安装与卸载
环境搞定,我们就进入正题。这三个命令构成了应用管理的基础闭环。
3.1 查看所有已安装的Apk包 (adb shell pm list packages)
pm是Package Manager(包管理器)的缩写,它是Android系统负责管理所有应用安装、卸载、查询的核心服务。adb shell pm list packages就是向这个管理器查询包列表。
基础命令与参数: 直接运行adb shell pm list packages会列出设备上所有应用的基础包名。但输出可能很长,我们通常需要加参数进行过滤。
-f: 显示应用关联的APK文件在设备上的具体路径。adb shell pm list packages -f输出示例:
package:/data/app/com.example.myapp-1/base.apk=com.example.myapp这在需要提取APK文件时非常有用。-d: 仅显示被禁用的应用包。-e: 仅显示已启用的应用包。-s: 仅显示系统应用。-3: 仅显示第三方应用(用户安装的)。-i: 同时显示应用的安装来源(Installer)。-u: 同时显示已卸载但保留数据的应用(包名还在,但APK已删除)。--user <USER_ID>: 在多用户设备上(如平板的工作资料),指定查询哪个用户空间下的应用。0代表主用户。
最常用的组合与过滤:
查找特定应用:结合
grep(Linux/Mac) 或findstr(Windows) 进行过滤。# Linux/Mac adb shell pm list packages | grep wechat # Windows adb shell pm list packages | findstr wechat这会列出所有包名中包含“wechat”的应用。
区分系统与用户应用:
# 只看用户自己安装的应用 adb shell pm list packages -3 # 查看系统应用 adb shell pm list packages -s获取详细信息:知道包名后,可以用
adb shell dumpsys package <包名>来获取这个应用的详细信息,包括版本号(versionCode/versionName)、权限、Activity组件等,这对于深度调试非常有帮助。
注意事项:
pm list packages列出的是包名(package name),而不是应用在桌面上显示的名称。包名是应用在Android系统中的唯一标识符,格式通常类似com.company.appname。很多新手在这里会困惑,为什么找不到“微信”,实际上它的包名是com.tencent.mm。当你需要针对某个应用执行ADB操作时,必须使用它的包名。
3.2 安装应用 (adb install)
安装命令看似简单,但参数选择直接影响安装结果和调试效率。
基本安装:
adb install path/to/your/app.apk这个命令会将电脑上的APK文件推送到设备的临时目录,然后执行安装。如果设备上已存在同包名的应用,默认会安装失败。
关键参数详解:
-r: 替换已存在的应用。这是调试时最常用的参数!当你修改代码重新打包后,直接adb install -r new.apk即可覆盖安装,保留原有的应用数据(如登录状态、数据库),极大节省测试时间。-t: 允许安装测试APK。有些APK的AndroidManifest.xml中声明了android:testOnly="true",普通安装会被阻止,加上-t参数即可。-d: 允许降级安装。默认情况下,安装的APK版本号(versionCode)不能低于设备上已安装的版本。加上-d可以强制安装旧版本。-g: 在安装时授予APK中声明的所有运行时权限。从Android 6.0(API 23)开始,危险权限需要动态申请。这个参数可以在安装时自动批准所有权限,对于自动化测试非常方便。--abi <ABI>: 指定安装APK中特定ABI(应用二进制接口,如armeabi-v7a, arm64-v8a)的库。通常在APK支持多ABI,但你想指定安装某个版本时使用。
安装流程与常见错误排查: 当你执行adb install时,背后发生了这几件事:
- ADB服务将APK文件从本地推送到设备的
/data/local/tmp目录。 - ADB向设备的
packaged服务发送安装请求。 - 系统包管理器进行验证、解析、复制APK到
/data/app目录,并更新系统数据库。
这个过程可能出错,下面是一些常见错误及解决方法:
| 错误信息 | 可能原因 | 解决方案 |
|---|---|---|
INSTALL_FAILED_ALREADY_EXISTS | 应用已存在 | 使用-r参数进行覆盖安装 |
INSTALL_FAILED_INVALID_APK | APK文件损坏或不完整 | 重新构建或下载APK文件 |
INSTALL_FAILED_INSUFFICIENT_STORAGE | 设备存储空间不足 | 清理设备空间 |
INSTALL_FAILED_UPDATE_INCOMPATIBLE | 新APK与旧版本签名不一致 | 卸载旧版本后再安装,或使用相同签名密钥 |
INSTALL_PARSE_FAILED_NO_CERTIFICATES | APK没有签名 | 对APK进行签名 |
INSTALL_FAILED_TEST_ONLY | APK是测试版 | 使用-t参数 |
error: device offline | 设备连接断开 | 重新插拔USB线,或执行adb kill-server && adb start-server重启ADB服务 |
no devices/emulators found | 未检测到设备 | 运行adb devices检查连接和授权状态 |
实操心得:在持续开发测试中,我习惯用
adb install -r -g app-debug.apk。-r保证快速覆盖,-g避免每次安装都要手动点权限弹窗。另外,如果安装过程卡住或报错,一个有效的“重启大法”是:adb kill-server然后adb start-server,这能解决很多ADB守护进程的玄学问题。
3.3 卸载应用 (adb uninstall)
卸载命令同样有讲究,区别在于是否保留用户数据。
基本卸载:
adb uninstall com.example.myapp这个命令会移除APK文件,同时清除该应用的所有数据(包括数据库、SharedPreferences、缓存文件等)。相当于用户在设置里点击了“卸载”并清理了数据。
关键参数-k:
adb uninstall -k com.example.myapp这个-k参数意为“keep data”(保留数据)。它只会卸载APK文件,但保留该应用在/data/data/<包名>和/sdcard/Android/data/<包名>下的所有数据。这有什么用呢?
- 场景一:测试数据持久化。你开发了一个应用,用户登录并产生了一些数据。你想测试应用升级流程是否会影响现有数据。可以先
uninstall -k卸载,然后安装新版本APK,看看数据是否还在。 - 场景二:快速恢复测试状态。如果你不小心卸载了应用,但想快速恢复到有数据的测试状态,只要APK和数据还在,就可以先
install,数据可能还在(取决于系统实现,并非100%)。更稳妥的做法是提前备份数据。
卸载系统应用(需要Root): 对于预装的系统应用,普通的uninstall命令无效。在已Root的设备上,你可以使用以下步骤:
- 使用
adb shell进入设备的命令行。 - 执行
su获取Root权限。 - 使用
pm uninstall -k --user 0 <包名>来为当前用户卸载系统应用(系统应用本身不会被删除,只是对当前用户禁用)。或者使用pm disable-user <包名>来禁用。 - 更彻底的方法是,挂载系统分区为可写,然后直接删除
/system/app或/system/priv-app目录下的对应APK文件。此操作有风险,可能导致系统不稳定。
注意事项:
adb uninstall必须后跟包名,而不是应用名或APK路径。如果你只有APK文件不知道包名,可以用aapt工具解析(aapt dump badging app.apk | grep package),或者先把APK安装到设备上,再用pm list packages配合过滤找出新安装的包名。
4. 高级应用场景与实战技巧
掌握了基础命令,我们来看看如何把它们组合起来,解决一些实际工作中更复杂的问题。
4.1 批量操作与自动化脚本
手动一个个操作效率太低。通过简单的Shell脚本或批处理,可以实现自动化。
场景一:为所有连接的设备安装APK。这在同时测试多台手机时非常有用。
#!/bin/bash # 脚本名:install_to_all.sh APK_PATH=$1 for device in $(adb devices | grep 'device$' | awk '{print $1}') do echo "正在安装到设备: $device" adb -s $device install -r "$APK_PATH" done使用:./install_to_all.sh ./app-release.apk
场景二:批量卸载一组特定的第三方应用。比如,清理所有测试机上的某系列竞品应用。
# 假设我们要卸载所有包名以‘com.test.’开头的应用 adb shell pm list packages -3 | grep 'com.test.' | while read line do pkg=${line#package:} # 去掉‘package:’前缀 echo "卸载: $pkg" adb uninstall $pkg done场景三:提取设备上所有用户应用的APK文件到电脑。用于备份或分析。
#!/bin/bash # 脚本名:backup_user_apks.sh BACKUP_DIR="./apk_backup_$(date +%Y%m%d)" mkdir -p "$BACKUP_DIR" adb shell pm list packages -3 -f | while read line do # 行格式:package:/path/to/apk=com.example.app apk_path=${line#package:} apk_path=${apk_path%=*} pkg_name=${line##*=} echo "正在备份: $pkg_name" adb pull "$apk_path" "$BACKUP_DIR/$pkg_name.apk" done echo "备份完成,文件位于: $BACKUP_DIR"4.2 与Monkey测试、UI Automator等工具联动
ADB命令很少孤立使用,它往往是自动化测试流程的“启动器”和“清道夫”。
标准Monkey测试流程:
- 清理环境:卸载旧版本,或清除应用数据 (
adb shell pm clear <包名>)。 - 安装最新待测APK:
adb install -r app-debug.apk - 启动应用:
adb shell am start -n <包名>/<主Activity名> - 执行Monkey测试:
adb shell monkey -p <包名> -v --throttle 100 1000 - 测试后收集日志:
adb logcat -d > monkey_log.txt - (可选)卸载应用:
adb uninstall <包名>
与UI Automator结合: 在编写UI Automator测试脚本时,通常会在@BeforeClass设置方法中,用ADB命令确保设备处于测试所需的初始状态(如关闭动画、点亮屏幕、解锁等)。
// 示例:在测试开始前执行一些ADB命令 Process process = Runtime.getRuntime().exec("adb shell settings put global window_animation_scale 0"); process.waitFor(); process = Runtime.getRuntime().exec("adb shell settings put global transition_animation_scale 0"); process.waitFor(); process = Runtime.getRuntime().exec("adb shell settings put global animator_duration_scale 0"); process.waitFor(); // 点亮屏幕并解锁(需要设备已设置免密或已知密码) process = Runtime.getRuntime().exec("adb shell input keyevent KEYCODE_WAKEUP"); process = Runtime.getRuntime().exec("adb shell input swipe 300 1000 300 500"); // 简单滑动解锁,需适配具体设备4.3 疑难杂症排查实录
在实际操作中,你肯定会遇到一些令人头疼的情况。这里分享几个我踩过的坑和解决办法。
问题1:adb install失败,提示INSTALL_FAILED_VERIFICATION_FAILURE
- 现象:安装过程中,设备屏幕上可能弹出“禁止安装此应用”的提示,命令行报此错误。
- 原因:这通常是因为设备开启了“Google Play保护机制”或厂商自带的“安装验证服务”,它们会拦截来自未知来源或未经认证的APK。
- 解决:
- 临时方案:在设备上,进入“设置”->“安全”或“更多设置”->“设备与隐私”,找到“安装未知来源应用”或“外部来源应用检查”,临时关闭验证(测试完毕后建议重新打开)。
- 对于MIUI等深度定制系统,可能还需要在“开发者选项”中关闭“MIUI优化”或“启用安全设置”。
问题2:卸载应用后,应用图标仍在桌面上(多见于第三方Launcher)
- 现象:通过
adb uninstall成功卸载后,命令行返回Success,但桌面图标还在,点击会提示“应用未安装”。 - 原因:桌面(Launcher)的图标缓存没有及时更新。这不是ADB的问题,是Launcher的问题。
- 解决:
- 最简单的方法:重启设备。
- 或者,清除默认Launcher应用的数据(
adb shell pm clear com.android.launcher3,包名因Launcher而异)。这会重置桌面布局。
问题3:安装时提示“空间不足”,但设备明明还有很大空间
- 现象:
INSTALL_FAILED_INSUFFICIENT_STORAGE,但查看设备存储,可用空间远大于APK大小。 - 原因:Android系统有多个存储分区。
/data分区(用于安装应用)可能已满,而/sdcard分区(用户存储)还有空间。adb shell df命令可以查看各分区使用情况。 - 解决:
- 清理
/data分区:卸载不用的应用,或使用adb shell pm clear清理应用缓存。 - 对于已Root的设备,可以考虑使用
adb shell pm move-package命令将应用移动到SD卡(如果支持)。
- 清理
问题4:如何静默安装(无界面)?
- 需求:在后台自动化流程中,不希望安装界面弹出干扰。
- 限制:普通的
adb install命令本身就不会在设备前台弹出安装界面,安装过程在后台进行。所谓的“静默安装”通常指无需用户交互(如点击“安装”按钮)。对于非系统应用,在没有Root权限的情况下,Android系统不允许完全的静默安装(绕过PackageInstaller界面),这是出于安全考虑。 - 变通方案:
- 对于系统应用或拥有
INSTALL_PACKAGES系统权限的应用(需要预制在系统中),可以使用adb shell pm install在Shell环境下安装。 - 在自动化测试框架中(如UI Automator),可以编写脚本自动点击安装界面的“下一步”、“安装”按钮,模拟用户操作。
- 在已Root的设备上,可以将APK直接推送到
/data/app目录,并修改正确的权限,然后重启或发送广播让系统识别。但这非常复杂且容易出错,不推荐普通用户使用。
- 对于系统应用或拥有
5. 安全须知与最佳实践
使用ADB这把“瑞士军刀”很强大,但也需要小心,不当操作可能带来风险。
谨慎使用
adb shell rm等删除命令:在adb shell环境下,你拥有很高的权限。误删系统文件可能导致设备变砖。尤其是在Root后的设备上,操作/system、/vendor等分区务必小心。黄金法则:在执行任何删除或修改系统文件的命令前,先echo一下命令,确认路径无误。理解
adb uninstall与adb shell pm clear的区别:uninstall:移除整个应用(APK+数据)。pm clear <包名>:只清除应用的数据和缓存,但保留APK。这常用于将应用恢复到首次安装的状态进行测试,比卸载再安装快得多。
管理多台设备:当有多台设备通过USB或网络连接到同一台电脑时,执行ADB命令需要使用
-s <设备序列号>来指定目标设备,否则ADB会随机选择或报错。adb devices可以查看所有设备的序列号。无线调试的安全隐患:无线ADB调试非常方便,但请记住,一旦设备与电脑配对成功,任何在同一网络下、知道设备IP和端口的人都有可能尝试连接。因此,在公共网络环境下使用无线调试后,建议在设备上关闭“无线调试”开关,或者使用
adb disconnect断开连接。备份重要数据:在进行任何可能影响系统或应用数据的操作(尤其是卸载系统应用、清除数据)之前,如果数据重要,请先通过
adb backup(已弃用但部分版本仍可用)或更推荐的方法(如各手机厂商的云服务、第三方备份工具)进行备份。
ADB的命令世界远不止于此,但查看、安装、卸载这三个操作是基石。把它们用熟、用透,你就能高效地处理大部分与Android应用生命周期相关的基础任务。记住,最好的学习方式就是动手实践,打开你的命令行,连上设备,把今天提到的命令都敲一遍,观察输出,你会有更深的体会。遇到问题别怕,善用adb --help和adb shell pm --help查看官方说明,结合网络搜索,大部分问题都能找到答案。