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
相关产品推荐
相关产品推荐

