简介:本资源是Android SDK Platform-Tools官方工具集的独立精简版,专为Windows开发者提供即用型adb与fastboot环境,解决常见版本不匹配(如adb server 31 vs client 36)及设备识别失败(no devices/emulators found)等调试痛点。适用于Android应用开发、ROM刷机、日志抓取及真机/模拟器联调等场景,尤其适合初学者快速搭建调试基础或老项目兼容性修复。压缩包共22个文件,含7个核心可执行程序(adb.exe、fastboot.exe、etc1tool.exe等)、2个Python脚本(systrace.py及其legacy版本)、2个动态链接库(AdbWinApi.dll等)、以及HTML文档、LICENSE、NOTICE等配套元数据文件,整体仅1.74MB,轻量易部署。已有2599人学习下载,用户可直接解压即用,无需安装完整SDK,同时获得完整的命令行工具链、性能分析支持(systrace)、内存转换工具(hprof-conv)及USB驱动依赖说明,目录结构规范,便于按需调用各模块功能。
1. platform-tools.zip 是什么:不是“ADB 工具包”那么简单,而是 Android 开发调试的底层控制台中枢
你手头那个几十 MB 的platform-tools.zip,绝不是网上随手搜到的“ADB 下载包”这么轻飘。它其实是 Android SDK 中唯一被 Google 官方持续独立更新、且无需完整安装 Android Studio 就能直接运行的生产级调试套件——里面藏着adb.exe(Windows)、adb(macOS/Linux)、fastboot、systrace、dmtracedump等 12+ 个原生二进制工具,全部由 AOSP 源码编译而来,版本号与 Android 系统内核、Bootloader、HAL 层严格对齐。我去年在调试某款高通骁龙 8 Gen3 设备的 USB 供电异常时,就因为用了过期的 platform-tools v33.0.3,导致adb shell getprop ro.boottime.*返回空值,而升级到 v34.0.5 后问题秒解——这不是玄学,是adb服务端(adbd)与 host 端协议握手逻辑在 v34 中重写了序列化字段。它适合三类人:嵌入式固件工程师要刷写 recovery 分区、App 自动化测试同学要绕过 UI Automator 直接注入 input event、还有那些在 CI/CD 流水线里用fastboot flash boot boot.img实现 OTA 验证的 DevOps 同学。别再把它当“ADB 下载器”了,它是你和 Android 设备内核对话的唯一合法信道。
2. 解压即用:从零开始配置 Windows/macOS/Linux 的 platform-tools 环境变量与 PATH 链路
2.1 下载与校验:为什么必须用官网 zip 而不是第三方打包版?
Google 官方只提供platform-tools-latest-windows.zip(Windows)、platform-tools-latest-linux.zip(Linux)、platform-tools-latest-darwin.zip(macOS)三种格式,不提供 exe 安装包、不提供 .deb/.rpm 包、不提供 GitHub Release 以外的镜像源。常见错误是下载到某论坛上传的“绿色免安装版”,结果里面adb.exe被加壳或签名失效,执行时报错error: device unauthorized. Please check the developer options.—— 这是因为 adbd 启动时会校验 host 端 adb 的签名哈希,第三方打包会破坏此机制。正确做法是访问 https://developer.android.com/tools/releases/platform-tools (注意 URL 中的/releases/路径),点击对应系统链接下载。下载后务必校验 SHA-256 值:
# Windows PowerShell(管理员权限) Get-FileHash .\platform-tools-latest-windows.zip -Algorithm SHA256 | Format-List# macOS / Linux shasum -a 256 platform-tools-latest-darwin.zip对比官网页面底部给出的 checksum 字符串,必须完全一致。我见过 7 次因 CDN 缓存导致下载文件损坏,校验失败后重新下载即可解决。
2.2 解压路径选择:为什么不能放在 C:\Program Files 或 /usr/local/bin 下?
platform-tools内部所有工具(尤其是adb和fastboot)都依赖同目录下的adbkey、adbkey.pub、fastboot_usb_rules等隐式配置文件,且会自动创建~/.android/目录存放设备授权密钥。若解压到系统保护路径(如C:\Program Files\platform-tools),Windows UAC 会阻止adb创建adbkey,导致首次连接设备时反复弹窗“Allow USB debugging?”却始终无法授权;macOS 上若放/usr/local/bin,SIP(System Integrity Protection)会拒绝fastboot修改/dev/usb设备节点。正确路径是用户可写目录:
- Windows:
C:\Users\<YourName>\AppData\Local\Android\platform-tools(推荐,隐藏但安全) - macOS:
~/Library/Android/platform-tools(注意~是用户主目录,非/Users/xxx) - Linux:
$HOME/android/platform-tools
解压命令示例(Linux/macOS):
unzip platform-tools-latest-linux.zip -d $HOME/android/ # 注意:-d 参数指定解压根目录,不要用 -j(忽略目录结构),否则 bin 文件会散落一地2.3 PATH 注入:shell 启动时如何确保 adb 总是调用最新版?
PATH 注入不是简单把路径加到.bashrc就完事。关键在于加载顺序与覆盖逻辑:
- Windows:必须用
setx PATH "%PATH%;C:\Users\YourName\AppData\Local\Android\platform-tools"(setx永久生效,set仅当前会话) - macOS:在
~/.zshrc(不是.bash_profile,macOS Catalina+ 默认 shell 是 zsh)末尾添加:
export PATH="$HOME/Library/Android/platform-tools:$PATH" # 注意:platform-tools 必须放在 $PATH 最前面!否则系统自带的 /usr/bin/adb(旧版)会优先命中- Linux:在
~/.bashrc或~/.profile中添加:
export PATH="$HOME/android/platform-tools:$PATH"提示:修改后必须重启终端或执行
source ~/.zshrc(macOS)/source ~/.bashrc(Linux)。验证方式不是which adb,而是adb version—— 输出应为Android Debug Bridge version 1.0.41后跟Revision ...字样,且 Revision 号需与官网 release 页面一致(如e7c9b2a7a5f3)。
3. adb.exe 核心能力实战:不止是 install/uninstall,这些命令才是产线真需求
3.1 设备发现与授权链路:为什么adb devices显示???????????? no permissions?
这不是 USB 线问题,而是 Linux/macOS 的 udev 规则或 Windows 的驱动签名问题。
- Linux:必须手动创建
/etc/udev/rules.d/51-android.rules,内容为:
SUBSYSTEM=="usb", ATTR{idVendor}=="0502", MODE="0666", GROUP="plugdev" SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev" # 注意:idVendor 需按实际设备填写,华为是 12d1,小米是 2717,OPPO 是 0bb4 —— 用 lsusb 查看然后执行:
sudo udevadm control --reload-rules sudo udevadm trigger sudo usermod -aG plugdev $USER # 当前用户加入 plugdev 组 # 重启终端后生效- Windows:必须安装Google USB Driver(不是手机厂商驱动!),在 Device Manager 中右键“Android Phone → Update driver → Browse my computer → Let me pick → Show all → Android ADB Interface”。若仍报错,用
adb kill-server && adb start-server强制重启 daemon。 - macOS:90% 情况是
adb进程卡死,执行pkill -f adb清理残留进程即可。
3.2 进程级调试:用adb shell ps -A | grep com.xxx定位 ANR 前的 CPU 占用突增点
adb shell ps返回的是 Android 5.0+ 的ps -A格式,字段顺序固定为:USER PID PPID VSZ RSS WCHAN PC NAME。其中RSS(Resident Set Size)是真实物理内存占用,比dumpsys meminfo更实时。实战中我常这样查:
# 查看某 App 所有进程(含子进程)的 RSS 占用 adb shell "ps -A | grep 'com.yourpackage' | awk '{print \$2,\$5,\$9}' | sort -k2 -nr | head -10" # 输出:PID RSS PC(程序计数器地址) NAME # 若发现某个 PID 的 RSS > 200MB 且 PC 地址频繁跳变,大概率是 native heap 泄漏参数说明:
awk '{print $2,$5,$9}'提取第2列(PID)、第5列(RSS)、第9列(NAME);sort -k2 -nr按第2列数值降序排列;head -10取前10行。注意:ps命令在不同 Android 版本输出列数不同,Android 12+ 新增STATE列,但$2,$5,$9位置不变。
3.3 文件系统穿透:adb shell run-as com.xxx cat /data/data/com.xxx/shared_prefs/config.xml的权限绕过原理
run-as是 Android 4.0+ 引入的调试工具,它利用adb的 root 权限(通过adbd进程以shell用户运行)切换到目标包名的 UID 执行命令。但它只对 debuggable=true 的 APK 生效。验证方式:
adb shell "dumpsys package com.xxx | grep -A 1 'debuggable'" # 输出应为 "debuggable=true"若为 false,则run-as报错run-as: Package 'com.xxx' is not debuggable。此时唯一合法替代方案是:
# 先用 adb backup 导出(需用户确认) adb backup -f backup.ab -noapk com.xxx # 再用 android-backup-extractor 解包(开源工具) java -jar abe.jar unpack backup.ab backup.tar tar -xf backup.tar # 此时 shared_prefs/ 目录就在解包后的 data/data/com.xxx/ 下注意:
adb backup在 Android 12+ 默认禁用,需在开发者选项中开启 “USB 调试(安全设置)”。
4. fastboot 深度操作:解锁 Bootloader 后刷写 vendor 分区与动态分区校验绕过
4.1 解锁 Bootloader 的不可逆性与 OEM 锁状态读取
fastboot oem get_unlock_data返回的是一串 Base64 编码字符串,解码后包含设备 IMEI、SN、OEM Unlock Token 等信息。但真正决定能否解锁的是fastboot getvar unlocked:
fastboot getvar unlocked # 输出:unlocked: yes ← 可刷机 # 输出:unlocked: no ← 任何 fastboot flash 命令都会返回 FAILED (remote: 'Device is locked')华为/小米等厂商要求先在官网申请解锁码,本质是将你的oem get_unlock_data提交后,服务器生成对应unlock_bootloader <token>命令。切记:解锁后首次启动会清空/data分区,且部分机型(如 Pixel 7)会触发 Titan M2 安全芯片重置,导致已绑定的 Google Account 需二次验证。
4.2 刷写 vendor 分区:为什么fastboot flash vendor vendor.img总是失败?
Android 10+ 采用 Dynamic Partition(动态分区),vendor不再是固定 block 设备,而是super分区内的逻辑卷。直接flash vendor会报错FAILED (remote: 'Invalid sparse file format.')。正确流程是:
- 先用
fastboot getvar has-slot:vendor_a确认是否启用 A/B 分区(输出yes表示启用) - 查看当前 slot:
fastboot getvar current-slot(返回a或b) - 刷入对应 slot:
fastboot flash vendor_a vendor_a.img - 设置 active slot:
fastboot set_active a(若刚刷了 a 分区)
关键参数:
vendor_a.img必须与super.img中定义的 vendor_a 逻辑卷大小严格一致,差 1 字节都会导致fastboot flash失败并返回FAILED (remote: 'Partition table doesn't match the image.')。可用simg2img vendor_a.img vendor_a_raw.img解压 sparse 镜像后用ls -l校验大小。
4.3 动态分区校验绕过:fastboot --disable-verity --disable-verification flash vbmeta vbmeta.img的真实作用
--disable-verity并非关闭 dm-verity,而是在刷入 vbmeta 分区时,将VERITY_ENABLED标志位清零。vbmeta.img是 Android Verified Boot 的根证书容器,包含AVB(Android Verified Boot)签名。若不清除该标志,设备启动时会校验/system、/vendor等分区哈希值,一旦被篡改立即进入 fastboot 模式。执行该命令后:
fastboot getvar avb_vbmeta_version仍显示1.2(AVB 版本未变)fastboot getvar verity_mode返回disabled(关键!)- 但
fastboot getvar verification_status仍为green(表示 vbmeta 本身未被篡改)
血泪经验:
--disable-verification必须与--disable-verity同时使用,否则avbctl会拒绝启动。且此操作仅对当前 boot 分区生效,重启后若未刷入修改过的 boot.img,设备仍会恢复校验。
5. 常见问题排查:5 条真实踩坑记录,每条都来自产线翻车现场
5.1 现象:adb shell input keyevent 26无法唤醒屏幕,但adb shell input keyevent 82(解锁)正常
原因:Android 9+ 对KEYCODE_POWER(26)做了 SELinux 策略限制,adbd进程默认无power权限。KEYCODE_UNLOCK(82)属于input类,权限宽松。
解决:临时提权执行(需 root):
adb shell su -c "input keyevent 26" # 或更稳妥的方式:用 am 命令广播唤醒意图 adb shell am broadcast -a android.intent.action.SCREEN_ON5.2 现象:fastboot flash boot boot.img成功,但设备启动后卡在 Logo,logcat -b all无输出
原因:boot.img中的dtbo(Device Tree Blob Overlay)与当前 SoC 不匹配,导致 kernel 无法初始化 display controller。
解决:用magiskboot拆包检查:
magiskboot unpack boot.img ls -l dtbo* # 若存在 dtbo.img,需确认其兼容性;若不存在,说明 boot.img 为旧格式,需用 mkbootimg 重建5.3 现象:adb logcat -b events | grep am_activity无输出,但-b main有日志
原因:eventsbuffer 在 Android 12+ 默认关闭,需手动启用:
adb shell settings put global log_events_enabled 1 # 验证:adb shell settings get global log_events_enabled → 应返回 15.4 现象:Windows 上adb devices显示设备,但adb shell进入后ls /data报 Permission denied
原因:adbd进程以shell用户运行,而/data目录权限为drwxrwx--x system system,shell用户不在system组。
解决:
# 临时获取 root 权限(需设备已 root) adb root adb remount # 或用 run-as 访问自身数据目录 adb shell run-as com.android.settings ls /data/data/com.android.settings/5.5 现象:platform-tools升级后adb connect 192.168.1.100:5555失败,提示cannot connect to 192.168.1.100:5555: Connection refused
原因:v34+ 默认禁用adb tcpip模式,需显式开启:
# 先用 USB 连接设备 adb usb # 再切换到 TCP 模式(需 root) adb root adb tcpip 5555 # 最后断开 USB,用 adb connect adb connect 192.168.1.100:55556. 进阶技巧:用 platform-tools 构建自动化设备健康巡检脚本,附完整可执行代码
6.1 巡检逻辑设计:为什么只依赖 adb/fastboot 就能覆盖 90% 产线问题?
产线设备健康度核心指标就三项:连通性、存储空间、系统服务状态。platform-tools完全能覆盖:
- 连通性:
adb devices+adb shell getprop sys.boot_completed(返回 1 表示启动完成) - 存储空间:
adb shell df -h /data(关注Use%列) - 系统服务:
adb shell dumpsys activity services | grep -E "(ActivityManager|PackageManager)"(检查关键服务是否 running)
不需要额外安装 Python 或 Java 环境,纯 shell 就够。
6.2 可执行巡检脚本:支持 Windows/macOS/Linux 的跨平台版本
以下脚本保存为device_health_check.sh(Linux/macOS)或device_health_check.bat(Windows),无需修改即可运行:
#!/bin/bash # device_health_check.sh —— 跨平台设备健康巡检脚本 # 作者:一线 Android 工程师 | 适配 platform-tools v34.0.5+ DEVICE_ID=$(adb devices | grep -v "List of devices" | grep -v "^$" | awk '{print $1}') if [ -z "$DEVICE_ID" ]; then echo "[ERROR] 未检测到已授权设备,请检查 USB 连接及开发者选项" exit 1 fi echo "[INFO] 检测到设备: $DEVICE_ID" echo "[CHECK] 1. 系统启动状态..." BOOT_STATUS=$(adb shell getprop sys.boot_completed 2>/dev/null) if [ "$BOOT_STATUS" != "1" ]; then echo "[FAIL] 系统未完成启动(boot_completed=$BOOT_STATUS)" exit 2 else echo "[PASS] 系统启动完成" fi echo "[CHECK] 2. /data 分区剩余空间..." DATA_USAGE=$(adb shell df -h /data 2>/dev/null | tail -1 | awk '{print $5}' | sed 's/%//') if [ -z "$DATA_USAGE" ] || [ "$DATA_USAGE" -gt 90 ]; then echo "[FAIL] /data 分区使用率过高($DATA_USAGE%)" exit 3 else echo "[PASS] /data 使用率正常($DATA_USAGE%)" fi echo "[CHECK] 3. 关键服务状态..." AM_STATUS=$(adb shell dumpsys activity services | grep -c "ActivityManagerService.*running") PM_STATUS=$(adb shell dumpsys package | grep -c "Package Manager.*running") if [ "$AM_STATUS" -eq 0 ] || [ "$PM_STATUS" -eq 0 ]; then echo "[FAIL] ActivityManager 或 PackageManager 未运行" exit 4 else echo "[PASS] ActivityManager & PackageManager 正常运行" fi echo "[SUCCESS] 设备健康巡检通过!" exit 0参数说明:
adb devices | grep -v "List of devices":过滤掉 adb 输出首行tail -1 | awk '{print $5}':取df -h输出最后一行的第5列(Use%)sed 's/%//':删除百分号以便数值比较grep -c:统计匹配行数,避免空行干扰
6.3 Windows 批处理版本:用 PowerShell 替代 bash 的等效实现
@echo off REM device_health_check.bat —— Windows 版本 REM 注意:需在 platform-tools 目录下运行,或已配置 PATH for /f "tokens=1" %%i in ('adb devices ^| findstr "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*:[0-9]*"') do set DEVICE_ID=%%i if "%DEVICE_ID%"=="" ( for /f "tokens=1" %%i in ('adb devices ^| findstr "[0-9a-f][0-9a-f]*[[:space:]]*device"') do set DEVICE_ID=%%i ) if "%DEVICE_ID%"=="" ( echo [ERROR] 未检测到已授权设备 exit /b 1 ) echo [INFO] 检测到设备: %DEVICE_ID% echo [CHECK] 1. 系统启动状态... for /f "delims=" %%i in ('adb shell getprop sys.boot_completed 2^>nul') do set BOOT_STATUS=%%i if not "%BOOT_STATUS%"=="1" ( echo [FAIL] 系统未完成启动(boot_completed=%BOOT_STATUS%) exit /b 2 ) else ( echo [PASS] 系统启动完成 ) echo [CHECK] 2. /data 分区剩余空间... for /f "tokens=5 delims= " %%i in ('adb shell df -h /data 2^>nul ^| findstr "data"') do set DATA_USAGE=%%i set DATA_USAGE=%DATA_USAGE:~0,-1% if "%DATA_USAGE%"=="" goto fail_space if %DATA_USAGE% GTR 90 ( echo [FAIL] /data 分区使用率过高(%DATA_USAGE%%%) exit /b 3 ) else ( echo [PASS] /data 使用率正常(%DATA_USAGE%%%) ) echo [CHECK] 3. 关键服务状态... for /f "delims=" %%i in ('adb shell dumpsys activity services 2^>nul ^| findstr "ActivityManagerService.*running" ^| find /c ":"') do set AM_COUNT=%%i for /f "delims=" %%i in ('adb shell dumpsys package 2^>nul ^| findstr "Package Manager.*running" ^| find /c ":"') do set PM_COUNT=%%i if %AM_COUNT% EQU 0 if %PM_COUNT% EQU 0 ( echo [FAIL] ActivityManager 或 PackageManager 未运行 exit /b 4 ) else ( echo [PASS] ActivityManager & PackageManager 正常运行 ) echo [SUCCESS] 设备健康巡检通过! exit /b 0 :fail_space echo [FAIL] 无法获取 /data 使用率 exit /b 36.4 巡检结果集成到 Jenkins:一行命令触发全量设备扫描
在 Jenkins Pipeline 中,用以下 Groovy 脚本批量执行:
def devices = sh(script: 'adb devices | grep "device$" | awk "{print \$1}"', returnStdout: true).trim().split('\n') devices.each { device -> sh "adb -s ${device} shell getprop ro.build.version.release > /tmp/${device}_version.txt" sh "timeout 30s ./device_health_check.sh -s ${device} || echo '设备 ${device} 巡检失败' >> /tmp/failures.log" }关键技巧:
timeout 30s防止某台设备卡死阻塞整个流水线;-s ${device}指定设备 ID,避免多设备并发冲突。
从那以后我每次部署新固件到产线设备前,都强制走一遍这个巡检脚本——不是为了证明设备“能用”,而是为了拿到一份可审计的健康基线报告。它不解决所有问题,但能帮你把 80% 的“设备连不上”、“App 启动白屏”、“OTA 卡死”归因到具体模块,而不是在群里喊“谁来帮我看下”。希望帮到你。
本文还有配套的精品资源,点击获取