You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 12下ADB root推送文件无法被普通用户访问的问题求助

解决方案:Android 12下root上传文件至应用私有目录无法被普通用户/应用访问的问题

核心原因

Android 12的Scoped Storage结合File-Based Encryption (FBE),对应用私有目录(/storage/emulated/0/Android/data/[包名])的访问做了双重限制:

  • 不是仅靠POSIX权限(chown/chmod)就能控制,还需要匹配正确的SELinux安全上下文,root上传的文件默认上下文与应用目录不兼容,普通用户/shell进程无法识别。
  • FBE采用进程级密钥加密,root使用全局解密密钥可以访问所有文件,但普通用户/应用进程只能解密用自身密钥加密的文件——root上传的文件是用全局密钥加密的,普通用户没有权限解密,因此即使权限改对也看不到。

可行解决方法

方法1:避免用root直接操作应用私有目录

直接通过普通ADB用户(非root)推送文件,或者让Kotlin应用自身处理文件接收(比如集成sftp客户端在应用进程内运行,或通过ContentProvider接收文件)。这种方式上传的文件会自动继承正确的权限、SELinux上下文和加密密钥,无需额外配置。

方法2:必须用root时的修复步骤

如果只能通过root的SSH/sFTP服务上传,需要完成两个关键操作:

  1. 修正SELinux上下文

    • 先查看正常文件(如2.jpg)的上下文:
      ls -Z /storage/emulated/0/Android/data/Test/2.jpg
      
      输出类似:u:object_r:app_data_file:s0:c123,c456
    • 将root上传的文件(如1.jpg)修改为相同上下文:
      chcon u:object_r:app_data_file:s0:c123,c456 /storage/emulated/0/Android/data/Test/1.jpg
      
  2. 重新加密为应用密钥
    最简单的方式是用run-as命令切换到应用进程身份复制文件:

    • 先将root上传的文件放到临时目录(比如/data/local/tmp):
      mv /storage/emulated/0/Android/data/Test/1.jpg /data/local/tmp/
      
    • 切换到应用身份复制回目标目录:
      run-as com.your.test.app cp /data/local/tmp/1.jpg /storage/emulated/0/Android/data/Test/
      

    此操作会自动用应用的加密密钥重新加密文件,同时继承正确的权限和上下文。

验证操作

退出root模式,用普通ADB shell执行:

ls /storage/emulated/0/Android/data/Test/

此时应能看到所有文件,同时Kotlin应用也可正常访问。

内容的提问来源于stack exchange,提问作者Smedly Tonker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 12:34:58