ADB核心命令实战:高效查看、安装与卸载Android应用 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.exeWindows或adbMac/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.apkcom.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:testOnlytrue普通安装会被阻止加上-t参数即可。-d: 允许降级安装。默认情况下安装的APK版本号versionCode不能低于设备上已安装的版本。加上-d可以强制安装旧版本。-g: 在安装时授予APK中声明的所有运行时权限。从Android 6.0API 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_APKAPK文件损坏或不完整重新构建或下载APK文件INSTALL_FAILED_INSUFFICIENT_STORAGE设备存储空间不足清理设备空间INSTALL_FAILED_UPDATE_INCOMPATIBLE新APK与旧版本签名不一致卸载旧版本后再安装或使用相同签名密钥INSTALL_PARSE_FAILED_NO_CERTIFICATESAPK没有签名对APK进行签名INSTALL_FAILED_TEST_ONLYAPK是测试版使用-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、缓存文件等。相当于用户在设置里点击了“卸载”并清理了数据。关键参数-kadb 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/apkcom.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_DIR4.2 与Monkey测试、UI Automator等工具联动ADB命令很少孤立使用它往往是自动化测试流程的“启动器”和“清道夫”。标准Monkey测试流程清理环境卸载旧版本或清除应用数据 (adb shell pm clear 包名)。安装最新待测APKadb 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 疑难杂症排查实录在实际操作中你肯定会遇到一些令人头疼的情况。这里分享几个我踩过的坑和解决办法。问题1adb 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查看官方说明结合网络搜索大部分问题都能找到答案。

本月热点