adb run-as执行cp复制及单命令编辑文件报错问题咨询
报错核心原因
- 带重定向符号的命令直接跟在
run-as后执行时,重定向操作由调用run-as的默认shell(shell身份,无应用私有目录权限)执行,而非切换到应用身份后执行,因此触发权限拒绝。 - Android 10及以上版本默认启用分区存储,即便是debuggable应用,切换身份后也不具备外置公共存储根目录的直接写入权限,直接执行
cp命令写入公共存储会触发操作不允许报错。Android Studio的文件传输走调试守护进程的专用通道,不依赖普通shell的文件系统权限,因此可以正常操作。
单条命令实现方案
私有目录文件编辑
通过sh -c把包含重定向的完整操作包裹,确保所有操作都在应用身份的shell上下文中执行:
# 写入内容到应用私有配置文件示例 adb shell "run-as app sh -c 'echo test > /data/user/0/app/shared_prefs/app_preferences.xml'"
读取私有文件到本地电脑可直接执行:
adb shell "run-as app cat /data/user/0/app/shared_prefs/app_preferences.xml" > ./local_backup.xml
双向文件拷贝
绕开直接文件复制的权限限制,通过shell标准流做中转实现,不需要提前申请额外存储权限:
- 应用私有目录文件导出到电脑本地:
adb exec-out run-as app cat /data/data/app/shared_prefs/app_preferences.xml > ./local_preferences.xml
- 电脑本地文件导入到应用私有目录:
# 第一步:把本地文件推送到设备临时目录 adb push ./local_target_file.xml /data/local/tmp/ # 第二步:通过流中转写入应用私有目录 adb shell "run-as app sh -c 'cat /data/local/tmp/local_target_file.xml > /data/data/app/shared_prefs/app_preferences.xml'" # 第三步:清理临时文件 adb shell rm /data/local/tmp/local_target_file.xml
- 应用私有目录文件拷贝到设备外置公共存储:
# 建议选择Download等系统授权可写的公共子目录,不要直接写入存储根目录 adb shell "run-as app cat /data/data/app/shared_prefs/app_preferences.xml > /storage/emulated/0/Download/app_preferences.xml"
提示:操作时把命令里的
app替换成实际的应用包名,路径对应调整成实际目标路径即可。
内容的提问来源于stack exchange,提问作者Tomain
相关产品推荐
相关产品推荐

