非Root安卓设备使用run-as向SD卡写入权限问题求助
解决未Root设备
run-as复制应用文件到SD卡权限被拒的问题 1. 修正cp命令的用法
你当前的命令存在两个核心问题:
- 复制目录必须添加
-r递归参数,否则cp仅会处理单个文件 - Android 10+的Scoped Storage限制了应用直接写入
/sdcard根目录,优先写入应用私有外部存储更稳妥
修正后的命令(先复制到应用私有外部存储):
run-as com.mypackage.app cp -r /data/data/com.mypackage.app/files /storage/emulated/0/Android/data/com.mypackage.app/files/ exit
后续可从私有外部存储转移到目标SD卡目录:
cp -r /storage/emulated/0/Android/data/com.mypackage.app/files/ /storage/emulated/0/your_target_folder/
2. 确认MANAGE_EXTERNAL_STORAGE权限生效
即使设置中手动授予了权限,也需验证应用是否实际获取到:
adb shell pm list permissions -d -g com.mypackage.app | grep MANAGE_EXTERNAL_STORAGE
若输出未显示granted,可通过adb强制授予:
adb shell appops set com.mypackage.app MANAGE_EXTERNAL_STORAGE allow
3. 绕过shell权限限制的替代方案
如果run-as的shell仍受权限约束,可通过以下方式导出文件:
- 单个文件直接读写:
adb shell run-as com.mypackage.app cat /data/data/com.mypackage.app/files/your_file.txt > /sdcard/Download/your_file.txt
- 目录打包导出:
# 先在应用内打包目录 adb shell run-as com.mypackage.app zip -r /data/data/com.mypackage.app/temp.zip /data/data/com.mypackage.app/files/ # 拉取到本地后再推送到SD卡 adb pull /data/data/com.mypackage.app/temp.zip ./ adb push ./temp.zip /sdcard/Download/ # 清理应用内临时文件 adb shell run-as com.mypackage.app rm /data/data/com.mypackage.app/temp.zip
4. 适配Android版本的存储规则
- Android 10(API 29)及以上启用Scoped Storage,即使有
WRITE_EXTERNAL_STORAGE权限,应用仅能直接访问:- 自身私有外部存储:
/storage/emulated/0/Android/data/com.mypackage.app/ - 公共媒体目录(如Downloads、Pictures)
- 自身私有外部存储:
- 若要写入公共目录,直接指定对应路径即可,例如:
run-as com.mypackage.app cp -r /data/data/com.mypackage.app/files /storage/emulated/0/Download/
内容的提问来源于stack exchange,提问作者Rs9000
相关产品推荐
相关产品推荐

