ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ADB使用完全指南:从环境配置到高效调试实战

ADB使用完全指南:从环境配置到高效调试实战 ADB这玩意儿说大不大说小不小。很多人接触它是因为刷机、玩模拟器或者某个App需要调试模式但真正把它用明白的人不太多。ADB的全称是Android Debug Bridge翻译过来就是安卓调试桥本质上是电脑和安卓设备之间的一条通信管道。装好了它你可以往手机里装应用、导文件、抓日志、改系统设置甚至能替代一些需要root才能干的操作。对开发者来说它是调试必备对普通玩家来说它是折腾手机的利器。这篇文章就把我这几年攒下的ADB使用经验完完整整梳理一遍覆盖从环境配置到高频命令从日志抓取到场景化实战尽量做到你看完就能直接上手踩过的坑也一并列出来。1. 环境准备ADB先跑起来1.1 工具链与驱动先把地基打好ADB本身不是一个独立安装的软件包它属于Android SDK Platform Tools的一部分。现在Google官方直接提供了单独的Platform Tools压缩包Windows、macOS、Linux三个平台都有下载解压就能用不需要去装完整的Android Studio。解压之后你会看到一堆文件核心的就那几个adb.exeWindows下、fastboot.exe、AdbWinApi.dll这几个。使用前最好把adb所在目录加到系统环境变量里这样在任何路径下打开终端都能直接敲adb命令。Windows下操作是右键“此电脑” - 属性 - 高级系统设置 - 环境变量在Path里新增一条路径指向你解压出来的platform-tools目录。驱动这块Windows用户最容易卡住。绝大多数国产手机插上之后系统会装一个“Android Composite ADB Interface”或类似名字的驱动这种情况一般没问题。怕的是某些设备只识别成“便携设备”或者“MTP设备”那就是驱动没对上。解决办法是去手机厂商官网下载USB驱动或者用驱动精灵类的工具自动匹配。macOS和Linux一般免驱即插即用省心不少。注意如果你电脑上装了Android Studio或者某些手机助手它们自带的adb版本可能和你的platform-tools版本冲突。最典型的症状是adb devices能识别设备但执行其他命令时报错或者干脆显示device offline。遇到这种情况建议把第三方工具自带的adb统统屏蔽掉统一用platform-tools里的版本。1.2 USB与无线两种连接方式连接方式分两种USB线连和无线网络连。USB连接是最经典的。手机端先进入“设置”里的“关于手机/本机”连续点击“版本号”七次打开开发者模式然后在开发者选项里打开“USB调试”。插线之后手机端会弹出一个“是否允许USB调试”的授权框勾选“始终允许”再点确定。这时候电脑端执行adb devices应该能看到一串设备序列号加device状态。无线连接适合什么场景比如手机插着线不方便操作或者你要连着调试一整天不想一直占着USB口。方法其实也不复杂第一步先用USB连接手机在电脑终端执行adb tcpip 5555把手机的ADB服务切换到TCP/IP模式默认监听5555端口。 第二步拔掉USB线执行adb connect 手机IP:5555这里的IP是手机在局域网里的地址可以在手机WiFi设置里查到。连接成功后再执行adb devices就能看到这个无线设备了。无线连接有个前提手机和电脑必须在同一个局域网里。而且手机重启之后tcpip模式一般会失效需要重新插线设置一次。模拟器上跑ADB是另一个常见场景比如夜神模拟器。夜神自带了一个adb路径通常在安装目录下的bin目录里版本不一定和platform-tools一致。所以用夜神的时候要么直接用它的adb连接端口要么用platform-tools的adb单独去connect它的端口。夜神默认的ADB端口是62001也有版本用52001在模拟器设置里能看到。操作方式是adb connect 127.0.0.1:62001连接成功后一样可以安装应用、抓日志。1.3 授权那个红灯adb unauthorized怎么办接触ADB时间长了基本都会遇到adb unauthorized这个问题。执行adb devices时设备状态显示unauthorized意味着电脑端向手机发起的调试请求没有被确认。这多半是因为手机屏幕上的“允许USB调试”弹窗被误点成取消或者弹窗一闪而过没看清。解决思路很简单。先把USB线拔了重新插手机端锁屏状态下解锁屏幕看是否有调试授权弹窗有就点允许。如果没有弹窗就去手机开发者选项里找“撤销USB调试授权”点掉之后重新插线再等弹窗出来。这一步基本能解决90%的unauthorized问题。还有一种情况是adb服务本身状态不对。执行adb kill-server再执行adb start-server让adb服务重新初始化。注意执行start-server后如果手机还是unauthorized那就按上面的步骤撤销授权再授权一遍。实操心得我在帮别人排查unauthorized时发现最常见的导火索是手机连了电脑但锁屏了弹窗压根没显示出来。一解锁就弹出来了。所以第一步永远是看手机屏幕。2. 高频命令集设备、应用与文件操作2.1 设备状态与包管理ADB装好、设备连上之后最常用的就是设备查询命令。adb devices这个命令会列出当前连接的所有设备输出内容分两列序列号和状态。状态有几种device表示正常可用unauthorized表示没授权offline表示连接异常no permissions表示电脑端没有足够权限访问USB设备。日常使用里device和unauthorized是见的最多的。adb get-state可以直接获取设备当前状态输出结果是device、offline或unknown。设备连接无误后在处理应用之前得先学会看设备里的应用列表。执行adb shell pm list packages就能列出当前设备所有应用的包名。这个输出会很长通常要配合过滤条件使用。比如只看第三方应用adb shell pm list packages -3按关键字过滤adb shell pm list packages | grep tencent。查包名是后面所有应用操作的前提别上来就install先把包名搞明白了。2.2 安装、卸载与冻结全家桶安装APK是ADB用得最多的操作之一。基础命令是adb install apk文件的完整路径比如adb install C:\Users\xxx\Downloads\wechat.apk。安装完成会输出Success。install命令有几个常用参数-r覆盖安装保留已有数据。升级测试版本时很常用。-d允许降级安装。有些应用从体验版回到正式版必须降级不用这个参数会报错。-t允许安装测试包。-s安装到SD卡现在手机基本没SD卡了这条慢慢淡出视野。我用得最多的组合是adb install -r -d xxx.apk基本能覆盖日常覆盖安装的绝大多数场景。卸载命令是adb uninstall 包名比如adb uninstall com.tencent.mm。它有-k参数可以保留数据卸载但实际中用得少因为正常卸载方式一般就够用了。冻结应用是控制手机里那些想留着但不想让它天天在后台捣乱的应用的有效手段。这里用的是pm disable-user命令。adb shell pm disable-user --user 0 包名这个命令的意思是在主用户下停用某个应用。停用之后这个应用会从桌面消失后台进程起不来。想恢复就执行adb shell pm enable 包名。我自己在红米K70上实测过冻结一些不用的系统App和流氓预装系统流畅度确实有改善而且不影响日常使用。注意pm disable-user和pm disable的区别要搞清楚。disable-user只是针对当前用户停用系统多用户场景下更安全恢复也容易。pm disable是彻底停用某些关键系统组件一旦停用可能导致系统异常慎用。2.3 文件传输与截图取回ADB传文件的优势在于不需要依赖MTP协议也不用手动在手机上切“文件传输”模式只要调试授权在随时能拉文件。电脑文件推到手机adb push 本地文件路径 /sdcard/目标目录。比如把电脑上的out.log推到手机根目录adb push C:\logs\out.log /sdcard/。手机文件拉到电脑adb pull /sdcard/文件名 本地目录。比如把手机里的截图全部拉到电脑adb pull /sdcard/DCIM/Screenshots C:\screenshots。这里有两个必须提醒的坑。第一手机端路径的目录要存在push到不存在的目录会报错。第二pull整个目录时如果其中一个文件被占用或者路径异常整个pull过程会中断建议批量拉文件时用通配符或者逐个拉。截屏和录屏也是高频操作尤其在UI调试和问题反馈时。截屏命令 adb exec-out screencap -p screen.png这条命令把手机屏幕截成PNG格式直接输出到电脑当前目录。用exec-out而不是shell screencap好处是输出的是原始二进制数据不会被转义Windows下也不会出现文件损坏的情况。录屏命令 adb shell screenrecord /sdcard/demo.mp4录完再pull出来。screenrecord有参数可调比如--time-limit 10表示录10秒--size 720x1280设定分辨率。我一般录操作演示视频用这个方便且不需要在手机上装录屏软件。3. 日志抓取与系统级调试3.1 logcat的深度使用姿势adb logcat是Android开发调试的命脉。应用崩溃、ANR、性能问题基本都需要靠logcat来定位。但logcat输出极其庞大直接从终端刷屏看是不现实的必须学会过滤。最基础的用法是抓全量日志保存到文件adb logcat -d all.log。-d参数的意思是dump打印当前缓冲区所有日志后退出不会持续阻塞。不带-d跑起来会一直刷屏CtrlC才能停下。按优先级过滤adb logcat:E表示只看Error级别以上的日志。优先级从低到高是V、D、I、W、E、F分别对应Verbose、Debug、Info、Warn、Error、Fatal。日常排查崩溃问题用:E基本够用。按包名过滤adb logcat --pid$(adb shell pidof 包名)先取应用的PID再看这个进程的日志。不过这招有时不灵因为Android 7.0之后logcat按PID过滤时可能漏掉系统进程的关联日志。更推荐的做法是结合logcat的“日志标签”来过滤比如支付宝的日志标签可能是AlipayApp直接在logcat输出里grep这个关键词。清空日志重新抓adb logcat -c。在复现问题之前先清空缓冲区然后操作手机最后再adb logcat -d crash.log这样拿到的日志就是完整且干净的复现路径排查问题效率高很多。日志缓冲区不止一个。默认的main缓冲区放应用日志system缓冲区放系统日志crash缓冲区专门放崩溃日志events缓冲区放系统事件。用-b参数可以指定adb logcat -b crash -d抓的就是崩溃日志。实操心得抓崩溃日志时我习惯用adb logcat -b crash -b main -d all.log。多个-b参数叠用把crash和main两个缓冲区一起导出来崩溃堆栈和上下文日志都能对上定位问题快得多。3.2 修改系统设置与控制刷新率ADB shell里面可以直接读写系统设置这是很多高级玩法的入口。设置屏幕刷新率对支持高刷的手机很有用。操作命令如下adb shell settings put system peak_refresh_rate 120 adb shell settings put system min_refresh_rate 120peak_refresh_rate和min_refresh_rate通常配合使用把最小刷新率也拉到120可以避免部分应用触发降帧。如果只想临时切换可以直接用wm命令。wm density是修改屏幕DPI的wm size可以修改分辨率这几个命令对显示效果的影响是立竿见影的。查看当前所有系统设置值adb shell settings list system、settings list secure、settings list global三个命名空间分别对应不同类别的设置项。很多厂商隐藏的功能开关其实就在这些设置项里只是没有暴露在设置界面。修改全局设置里还有一个高频操作关闭/开启动画。开发者选项里的三个动画缩放窗口动画缩放、过渡动画缩放、动画程序时长缩放对应三个系统设置值adb shell settings put global window_animation_scale 0 adb shell settings put global transition_animation_scale 0 adb shell settings put global animator_duration_scale 0全部设为0之后系统动画全部关闭手机反应速度在感官上会快很多。不过不建议长期关因为动画没了界面切换会显得生硬而且部分应用可能因此出现闪屏问题。3.3 权限授予与输入模拟Android 6.0之后的运行时权限在调试时经常需要单独授予。虽然可以在设置界面里手动点但数量多了效率太低。ADB提供了一个直接干这事的命令adb shell pm grant 包名 权限名比如给某个应用授予存储权限 adb shell pm grant com.example.app android.permission.WRITE_EXTERNAL_STORAGE撤销权限就把grant换成revoke。这套命令在自动化测试时非常有用不用在界面上点来点去。无障碍权限是另一个高频需求。很多自动化工具、抢红包插件、打卡脚本都依赖无障碍服务。ADB可以直接写入系统设置来开启指定应用的无障碍服务adb shell settings put secure enabled_accessibility_services 包名/无障碍服务类名 adb shell settings put secure accessibility_enabled 1这里有个坑必须先知道无障碍服务的确切类名。一般可以通过dumpsys package查或者反编译看配置。比如无痕群控类的应用类名通常长这样com.xxx/.service.AccessibilityService。设置成功后在系统设置里能看到这个无障碍服务已经被打开。输入模拟这块adb shell input是自动化的利器。input keyevent 24是音量加input keyevent 3是Home键input keyevent 4是返回键。input tap x y是在屏幕坐标点上点击input swipe x1 y1 x2 y2是滑动。配合坐标获取dumpsys input或开发模式下的指针位置可以做到简单的界面自动点击。4. 需求驱动的实战案例4.1 老款电视的ADB调试与持久连接智能电视的ADB调试是个特殊场景。很多老款电视没有内置麦克风或者输入法在电视的开发者选项里开启ADB后电脑连上调试还是很方便。以我调试过的一台老款创维电视为例大致步骤是这样的。首先要进入电视的设置找到“关于”或“本机信息”连续点击版本号若干次打开开发者模式。有些电视的选项叫“ADB调试”或“远程调试”打开它。部分设备会要求输入动态密码这个密码不是固定值而是根据设备MAC地址和时间动态生成的需要用专门的动态密码计算器算出来。这也是老款设备防止随意开调试的一种方式。动态密码计算器本身不是什么黑科技就是一个离线算法工具输入对应的识别码就能算出当前时间窗内的密码。开启ADB之后如果电视和电脑在同一局域网可以直接用无线连接adb connect 电视IP:5555。电视的IP可以从网络设置里查。“永久打开ADB”这个说法的本质是防止电视重启后ADB自动关闭。不同电视行为不一样有的电视重启后开发者选项会自动关掉有的不会。我在创维上的处理办法是确保电视系统设置里“保持调试模式”这个选项已勾选同时避免在电视上执行恢复出厂设置或系统更新。对于部分通过工厂菜单才能打开隐藏ADB开关的机型工厂菜单的操作路径各品牌都不同这里就不展开细说了。调试完成后该关就关长期开着对一般用户没什么意义反而增加暴露面。重要提醒电视ADB调试只建议在自己的设备上进行。老设备系统的安全补丁普遍较旧如果不需要调试了一定要把ADB开关关掉别让调试端口一直暴露在局域网里。4.2 禁网、冻结与系统瘦身很多App不给你联网关闭的入口或者关了一打开又自动连上。用ADB可以做应用级联网控制。最底层的方式是使用iptables它可以直接按应用的UID丢包先查到应用UID adb shell dumpsys package 包名 | grep userId然后添加iptables规则禁止该UID访问网络 adb shell iptables -A OUTPUT -m owner --uid-owner 10086 -j DROP这条规则会丢弃该UID所有出网数据包。想恢复就把-D替换-A。不过iptables规则重启后会失效想要持久生效要么root之后做开机自启脚本要么借助Shizuku这类工具在非root环境下授权执行。对于普通用户来说直接在系统设置里的“应用信息 - 流量使用情况”关掉后台数据可能是更省事的选择。冻结应用这个场景在红米K70这类骁龙旗舰上很好用。小米系的系统预装应用不少虽然可以卸载一部分但有些卸了会影响系统功能。更稳妥的处理是pm disable-user冻结而不是卸载。我在红米K70上冻结过几个全家桶组件重启后没有复现问题系统流畅度和续航都有好转。但注意别去冻结com.miui.securitycenter这类安全组件否则支付环境、应用锁这一整套都会崩。给新手一个操作模板按这个顺序来基本不会出问题adb shell pm list packages -3 拿到第三方应用包名。逐个dumpsys package查具体进程确认哪些是纯广告或纯推送组件。对拿不准的先备份adb shell pm disable-user --user 0 包名然后测试功能是否受影响。受影响就用adb shell pm enable 包名恢复。4.3 用ADB做轻量自动化自动化打卡、定时操作这类需求ADB完全可以实现不一定非得装一堆自动化App。以企业微信自动打卡为例思路是手机连上电脑ADB保持连接然后通过input命令模拟点击打卡按钮。前提是先把企业微信打开到打卡页面并确保屏幕坐标固定。我实际操作中用的方案是第一步打开企业微信进入考勤打卡页面用adb shell screencap截图在电脑上查看图片确定“打卡”按钮的坐标。 第二步用input tap命令点击 adb shell input tap 540 960 第三步如果需要定时执行写一个简单的批处理或Python脚本套个循环到点就执行tap。这个方案只适合个人自用、纯办公辅助场景。企业级考勤系统一般有风控频繁模拟点击可能会被识别为异常行为并且涉及考勤制度违规。别拿它去钻空子自己图个方便用一下就好。比input模拟更稳定的一种方式是利用无障碍服务做UI自动点击。系统级无障碍能够直接找到控件ID并点击不依赖固定坐标。这类工具通常以内置无障碍服务加外部脚本的方式工作ADB在这里只负责安装和授权。5. 常见问题与排错速查5.1 连接类故障排查ADB出错的大头都在连接环节。我整理了一个速查表基本覆盖日常遇到的大部分问题。现象可能原因解决办法adb devices显示unauthorized手机端授权弹窗未确认拔插USB解锁手机确认弹窗或撤销USB调试授权后重新授权显示offlineadb版本与手机系统不兼容adb kill-server后重新adb start-server换最新platform-tools版本显示no devices驱动没装好或USB模式不对安装手机厂商驱动检查USB连接模式换数据线模拟器连不上端口不对或模拟器自带的adb版本过低确认模拟器ADB端口用adb connect 127.0.0.1:端口连接频繁断连USB线质量差或接口松动换线尽量用手机原装线插主机后置USB口无线连接失败手机和电脑不在同一网段检查WiFi确保同一局域网关闭AP隔离连接问题里有一个容易忽略的点某些电脑出厂自带的“USB安全”或安全管理软件会拦截ADB接口。遇到所有常规手段都无效的情况试着临时关闭这类软件再试。5.2 权限与执行失败排查执行命令时提示Permission denied或者Exec format error这类错误多半是shell权限不够。普通ADB连接默认是以shell用户身份运行的部分目录和系统操作没有权限执行。解决思路是看能不能用su提权但这需要设备已经root。没有root的话Shizuku方案值得一试它可以通过ADB授权给应用更高权限让大部分系统级操作在非root环境下也能执行。pm grant授权失败时先确认权限名是否存在且可授予。有些系统权限不对第三方应用开放pm grant拿它没办法。另外Android 11之后的软件包可见性机制也可能会导致部分包名查询异常此时建议在dumpsys package里确认实际包名。settings put写入失败常见原因是写到了只读的命名空间或者目标设置项根本不存在。先用settings list确认设置项的key是否真实存在再做写入。5.3 调试效率的几条心得最后分享几个关于调试效率的实战心得。第一配置好快捷命令。Windows下把常用ADB命令写成.bat批处理比如“adb_log.bat”负责清空日志再抓取“adb_install.bat”负责安装指定路径的APK。Mac/Linux用户可以在.zshrc或.bashrc里加alias省去每次敲一长串参数的麻烦。第二善用adb shell am start命令拉起应用。调试时不用手动在手机上点图标直接在电脑上指定包名和页面启动Activity效率高很多。adb shell am start -n 包名/Activity全名。这个Activity名称可以通过adb shell dumpsys package 包名查出来。比如拉起微信主界面Activity一般是com.tencent.mm.ui.LauncherUI。第三多设备并行调试时每次命令都要加-s设备序列号比如adb -s 设备序列号 shell screencap。不要同时连太多设备按需连接避免混乱。ADB的下限是几条命令上限是整套移动端调试自动化体系。从最开始插线授权到后面能写脚本批量处理设备这个工具越用越顺手。平时多积累自己设备相关的包名、设置项、端口信息排查问题会快很多。最后再提醒一句任何ADB操作都只针对自己的设备进行别拿它去做绕过权限、侵入他人设备的事。工具本身是中性的用在合理合规的调试和折腾上它是效率神器。
返回列表