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

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命令(推荐用于开发者调试)
    操作步骤分两步:
    1. 先把本地文件推送到设备的公共可访问目录,比如Download:
      adb push data /sdcard/Download/
      
    2. 切换到目标应用的身份,将文件移动到对应私有目录:
      adb shell run-as <PackageName> cp -r /sdcard/Download/data /data/data/<PackageName>/files/
      
      (如果是OBB目录,只需调整最后的目标路径即可)
  • 方案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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 17:07:48