`adb shell find` 报 **Permission denied** 的最常见原因是:**Android 10(API 29)起默认启用分区存储(Scoped Storage)且系统限制非root设备对非应用私有目录的遍历权限**。即使使用 `adb shell`,普通用户(shell UID)也无法读取 `/data/data/`、`/data/system/` 等受 SELinux 策略保护的路径;`find` 在递归扫描时一旦触达无权访问的目录(如其他App数据目录或系统敏感区),即抛出该错误。此外,未启用 `adb root`(设备未root或未执行 `adb root && adb remount`)时,shell 进程运行在受限的 `shell` 或 `adb` SELinux 域下,`find` 的子进程继承相同权限,无法越权访问。注意:`find /sdcard -name "*.txt"` 通常可行(对应 `/storage/emulated/0`,受Storage Access Framework管控但兼容性较好),而 `find /data -name "*"` 几乎必失败。排查建议:先用 `ls -lZ` 检查目标路径SELinux上下文,再确认是否需root权限或改用应用自身沙盒内路径。
1条回答 默认 最新
小丸子书单 2026-04-25 11:45关注```html一、现象层:Permission denied 的直观表现与触发场景
执行
adb shell find /data -name "*.apk"或adb shell find /data/data -type d时,终端高频输出大量find: '/data/data/com.xxx': Permission denied。该错误并非单一路径失败,而是遍历过程中任意子目录权限不足即中止当前分支——这是 Unix 风格工具的默认容错行为,而非 Android 特有缺陷。二、权限模型层:Android 10+ 的三重权限栅栏
- 应用沙盒隔离:每个 App 数据目录(
/data/data/<pkg>)属主为对应 UID,shell 用户(UID 2000)无读取权; - Scoped Storage 强制约束:API 29 起,即使通过
adb shell进入,也无法绕过存储访问框架(SAF)对/sdcard外部路径的逻辑拦截; - SELinux 域限制:未 root 设备中,adb shell 运行于
u:r:shell:s0或u:r:adb:s0域,其allow规则明确禁止search/data下多数类型(如data_file,system_file)。
三、技术验证层:精准定位权限瓶颈的诊断链路
命令 用途 典型输出示例 adb shell id确认当前 shell UID/GID uid=2000(shell) gid=2000(shell) groups=...adb shell ls -ldZ /data /data/data查看 SELinux 上下文与权限位 drwxr-xr-x u:object_r:rootfs:s0 /datadrwx--x--x u:object_r:app_data_file:s0 /data/data四、解决方案层:分场景的工程化应对策略
- 非 root 设备首选路径迁移:
find /sdcard/Download -name "*.log"(对应/storage/emulated/0/Download),利用 SAF 兼容性; - 应用沙盒内定向搜索:若已知目标包名,先
adb shell run-as <pkg>切换上下文,再find . -name "*.json"; - root 设备的合规提权流程:
adb root && adb remount && adb shell find /data/data -name "config.xml"; - SELinux 临时调试(仅开发机):
adb shell setenforce 0验证是否为策略拦截(生产环境严禁)。
五、架构纵深层:从 Linux 内核到 Android 框架的权限传递链
graph LR A[adb daemon
running as UID 2000] --> B[SELinux domain: u:r:adb:s0] B --> C{Can access?} C -->|Yes| D[/data/local/tmp
type: shell_data_file] C -->|No| E[/data/system
type: system_file
no allow adb search system_file] E --> F[Kernel returns -EACCES] F --> G[find syscall fails
→ Permission denied]六、避坑指南:高危操作与兼容性陷阱
- ❌
adb shell su -c 'find /data ...'在未 root 设备上必然失败(su 二进制本身被 SELinux 策略禁止执行); - ❌ 依赖
/proc/mounts挂载点伪造路径(如/mnt/expand/xxx)仍受 SELinux 类型约束; - ✅ 推荐使用
adb shell pm list packages -f+run-as组合替代全局扫描; - ✅ 对于自动化测试,预置 debuggable APK 并通过
FileObserver监控沙盒内文件变更更可靠。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报- 应用沙盒隔离:每个 App 数据目录(