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

Android 11 scoped storage下adb pull权限被拒,Android 13正常原因咨询

问题描述

我的应用在外部存储目录/sdcard/Android/data/myPackageName下创建文件,自动化测试中需通过adb拉取该目录内的文件。当前compileSdkVersion和targetSdkVersion均设置为31,已声明以下权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

但adb pull命令在Android 11真机上提示权限被拒,在Android 13真机上可正常执行。两者挂载点信息如下:

Android 13

/dev/block/dm-40 on /storage/emulated/0/Android/data type f2fs (rw,lazytime,seclabel,nosuid,nodev,noatime,background_gc=on,discard,no_heap,user_xattr,inline_xattr,acl,inline_data,inline_dentry,flush_merge,extent_cache,mode=adaptive,active_logs=6,reserve_root=32768,resuid=0,resgid=1065,inlinecrypt,alloc_mode=default,checkpoint_merge,fsync_mode=nobarrier,discard_unit=block)

Android 11

/dev/block/dm-12 on /storage/emulated/0/Android/data type f2fs (rw,lazytime,seclabel,nosuid,nodev,noatime,background_gc=on,discard,no_heap,user_xattr,inline_xattr,acl,inline_data,inline_dentry,flush_merge,extent_cache,mode=adaptive,active_logs=6,reserve_root=32768,resuid=0,resgid=1065,inlinecrypt,alloc_mode=default,fsync_mode=nobarrier)

两者仅存在discard_unit=block和checkpoint_merge参数差异。查阅大量资料仍未找到原因,求问为何会出现该差异?

原因分析与解决方案

核心原因:Android版本间的adb权限逻辑差异

Android 11(API 30)开始严格隔离应用专属外部存储目录,即使声明了读写权限,调试模式下的adb也无法直接访问/Android/data/[包名]目录,这是系统为保护应用私有数据设置的强制隔离机制。

而Android 13(API 33)调整了调试场景下的权限策略:当设备开启调试模式并完成adb授权后,系统默认允许adb访问应用专属的外部存储目录,因此可以正常执行adb pull。

你看到的挂载点参数差异属于F2FS文件系统的性能优化配置,和adb权限问题完全无关,无需关注。

Android 11上的解决方法

  • 内部存储中转:将目标文件复制到应用内部存储目录(/data/data/[包名]/files),再执行adb pull——调试模式下adb对内部存储拥有访问权限。
  • 临时授权全存储权限:执行命令adb shell pm grant [你的包名] android.permission.MANAGE_EXTERNAL_STORAGE,此权限仅适合测试场景使用,上线前需移除相关逻辑。
  • 公共目录导出:在应用内添加文件导出功能,将文件复制到公共目录(如Download),再通过adb pull拉取该目录下的文件。

内容的提问来源于stack exchange,提问作者Lino

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:15:58