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服务上传,需要完成两个关键操作:
修正SELinux上下文
- 先查看正常文件(如2.jpg)的上下文:
输出类似:ls -Z /storage/emulated/0/Android/data/Test/2.jpgu: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.jpg)的上下文:
重新加密为应用密钥
最简单的方式是用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上传的文件放到临时目录(比如
验证操作
退出root模式,用普通ADB shell执行:
ls /storage/emulated/0/Android/data/Test/
此时应能看到所有文件,同时Kotlin应用也可正常访问。
内容的提问来源于stack exchange,提问作者Smedly Tonker
相关产品推荐
相关产品推荐

