1. 搞清楚ADB是什么,再决定怎么学
1.1 ADB的完整身份:它不只是“刷机工具”
ADB全称Android Debug Bridge,中文叫安卓调试桥。它本质上是电脑和安卓设备之间的一座通信管道,走的是标准的Client-Server架构。你电脑上敲的每一条ADB命令,都会先发到电脑后台运行的adb server进程,再由这个server通过USB线或者Wi-Fi网络转发给手机里的adbd守护进程执行,最终把结果回传并打印在你的终端窗口里。这套机制从安卓早期一直沿用到现在,稳定性非常高。
我见过不少朋友把ADB等同于“刷机专用”,这是个很大的误解。刷机只是ADB能力的冰山一角。ADB能做的是系统层面的操作,包括安装和卸载应用、拷贝文件、抓取运行日志、模拟按键和触摸、调整系统设置、查看CPU和电池状态等等。可以说,只要你的手机连着电脑并且开启了USB调试,ADB就给了你一把和系统内核直接对话的钥匙。
这里顺便说一下架构里容易踩坑的点。很多新手装了ADB工具后,发现命令敲下去报“device offline”或者“连接不到服务器”,多半就是电脑后台的adb server没起来,或者被占用。解决办法是执行adb kill-server之后再执行adb start-server,两条命令就能强制重启服务进程。这个操作在后面的排查环节还会反复用到。
1.2 哪些人真正需要学会ADB?对照一下你有没有这些需求
根据我这些年接到的咨询,需要用到ADB的人群大致集中在下面几类。你可以对号入座,如果你的需求不在里面,可能暂时不需要花太多精力去学。
第一类是安卓应用开发者和测试人员。对他们来说ADB就是日常吃饭的家伙,装包、跑logcat、模拟弱网、截图录屏、做自动化测试,样样离不开。
第二类是玩机爱好者和搞机用户。具体需求包括:想要冻结系统自带的应用来省电去广告(热词里的“vivo adb精简列表”“红米k70能用adb冻结吗”都属于这类);需要给旧电视、机顶盒开启ADB来安装第三方应用;或者需要对手机进行更精细的权限管理,比如“adb禁止应用联网”。
第三类是自动化办公和效率工具的使用者。比如热词里提到的“adb 企业微信 自动打卡”,本质就是通过ADB模拟点击和输入,配合脚本在指定时间自动执行操作。这种方式比传统按键精灵更稳定,因为它走的是系统级接口,不依赖屏幕坐标的浮层识别。
第四类是智能硬件和物联网方向的开发者,经常需要借助ADB去调试安卓系统的开发板、车机、商用显示设备等。
看完这个列表你应该明白,ADB学习的深度完全取决于你的目标。只为了解决某个具体问题,比如冻结几个应用,那你只要掌握工具安装和几条命令就够。如果你想系统性地用ADB提升日常效率,那就要把设备管理、日志、输入模拟这几块串起来学。所以接下来我按“安装→连接→常用命令→进阶玩法→问题排查”这条路径来写,你按需跳读也行。
2. 从零到能跑通:ADB工具包下载与安装全流程
2.1 Windows电脑:官方工具包安装与配置
ADB工具的获取渠道,我一直推荐优先使用Google官方发布的Platform Tools包,也就是platform-tools。这个压缩包体积不大,二十多兆,里面就包含了adb.exe、fastboot.exe等基础的可执行文件。优点是干净、无广告、和系统兼容性最好,不存在第三方工具捆绑修改的风险。
下载完成后,解压到一个你自己能记住的位置。这里我给一个建议,把整个platform-tools文件夹直接放到磁盘根目录下,比如C:\platform-tools。为什么要放根目录?因为ADB命令经常需要在命令行里跳转路径,放得越浅,后面敲路径就越省事。如果你非要放在带空格的路径里,比如C:\Program Files\platform-tools,那配置环境变量时很容易被空格搞出各种奇葩问题,尤其是老手也会不小心翻车。
接下来是关键步骤:配置环境变量。右键“此电脑”→属性→高级系统设置→环境变量,在“系统变量”里找到Path这一项,点击编辑,新建一条,把C:\platform-tools填进去,一路确定保存。配置之后需要重新打开一个命令行窗口才会生效。然后在任意目录下打开CMD或者PowerShell,输入adb version,如果能看到类似Android Debug Bridge version 1.0.41这样的输出,说明安装成功。
如果你不想配置环境变量,也可以每次都在platform-tools目录下打开命令行,或者把adb.exe所在的路径写死在命令里。但说实话,既然要认真用ADB,环境变量这一步是省不掉的必修课。否则每次都要输一长串路径,用不了几次你就会嫌烦。
2.2 macOS和Linux环境下的安装差异
Mac用户装ADB要简单不少。如果你机器上已经装了Homebrew,一条命令就能搞定:
brew install android-platform-tools装完不用配置任何环境变量,直接在终端里敲adb version就能用。这里有个小坑是Homebrew源的速度,国内网络环境下建议把brew源切换成国内的镜像再执行安装,否则可能卡在下载阶段。
Linux环境下,不同发行版的包管理器不一样。Debian/Ubuntu系可以用:
sudo apt install android-tools-adb不过部分Linux发行版仓库里的ADB版本偏老,如果遇到新机型连接时提示版本不兼容,建议还是去官方下载platform-tools解压使用,步骤和Windows类似,把路径写进~/.bashrc的export语句里。
2.3 要不要装额外的手机USB驱动?
很多新手卡在了电脑识别不到设备这一步。Windows下通常需要安装OEM厂商提供的USB驱动。谷歌官方提供的通用ADB驱动能解决大部分问题,但部分品牌的机型必须安装自家驱动才能正确识别,比如早期的三星、HTC,以及部分国产品牌在特定模式下。
从实际经验来看,现在的安卓手机绝大多数走的是标准的USB复合设备协议,即插即用。只要你手机开启了“USB调试”,插上数据线,电脑的设备管理器里一般会出现“ADB Interface”或者带感叹号的未知设备。如果出现未知设备,右键更新驱动,手动定位到你下载的platform-tools目录里的usb_driver文件夹,让系统去搜索即可。
需要注意,数据线也是个大坑。我遇到过不止一次,用户换了一根只能充电不能传数据的线,结果折腾了一下午排查驱动。所以连接之前,先确认你的数据线支持数据传输。
3. 手机端准备:开启USB调试并完成首次连接
3.1 开启开发者选项的正确姿势
默认情况下,安卓的开发者选项是隐藏的。你需要进到“设置→关于手机”,找到“版本号”这一项,连续点击七次。点击过程中系统会提示“您已进入开发者模式”,部分定制系统可能会要求输入锁屏密码确认。
然后回到设置首页,一般会出现“开发者选项”入口,或者在“更多设置”“系统管理”这类子菜单里。进入开发者选项后,需要打开两个开关,一个是“USB调试”,另一个建议打开“USB安装”,后者允许通过ADB安装应用时弹窗少一些。
针对厂商定制系统,这里额外提醒一句。小米、vivo、OPPO等厂商的系统在开发者选项里还藏了“USB调试(安全设置)”之类的二级开关,允许通过USB模拟点击和修改权限。如果你后续要跑自动化脚本或使用输入模拟功能,需要把这个选项也打开,否则ADB的input命令会被系统拦截。
3.2 首次连接电脑:授权弹窗那些事
手机开启USB调试、连上数据线后,电脑命令行输入adb devices,正常情况下手机会弹出一个“是否允许USB调试”的授权窗口,勾选“始终允许”,点击确定。然后再次执行adb devices,就能看到类似下面这样的输出:
List of devices attached XXXXXX1234 device看到device状态就说明连接成功了。这里的XXXXXX1234是设备的序列号,不同机型显示的内容不一样。如果你的设备状态显示的是unauthorized,那就是授权没通过,需要检查手机上那个弹窗是否已经处理。
这里还有一个细节,授权弹窗只会在首次连接时触发。如果哪天你执行adb devices发现设备状态一直挂在unauthorized,而手机上又没弹窗,最直接的办法是拔掉数据线重新插一次,或者在开发者选项里点击“撤销USB调试授权”,重新授权。
3.3 无线调试:摆脱数据线束缚
USB连接虽然稳定,但线材限制始终不便。安卓11及以上版本原生支持“无线调试”功能,它的原理是通过配对码在局域网内建立安全连接,不需要手机root。开启方式在开发者选项里找到“无线调试”,打开后用命令:
adb pair 手机IP:配对端口 adb connect 手机IP:连接端口系统会显示一个六位配对码,配对成功后,后续直接用adb connect就能无线连接。注意无线调试对网络稳定性要求比较高,如果发现延迟明显或者经常掉线,优先检查电脑和手机是否在同一网段,以及路由器是否开启了AP隔离。
安卓10及以下的旧机型要无线连接,需要先USB连接一次,然后执行:
adb tcpip 5555这条命令会让手机在5555端口开启ADB监听。之后就能拔掉数据线,用adb connect 手机IP:5555进行无线连接了。需要注意,手机重启后这个监听端口会失效,需要重新USB连接一次再执行。
4. 常用ADB命令速查:从基础到实用全覆盖
4.1 设备管理与应用装卸
ADB的日常操作核心就是围绕设备的连接状态和应用管理展开。连接状态查看用adb devices,这个命令我一天能敲几十遍。如果电脑连着多台设备,需要在命令后面加-s 设备序列号来指定目标设备,否则会报错提示“more than one device/emulator”。
应用安装和卸载的命令格式如下:
adb install -r 包路径.apk adb uninstall 包名-r参数表示覆盖安装,保留应用数据。升级测试应用时这个参数很实用。-s参数可以把应用安装到SD卡(在支持SD卡的老机型上)。还有一个参数-t比较冷门,它允许安装测试用的APK,如果你在跑自动化测试,经常会用到。
卸载的时候需要填的是应用的包名,而不是应用显示的名称。怎么获取包名?可以用:
adb shell pm list packages这条命令会列出手机里所有应用的包名。输出结果一大串,建议配合grep过滤(Windows下用findstr),比如想找微信的包名,就执行adb shell pm list packages | grep tencent。不同厂商的应用市场App包名五花八门,这个过滤技巧很实用。
4.2 文件传输:手机和电脑之间互传文件
把电脑上的文件推到手机存储里,用:
adb push 本地文件路径 /sdcard/目标路径把手机上的文件拉到电脑上,用:
adb pull /sdcard/目标路径 本地目录这两个命令在日常使用中非常频繁。比如你想提取手机里的应用安装包,先adb shell pm path 包名拿到APK在系统里的存放路径,然后用adb pull拉出来保存到电脑就行。
文件传输有一点要注意,Android的存储权限分区比较严格,推送到/sdcard/目录(也就是内部存储)之外的系统目录,会提示Permission denied。你需要在手机上提前用文件管理器或者ADB命令把目标目录权限放宽,不然很容易踩坑。
4.3 截图与录屏:拿不到Root也能做
调试过程中需要取证或者做演示文档时,ADB自带截图和录屏功能真是太好用了。截图命令是:
adb shell screencap -p /sdcard/screen.png adb pull /sdcard/screen.png录屏命令是:
adb shell screenrecord /sdcard/demo.mp4按组合键Ctrl+C可以提前结束录制。录屏的默认编码参数是H.264,帧率、码率、分辨率都可以通过参数调整。比如--size 720x1280可以控制输出分辨率,--bit-rate 4000000可以控制码率。这个功能在反向排查App卡顿问题时特别管用,因为你不必在手机上装一堆录屏软件,直接从系统层面录,几乎不影响性能。
4.4 日志抓取:用logcat定位App崩溃现场
热词里专门有“adb logcat 抓取日志”这一条,说明这是很多人实际会碰到的需求。logcat是安卓系统的日志输出通道,应用运行时的异常信息、崩溃堆栈、系统警告都会在这里面输出。
最常用的抓取方式是:
adb logcat -v time > crash.log-v time会在每条日志前加上时间戳,方便按时间线排查。>符号的意思是把输出重定向到文件,这样日志会在后台持续写入。抓取一段时间后按Ctrl+C停止,然后用文本编辑器打开crash.log,搜索“FATAL”“Exception”“AndroidRuntime”这些关键字,通常就能定位到崩溃原因。
针对某个具体应用,更精准的过滤方式是指定进程ID。先执行adb shell pidof 包名拿到进程ID,然后adb logcat --pid=进程ID,这样输出的日志就只剩目标App的内容,其它无关信息全部被过滤掉了。
4.5 系统信息查看:内存CPU电池功耗一手掌握
日常调试和玩机过程中,查看系统当前状态是一项基本需求。查看电池信息:
adb shell dumpsys battery输出结果里会包含电池电量、温度、电压、充电状态等完整信息。热词里提到的adb shell dumpsys battery set usb 0就是dumpsys battery的子命令之一,它的作用是把USB充电状态置为0,也就是模拟拔掉USB供电。这个命令在测试续航和功耗时非常有用,你可以用它欺骗系统,让手机以为没在充电,从而更准确地评估App在真实电池场景下的耗电表现。
查看CPU和内存信息:
adb shell top adb shell dumpsys meminfotop命令会实时刷新进程CPU占用率,按q键退出。dumpsys meminfo可以查看整个系统以及每个应用的内存占用详情,排查内存泄漏时会用到。查看屏幕分辨率、安卓版本、SDK版本等信息:
adb shell wm size adb shell getprop ro.build.version.release adb shell getprop ro.build.version.sdk这些命令组合起来,你可以用几条指令快速汇总一台设备的完整信息,比在手机设置里一层层翻快多了。
4.6 屏幕交互:模拟点击、滑动和文本输入
ADB可以模拟屏幕上的各种手势,这个能力是自动化操作的基础。模拟点击某个坐标:
adb shell input tap x y模拟滑动:
adb shell input swipe x1 y1 x2 y2 duration其中duration是滑动持续时间的毫秒数。模拟按键(比如返回键、Home键):
adb shell input keyevent 4 # 返回 adb shell input keyevent 3 # Home adb shell input keyevent 26 # 电源键输入文本:
adb shell input text "hello"需要注意,input text不支持中文输入,这是ADB的一个老限制。解决中文输入的思路是用剪贴板辅助,先把内容复制到手机剪贴板,再通过长按粘贴的方式处理,但操作比较复杂。如果你只是做简单的自动化点击,用坐标模拟就能解决大部分问题。
使用坐标模拟前,你需要知道按钮对应的屏幕坐标值。获取坐标的方法很简单,打开手机的“指针位置”开关(开发者选项里),屏幕顶部就会实时显示手指按下的坐标点。
5. 进阶实战:模拟器、应用冻结与自动化操作
5.1 夜神等安卓模拟器怎样走ADB
热词里“使用夜神模拟器 adb模式”应该是个高频问题。安卓模拟器的ADB端口和实体手机不一样,但原理是相同的。夜神模拟器默认监听端口是62001,Mumu模拟器是7555,逍遥模拟器是21503。以夜神为例,先确认模拟器已经启动,然后执行:
adb connect 127.0.0.1:62001执行adb devices能看到一台名为127.0.0.1:62001的设备,就可以正常操作了。如果连接不上,多半是端口对不上,去模拟器安装目录里找一下配置文件或者官方文档确认端口号即可。
其实很多时候,模拟器自带“ADB调试”开关,你只需要在模拟器设置里打开“允许ADB调试”,外部工具就能直接连上。如果你需要同时操作多个模拟器实例,端口号会不一样,此时adb -s参数就派上用场了。
5.2 应用冻结与精简:系统应用到底能不能动?
热词里的“vivo adb精简列表”“红米k70能用adb冻结吗”指向同一个需求:想用ADB精简系统应用,去掉用不到的预装软件。这背后涉及到一个隐藏命令pm disable-user,它能在不卸载应用的情况下把应用禁用掉,适合处理那些无法root、又不希望它继续运行的系统应用。
冻结应用的命令:
adb shell pm disable-user --user 0 包名恢复应用的命令:
adb shell pm enable 包名这里必须特别强调,冻结系统应用有风险。不同的厂商定制系统,即使包名看起来无害,也可能承载着系统核心服务。比如有些系统桌面应用被冻结后,手机会黑屏;有些支付安全组件被冻结后,系统钱包就废了。我自己在测试时就遇到过把某品牌手机通讯录存储冻结后,联系人直接全消失然后反复崩溃的情况,后来靠pm enable才恢复。
所以这里给三条实操建议。第一条,冻结之前先用adb shell pm path 包名确认它是系统内置应用还是用户安装的,系统应用要格外谨慎。第二条,一条一条来,别批量执行,出现问题才能第一时间定位是哪个包引起的。第三条,准备一份已冻结应用的清单,随时可以对照执行恢复命令。
“精简列表”这种东西,网上确实流传着很多版本。但每个机型、每个系统的预设应用不一样,别人的列表拿过来直接用很可能翻车。正确做法是结合自己的实际需求,先查再精准冻结。
5.3 配合自动化:让ADB成为你的效率工具
ADB的输入模拟能力和脚本结合后,能够形成非常强大的自动化能力。热词里的“adb 企业微信 自动打卡”就是一个典型场景。思路其实不复杂,先用ADB命令启动目标应用,再通过模拟点击进入打卡页面,最后执行点击打卡按钮。把这些命令写进一个脚本,配合定时任务去触发就行。
一个简单的Python脚本框架大概是这样的:
import subprocess def run_adb(cmd): result = subprocess.run(cmd, shell=True, capture_output=True, text=True) print(result.stdout) # 启动企业微信 run_adb("adb shell am start -n com.tencent.wework/.launch.WwMainActivity") # 等待页面加载 time.sleep(5) # 模拟点击打卡按钮坐标 run_adb("adb shell input tap 540 1200")这里两个关键点需要说明。一个是启动一个应用需要知道它的Activity名称,可以用adb shell monkey -p 包名 -c android.intent.category.LAUNCHER 1这个命令间接获取。另一个是点击坐标是写死的,不同屏幕尺寸、不同UI布局都会导致坐标变化,这决定了这种方案只适合固定机型和固定页面。
如果你要做更复杂的自动化,建议学习Appium,它底层就是封装了ADB的交互能力,配合UIAutomator可以按控件ID定位元素,比裸坐标稳定得多。
6. 常见问题排查:从unanthenticated到连接失败一网打尽
6.1 adb unauthorized的完整解决方案
热词单独把“adb unauthorized怎么解决”拎了出来,可见遇到这个问题的人非常多。unauthorized状态的含义很简单:设备已经连上了电脑,但手机端没有确认授权。
排查路径按顺序走一遍就能解决。第一步,看手机屏幕,如果出现授权弹窗,勾选允许。第二步,如果弹窗没出现,拔掉USB线重插,同时可以在命令行执行adb kill-server重启服务。第三步,在手机开发者选项里找到“撤销USB调试授权”,点击后再重新连接。前三步都走完还不行,大概率是电脑里之前安装的ADB版本太老,去官方升级到最新platform-tools再来一遍。
顺带说一下,如果手机和电脑用的是无线连接,出现unauthorized的概率比USB高很多。无线连接状态变了有时手机端不会主动弹窗,处理手段还是同一套,重新配对是最稳妥的。
6.2 设备列表为空或者显示offline怎么治
adb devices执行后,如果列表是空的,说明电脑压根没识别到设备。检查优先级最高的几件事:数据线是否支持数据传输;手机锁屏界面是否已经解锁并保持亮屏;开发者选项里的USB调试是否重新开启;电脑的设备管理器里有没有出现带黄色感叹号的设备。
如果能看到设备但状态是offline,说明ADB和adbd之间的连接中断了。常见原因包括:USB线接触不良导致传输不稳定;手机在使用过程中自动关闭了USB调试;系统省电策略杀掉了adbd进程。解决办法依次是更换数据线、重新开关USB调试、重启手机、重启adb服务。
6.3 应用安装失败的各种姿势
adb install报错里面有几个高频错误码值得单独讲。INSTALL_FAILED_UPDATE_INCOMPATIBLE,意思是已有应用签名不一致,解决办法是先卸载原应用再安装新的。INSTALL_FAILED_INSUFFICIENT_STORAGE,存储空间不足,清理手机空间即可。INSTALL_FAILED_TEST_ONLY,尝试安装一个测试专用APK,需要加上-t参数绕过检查。INSTALL_FAILED_VERSION_DOWNGRADE,新版本号比老版本低,如果不考虑数据保留,卸载重新安装即可。
还有一个比较隐蔽的问题,部分应用安装后闪退,但卸载重装还闪退。这种情况可能不是ADB的问题,而是应用和系统版本不兼容,优先去系统设置里查看应用兼容模式选项。
6.4 权限相关报错:forbidden和denied的处理原则
ADB命令执行过程中经常碰到两类权限错误。一类是SecurityException: Permission Denial,这类错误意味着当前ADB进程没有操作该接口的权限。解决思路是检查命令对应的系统权限是否被限制,比如热词里提到的“adb如何授予应用无障碍权限”,就是需要先打开系统设置里的无障碍服务开关,再通过ADB模拟点击等操作,单纯一个ADB命令没法直接强制授予无障碍权限。另一类是文件系统的Permission denied,操作范围在/data等系统目录时常见,需要确认是否有root权限,或者改成操作/sdcard目录。
权限相关的错误很难用一个万能命令解决,我通常的排查思路是:先看命令操作的目标对象是什么,再想这个对象的权限来源是什么。命令本身只是调用系统接口,如果系统接口不允许,就尝试用adb shell settings修改对应设置项,或者用adb shell appops调整应用权限。这俩是很多人忽略的管理工具,灵活使用能解决大部分权限问题。
7. 写在最后的几条心得
这篇文章从ADB的原理一直写到常见问题的排查,信息量确实不小。如果你全部读到这里,值得给自己点个赞。在我自己这么多年使用ADB的过程里,有几个体会始终没变过,分享给大家作为收尾。
第一,ADB不用全学会,但值得学会的那部分一定要学透。装应用、看日志、拉文件、模拟点击这四类操作,覆盖了日常90%的需求。先把它们练熟练,再按需去扩展。
第二,遇到问题优先从系统和协议的角度想,而不是从网络教程的“咒语”里找答案。理解了设备状态变化的原理,就不会被各种“神奇命令”带偏。
第三,玩机有度,安全第一。ADB给了你很强大的权限,但也会放大你的误操作后果。尤其是冻结系统应用、修改系统设置这类操作,一定要先备份、再执行、留退路。苹果的生态封闭,安卓的生态开放,这种开放恰恰需要用户自己把握分寸。
最后再分享一个小技巧。如果你经常在多台设备之间切换调试,可以在电脑上建一个简易脚本,把常用命令打包成别名,比如输入dc自动执行adb devices,输入push直接触发文件推送。工具的价值从来不在于命令本身,而在于你如何使用它。希望这篇文章能帮你少走几年弯路,真正把ADB变成手里可靠的工具。