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

非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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:05:13