高级文件系统操作 - 备份 迁移 修改配置
shell 权限下能碰哪些目录
Runner(shell 权限)能操作的目录:
| 目录 | 权限 | 典型操作 |
|---|---|---|
/sdcard/ | 完整读写 | 用户数据、下载文件、备份 |
/data/app/ | 只读 | 提取 APK |
/data/data/<包名>/ | 部分可读 | 某些 App 数据目录 |
/data/local/tmp/ | 读写 | 临时文件存放、推文件进系统 |
/system/ | 只读 | 读系统文件、查看 ROM 版本 |
/vendor/ | 只读 | 查看硬件配置 |
root 权限下再加:
/system/读写(需 remount)/data/data/<包名>/完整读写- 任何其他目录
实战场景一:备份所有已安装 APK
想保留一份当前手机上所有 App 的安装包:
# 方案一:shell 权限下从 /data/app 提取
mkdir -p /sdcard/apk-backup
for apk in $(ls /data/app/*/base.apk); do
pkg=$(echo $apk | grep -oP '(?<=/data/app/)[^/]+')
cp $apk /sdcard/apk-backup/${pkg}.apk
done
Runner 里直接跑整个脚本?不行——Runner 里执行 shell 命令是逐行解释的,for 循环脚本可能不被完整支持。正确做法是:
- 在电脑上写好这个脚本
- 推到
/data/local/tmp/backup.sh - Runner 里执行:
sh /data/local/tmp/backup.sh
实战场景二:修改 /sdcard 下的配置文件
很多 App 会把配置文件存在 /sdcard/ 下(比如 /sdcard/Android/data/<包名>/files/)。直接用 cat + 重定向修改:
# 先备份
cp /sdcard/Android/data/com.example.app/files/config.json /sdcard/config.json.bak
# 修改(用 echo 重写)
echo '{"key": "new_value"}' > /sdcard/Android/data/com.example.app/files/config.json
# 或者追加一行
echo 'new_config_line' >> /sdcard/Android/data/com.example.app/files/config.json
注意:如果配置文件是 JSON 格式,用 echo 重写会覆盖整个文件,除非你在 shell 里用 jq 这类 JSON 工具做增量修改(Android 默认不带 jq,需要自己推)。
实战场景三:查看系统构建信息
# 查看 ROM 版本
cat /system/build.prop | grep ro.build.display.id
# 输出: ro.build.display.id=MIUI Global 14.0.6.0
# 查看 Android 版本
getprop ro.build.version.release
# 查看设备型号
getprop ro.product.model
# 查看 CPU 架构
cat /proc/cpuinfo
实战场景四:清理应用缓存
# 方式一:pm 命令清理指定 App 数据(会清应用数据,包括登录状态!)
pm clear com.example.app
# 方式二:只清理缓存目录(不会清登录状态)
rm -rf /data/data/com.example.app/cache/*
# 注意:shell 权限可能碰不到 /data/data 下某些目录
# 方式三:清理 /sdcard/Android/data/ 下的临时文件
rm -rf /sdcard/Android/data/com.example.app/cache/*
推文件进系统
shell 权限下你可以把电脑上的文件推到 /data/local/tmp/,然后 Runner 里执行:
# 电脑上
adb push script.sh /data/local/tmp/
# Runner 里执行
sh /data/local/tmp/script.sh
这是很多"一键脚本"流传的方式——脚本本身放在 /data/local/tmp/,Runner 执行它,执行完可以留着复用或删掉。
注意 shell 与 root 边界
以下操作必须 root 权限,Runner 开降权时会被拒绝:
- 写入
/system/分区 - 修改 SELinux 上下文
- 修改
/proc/下的硬件寄存器 - 修改
/sys/下的 sysfs 节点 - 访问其他 App 的私有数据目录(
/data/data/<其他包>/)
如果 Runner 在 root 权限下运行,这些就都能做——但做之前想清楚,rm -rf /system/* 一行命令就能让手机变砖。