丁香医生 2026-04-25 11:45 采纳率: 98.9%
浏览 0
已采纳

adb shell find 命令报 Permission denied 的常见原因是什么?

`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:s0u:r:adb:s0 域,其 allow 规则明确禁止 search /data 下多数类型(如 data_file, system_file)。

    三、技术验证层:精准定位权限瓶颈的诊断链路

    命令用途典型输出示例
    adb shell id确认当前 shell UID/GIDuid=2000(shell) gid=2000(shell) groups=...
    adb shell ls -ldZ /data /data/data查看 SELinux 上下文与权限位drwxr-xr-x u:object_r:rootfs:s0 /data
    drwx--x--x u:object_r:app_data_file:s0 /data/data

    四、解决方案层:分场景的工程化应对策略

    1. 非 root 设备首选路径迁移find /sdcard/Download -name "*.log"(对应 /storage/emulated/0/Download),利用 SAF 兼容性;
    2. 应用沙盒内定向搜索:若已知目标包名,先 adb shell run-as <pkg> 切换上下文,再 find . -name "*.json"
    3. root 设备的合规提权流程adb root && adb remount && adb shell find /data/data -name "config.xml"
    4. 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 监控沙盒内文件变更更可靠。
    ```
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 4月26日
  • 创建了问题 4月25日