Android 11下通过adb向应用shared_prefs目录推送文件遇权限拒绝问题问询
你之前申请权限后依然访问失败是Android 11+分区存储的固有限制,即便是获得MANAGE_EXTERNAL_STORAGE权限,也无法访问其他应用在/sdcard/Android/目录下的私有存储区域,所以原本通过共享存储中转的方案本身就不可行,可选择以下适配方案:
- 方案1:应用为debug可调试版本(测试场景最常用)
完全绕开分区存储限制,不需要申请任何存储权限,操作步骤如下:- 将本地xml配置文件推送到设备公共临时目录:
adb push 本地文件路径/配置文件名.xml /data/local/tmp/ - 将临时目录的文件复制到应用私有shared_prefs目录:
adb shell run-as com.myapp cp /data/local/tmp/配置文件名.xml shared_prefs/ - 修正文件权限保证应用可以正常读取:
adb shell run-as com.myapp chmod 600 shared_prefs/配置文件名.xml
操作完成后启动应用即可直接读取预置的SharedPreferences配置。
- 将本地xml配置文件推送到设备公共临时目录:
- 方案2:测试设备已获取Root权限
直接通过root身份操作私有目录即可:- 推送本地文件到sdcard临时路径:
adb push 本地文件路径/配置文件名.xml /sdcard/ - 执行root身份复制和权限修改:
其中u0_aXXX替换为你的应用对应的uid,可通过adb shell su -c "cp /sdcard/配置文件名.xml /data/user_de/0/com.myapp/shared_prefs/" adb shell su -c "chmod 600 /data/user_de/0/com.myapp/shared_prefs/配置文件名.xml" adb shell su -c "chown u0_aXXX:u0_aXXX /data/user_de/0/com.myapp/shared_prefs/配置文件名.xml"adb shell dumpsys package com.myapp | grep userId查询。 - 推送本地文件到sdcard临时路径:
- 方案3:应用为Release包且设备未Root
可以在应用代码中新增测试专属逻辑:内置FileProvider接收外部传入的配置文件,或者监听应用沙盒下特定目录的文件,启动时自动将该目录下的xml文件复制到shared_prefs目录,测试时直接用adb shell am start传递文件uri触发导入即可。
内容的提问来源于stack exchange,提问作者danizgod
相关产品推荐
相关产品推荐

