Android 11及更高版本下adb无法向/sdcard/Android/data目录推送数据的问题咨询
问题原因及解决方案解析
这个问题本质是Android 11+引入的Scoped Storage(分区存储)权限限制导致的,结合不同厂商的适配策略和系统版本迭代,具体细节和解决办法如下:
核心原因:Scoped Storage的权限收紧
从Android 11开始,谷歌为了保护用户数据隐私,严格限制了应用(包括adb操作)对其他应用私有存储目录的访问:
- 第三方应用和普通adb命令,默认无法直接写入
/sdcard/Android/data/<PackageName>或/sdcard/Android/obb/<PackageName>这类属于特定应用的私有目录 - Pixel 3在Android 11初期的固件中,可能因为系统适配的过渡策略,暂时放开了adb的这类访问权限,但到Android 12 Beta 1时,谷歌严格执行了Scoped Storage规则,所以也出现了推送失败
- 三星等厂商的定制ROM在Android 11阶段就较早落地了严格的权限限制,所以你在三星S20这类设备上提前遇到了问题
谷歌官方的相关说明
谷歌在Android开发者文档中明确了Scoped Storage对adb操作的影响:
从Android 11开始,除非目标应用拥有
MANAGE_EXTERNAL_STORAGE权限(该权限仅面向文件管理类等特定应用,且需通过谷歌Play的特殊审核),否则即便是adb命令,也无法直接写入其他应用的私有存储目录。
同时,官方也针对开发者调试场景提供了例外路径:
- 如果你是目标应用的开发者,且设备处于调试模式,可以通过
adb shell run-as <PackageName>切换到应用的身份,从而合法访问该应用的私有目录 - 已root的设备可通过root权限绕过限制,但这并非通用的合规方案
能否继续像之前一样推送数据?
没法完全照搬Android 11之前的直接推送方式,但可以通过以下合规方案实现需求:
- 方案1:使用
run-as命令(推荐用于开发者调试)
操作步骤分两步:- 先把本地文件推送到设备的公共可访问目录,比如Download:
adb push data /sdcard/Download/ - 切换到目标应用的身份,将文件移动到对应私有目录:
(如果是OBB目录,只需调整最后的目标路径即可)adb shell run-as <PackageName> cp -r /sdcard/Download/data /data/data/<PackageName>/files/
- 先把本地文件推送到设备的公共可访问目录,比如Download:
- 方案2:过渡性适配(仅适用于Android 11)
如果是你自己开发的应用,可以在AndroidManifest.xml中添加android:requestLegacyExternalStorage="true"属性,暂时绕过Scoped Storage限制,这样adb就能恢复之前的直接推送方式。但注意这只是过渡方案,Android 12及以上版本不再支持该属性,谷歌建议尽快适配Scoped Storage规范 - 方案3:官方扩展包分发方式
如果你要推送的是应用的扩展资源包,可以将数据打包成APK扩展文件,然后通过adb install -t <扩展包APK路径>命令安装,这符合官方的资源包分发规范
内容的提问来源于stack exchange,提问作者Hai Phan
相关产品推荐
相关产品推荐

