Featured image of post ADB文件管理实战:用命令行驯服你的安卓手机

ADB文件管理实战:用命令行驯服你的安卓手机

搞安卓开发或者折腾手机的人,迟早都要跟ADB打交道。GUI工具用着用着就卡,传个大文件MTP协议各种断连,批量操作更是噩梦。ADB才是正道,快、稳、可控。

这篇讲的就是怎么用ADB命令行管理安卓手机上的文件,从基础操作到进阶技巧,一次讲透。

环境准备

装好Android SDK Platform Tools就行,不需要完整的Android Studio。

1
2
3
4
5
6
7
8
# Ubuntu/Debian
sudo apt install adb

# macOS
brew install android-platform-tools

# Windows
# 去 https://developer.android.com/studio/releases/platform-tools 下载解压,加到PATH

手机端开启USB调试:设置 → 关于手机 → 连续点击版本号7次激活开发者选项 → 开发者选项 → USB调试打开。

用USB线连上电脑,终端输入:

1
adb devices

如果看到设备ID后面跟着device,说明连接成功。如果显示unauthorized,看手机上有没有弹出授权对话框,勾上"始终允许"点确定。

无线连接也行,前提是手机和电脑在同一局域网:

1
2
3
# 先用USB连一次
adb tcpip 5555
adb connect 192.168.1.100:5555

拔掉USB线,后续操作走WiFi。延迟比USB高,传大文件不推荐,但日常操作够用。

基础文件操作

推送文件到手机

1
adb push ~/photos/vacation.zip /sdcard/Pictures/

这个命令把本地的vacation.zip推送到手机的/sdcard/Pictures/目录。注意安卓的/sdcard不是真正的SD卡,是内部存储的符号链接,大多数手机只有这一个用户可见存储区。

推送整个目录也行:

1
adb push ~/music/ /sdcard/Music/

末尾的斜杠不能少,否则adb会把整个目录作为子目录推过去,路径变成/sdcard/Music/music/,多套一层。

从手机拉取文件

1
adb pull /sdcard/DCIM/Camera/ ~/backup/photos/

拉取单个文件或整个目录都支持。拉取目录时本地目标路径如果不存在会自动创建。

一个实用场景:备份应用数据。前提是应用数据在可访问路径下:

1
adb pull /sdcard/Android/data/com.example.app/ ~/backup/app_data/

查看文件列表

1
adb shell ls -la /sdcard/Download/

adb shell后面跟的是标准的Linux shell命令。ls -la显示详细列表含隐藏文件。安卓底层是Linux,大部分常用命令都能用。

删除文件

1
2
adb shell rm /sdcard/Download/temp.apk
adb shell rm -r /sdcard/Download/cache_folder/

rm -r删目录,没有确认提示,删了就是删了。建议先ls确认路径再动手。

进阶技巧

批量清理截图

手机截图攒了几百张,手动删要命:

1
adb shell rm /sdcard/Pictures/Screenshots/*.png

或者只删7天前的:

1
adb shell find /sdcard/Pictures/Screenshots/ -name "*.png" -mtime +7 -delete

find命令在安卓上可用,-mtime +7匹配修改时间超过7天的文件。

按扩展名找文件

1
adb shell find /sdcard/ -name "*.apk" -type f

找所有APK文件。-type f限定只匹配文件,跳过目录。

查看磁盘占用

1
2
adb shell df -h /sdcard/
adb shell du -sh /sdcard/DCIM/

df -h看整体容量,du -sh看特定目录占用。手机存储空间不够的时候,这两个命令比去设置里翻快多了。

文件权限问题

有时候push过去的文件在手机上打不开,十有八九是权限问题:

1
adb shell chmod 644 /sdcard/Download/config.json

644 = 拥有者读写,组和其他人只读。安卓的/sdcard目录用的是FUSE文件系统,chmod可能不生效,这种情况需要把文件先推到/data/local/tmp/,改完权限再移过去。

大文件断点续传

ADB本身不支持断点续传,但可以拆分文件:

1
2
3
4
5
6
7
8
9
# 电脑端拆分
split -b 100M large_file.zip large_file_part_

# 逐个推送
adb push large_file_part_aa /sdcard/Download/
adb push large_file_part_ab /sdcard/Download/

# 手机端合并
adb shell cat /sdcard/Download/large_file_part_* > /sdcard/Download/large_file.zip

这种土办法在MTP频繁断连的场景下比GUI工具靠谱得多。

应用管理相关文件操作

导出已安装APK

想备份某个应用或者分享给没网的环境:

1
2
3
4
5
6
# 先找包名对应的安装路径
adb shell pm path com.example.app
# 输出类似:package:/data/app/~~random_hash==/com.example.app-random_hash==/base.apk

# 拉取
adb pull /data/app/~~random_hash==/com.example.app-random_hash==/base.apk ~/backup/app.apk

pm path输出的路径每次安装都不一样,别硬编码。

清除应用缓存

1
adb shell pm clear com.example.app

注意这会清除所有应用数据,等于恢复出厂设置里单个应用的清除数据。缓存大了占空间但又不想卸载重装的时候用。

列出所有已安装包

1
adb shell pm list packages -3

-3只显示第三方应用,不显示系统应用。要全看就去掉-3

多设备操作

如果同时连了多台设备,adb devices列出后需要指定目标:

1
2
adb -s emulator-5554 push file.txt /sdcard/
adb -s 192.168.1.100:5555 pull /sdcard/log.txt ./

-s后面跟设备序列号。序列号从adb devices的输出里抄。

常见坑

MTP和ADB同时连会冲突。 电脑文件管理器通过MTP访问手机存储时,adb push/pull可能报错。关掉电脑端的MTP文件管理器窗口再试。

/sdcard路径不统一。 有的手机是/sdcard,有的要用/storage/emulated/0,本质是同一个地方,符号链接指向不同。用adb shell echo $EXTERNAL_STORAGE查看当前设备的标准路径。

Android 11+的Scoped Storage限制。 从安卓11开始,应用只能访问自己目录下的文件。adb shell是以shell用户运行的,权限比普通应用高,大部分目录还是能访问,但/sdcard/Android/data/下的内容在shell里也可能受限。遇到Permission Denied先adb root试试,不行的话说明厂商锁了SELinux策略,普通用户只能认栽。

中文字符乱码。 adb shell里中文文件名可能显示为问号。这是终端编码问题,不是文件坏了。设置终端编码为UTF-8,或者用adb shell ls -1 > filelist.txt把列表导出再看。

速查表

操作命令
推送文件adb push 本地路径 手机路径
拉取文件adb pull 手机路径 本地路径
列出文件adb shell ls -la 路径
删除文件adb shell rm 文件路径
删除目录adb shell rm -r 目录路径
查找文件adb shell find 路径 -name "*.ext"
磁盘占用adb shell du -sh 路径
改权限adb shell chmod 644 文件路径
查APK路径adb shell pm path 包名
清应用数据adb shell pm clear 包名

ADB文件管理这活,熟练了比任何GUI工具都快。命令行不骗你,出错了信息明明白白摆在那,比MTP突然断连让你怀疑人生强一万倍。


本文由 BOSH 的博客助手 HerMes 整理 🐧

热爱生活 学无止境
使用 Hugo 构建
主题 StackJimmy 设计