惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Attack and Defense Labs
Attack and Defense Labs
Engineering at Meta
Engineering at Meta
腾讯CDC
J
Java Code Geeks
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
G
Google Developers Blog
博客园 - 三生石上(FineUI控件)
Microsoft Azure Blog
Microsoft Azure Blog
The Cloudflare Blog
aimingoo的专栏
aimingoo的专栏
T
The Blog of Author Tim Ferriss
D
Darknet – Hacking Tools, Hacker News & Cyber Security
WordPress大学
WordPress大学
博客园_首页
I
InfoQ
NISL@THU
NISL@THU
Recorded Future
Recorded Future
Security Latest
Security Latest
K
Kaspersky official blog
L
Lohrmann on Cybersecurity
T
The Exploit Database - CXSecurity.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
U
Unit 42
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
www.infosecurity-magazine.com
www.infosecurity-magazine.com
C
CERT Recently Published Vulnerability Notes
W
WeLiveSecurity
Webroot Blog
Webroot Blog
Last Week in AI
Last Week in AI
AWS News Blog
AWS News Blog
IT之家
IT之家
S
Schneier on Security
雷峰网
雷峰网
Know Your Adversary
Know Your Adversary
T
Threat Research - Cisco Blogs
C
CXSECURITY Database RSS Feed - CXSecurity.com
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
L
LangChain Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
月光博客
月光博客
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Stack Overflow Blog
Stack Overflow Blog
有赞技术团队
有赞技术团队
云风的 BLOG
云风的 BLOG
G
GRAHAM CLULEY
O
OpenAI News
The Last Watchdog
The Last Watchdog
TaoSecurity Blog
TaoSecurity Blog
The GitHub Blog
The GitHub Blog
V
Vulnerabilities – Threatpost

少数派

派早报:Google 发布 Fitbit Air 等 - 少数派 「新人报到」確認需求,再開始 - 少数派 从 SOLO 独立开发者社区,我看到了越来越多开发者开始做自己的产品 - 少数派 我怎么管理那些"不常做,但总会忘"的生活事项 - 少数派 人形机器人量产元年,数据才是具身智能的“生死线” - 少数派 BuhoLaunchpad 高度还原 Mac 启动台:开发历程与思考 - 少数派 五年陪伴依然不舍,DIY 换壳后让罗技 MX Master 3 继续服役 - 少数派 新玩意 240|少数派的编辑们最近买了啥? - 少数派 一日一技|为什么你应该关闭 iOS 的键盘声音 - 少数派 我做了个插件和 Skills,一键提取任何网站的设计规范 Design.md - 少数派 住在三四线城市的你,该开始录播客了 - 少数派 甘南秘境,大白高国 - 少数派 AI的审美:谁让把我变成川内倫子 - 少数派 返工怎能不烦恼,打工人片单总有一部是你的「嘴替」 - 少数派 为了让「上厕所」更健康,我做了一个小工具 - 少数派 AI + Skill,能够让生成的文章去除 AI 味吗? - 少数派 新玩意|韶音OpenDots ONE 耳夹式耳机 - 少数派 《美满》| 在每一个春天的晚上相爱(362) - 少数派 新玩意|优篮子 PS01 MagSnap 磁吸支架 - 少数派 自我整合手记 | 我开始早睡了:用稳定规则,为自由托底 - 少数派 用龙虾(OpenClaw)两个多月,我最深的12个体会 - 少数派 听歌时间到,12 张你可能错过的 2025 华语乐坛好专辑 - 少数派 承诺能追吗 - 少数派 macOS 26启动台没了? 我做了个不一样的App启动器 - Keboard - 少数派 《四海为家的人》| INTJ对话INTJ(361) - 少数派 你发过的那些黑历史,是时候一次清干净了 - 少数派 新玩意:安安静静玩,越玩越专注:计客密码机 - 少数派 iPad 用户首次体验 Android 平板:vivo Pad6 Pro - 少数派 数据逻辑强 - 少数派 极北行+ | 一路向北,探访日本至北之地 | 001 - 少数派 万字剖析:千问App深度体验报告(2026) - 少数派 在2026年,如何真正防止别人抄袭你的作品 - 少数派 怎么用 50 块搭个 AI 语音助手?我踩了 3 天坑 - 少数派 YeeroAI:让 AI 对话真正成为知识管理的一部分 - 少数派 爬泰山 - 少数派 「旅图显影」 App 更新:这次,我们补上了一点「手感」 - 少数派 假期出门太折磨?我的 23 条经验帮你规划惬意旅行 - 少数派 工作流会变吗 - 少数派 Claude Opus 4.6 怎么用最省钱?我测了 5 种方案 - 少数派 GPT Image 2 让图文并茂不再稀罕 - 少数派 用户侧出发——什么是AI,我要不要学习? - 少数派 找片、转存、整理、播放一条龙!让你的付费网盘值回票价 - 少数派 欢迎试用!日课一问2.0插件 - 少数派 自己做的MDeditor,原本想购买 Typora 试了两次支付不成功,干脆自己做一个 - 少数派 vibe coding了一个 3MB 的小工具,让 ~/Downloads 彻底告别混乱 - 少数派 因为受不了 Mac 的风扇策略,我做了一个风扇控制工具 - 少数派 别只怪模型 - 少数派 Warp 终端的 AI 功能怎么用?我测了一周的体验 - 少数派 AI 写代码老是出 bug?这 5 个配置我后悔没早知道 - 少数派 「新玩意」苹果出相机可能就这样:Sigma BF + 45mm F2.8 DG Contemporary - 少数派 一个面向2030年的AI操作系统是什么样子的:浅谈cola这款有灵魂的Agent - 少数派 别只看写代码 - 少数派 每天解决10个问题,还是一口气攻坚解决400个? - 少数派 AI 交易机器人怎么搭?我用 Claude 跑了一周实盘 - 少数派 Maptoposter Online:把你爱的城市画成艺术海报 - 少数派 Function Calling 怎么用?我测了 3 个模型发现差距真大 - 少数派 Legend Talk:我做了个 AI 圆桌,让 160 位思想家围着你的问题转 - 少数派 如何找到自己的蓝方?在小县城寻找压力测试 - 少数派 语音输入与软件接口|2026年聊AI时,我们都聊些什么(上) - 少数派 混动已经卖爆,纯电又来补刀——钛7闪充版简直“不讲武德” - 少数派 本月玩什么|朋友收藏、识质存在、沙罗周期 - 少数派 为什么要每天坚持输出? - 少数派 Claude API 挂了好几个小时,你的项目有备用方案吗? - 少数派 Function Calling 没你想的复杂——我用它做了个有点用的工具 - 少数派 登录系统立即播放视频或者图片音乐的软件 - 少数派 我为什么创建 FlipHTML5 下载工具 - 少数派 残局没电?多品牌外设电量统一管理软件EasyBluetooth已支持RTSS游戏内显示以及AIDA64 - 少数派 前往通义路的路 - 少数派 太好看了,媲美Sun的个人导航页,NAS部署星云门户 - 少数派 乌黑嘴唇“一键检测”上线了 - 少数派 派早报:Claude AI 接入多个创意软件生态、FILCO 生产方接手品牌等 - 少数派 【更新】BearCLI、Claude 连接器与 MCP 服务器 - 少数派 记了上千条流水,还是看不懂财务?我做了一个让 AI 读懂账本的工作台 - 少数派 MINI R56 升级原厂 Sport 模式 - 少数派 新玩意 | 一棵柠檬树(仿真版) - 少数派 Momenta的“物理AI”野望,需迈过“含摩量”这道关 - 少数派 网页直接投屏控制手机!NAS一键部署PandaScrcpy,流畅丝滑可远程。 - 少数派 众测|邀你一同探索随身 AI 硬件入口 YoooClaw C·ONE - 少数派 2050大会:分享时间是真诚 参会记 - 少数派 iPad 赋能电影创作:国内首部宣纸手绘长片《燃比娃》的幕后故事 - 少数派 AI的审美:我用 8 个大模型给 100 张旅行照片打分 - 少数派 普通人如何破圈?去参加一个本地协会 - 少数派 把极空间的图标全换了,主题DIY全攻略打造你的专属NAS桌面 - 少数派 电子便签墙,帮你实现便签自由 - 少数派 我如何用三个 CLI 工具取代文档创建需求 - 少数派 原来真的有人可以玩一辈子 - 少数派 社区速递 139 | 派友热议三月买了啥、复古单反尼康 Df 体验 - 少数派 06 作品的赏析与评价 - 少数派 TDS REVIEW|索尼 WF-1000XM6 降噪真无线耳机体验 - 少数派 35.98万起售的第二代腾势D9,我看重的不是堆料,而是不凑合 - 少数派 鼠须管 Squirrel 皮肤配置指北 - 少数派 从watch ultra2换到redmi watch6 - 少数派 派早报:阿里巴巴发布视频生成模型 HappyHorse 1.0 等 - 少数派 别迷信1M - 少数派 家人们天塌了!网盘“大封杀”,多个渠道多条路,NAS部署PanHub - 少数派 AI与人勾心斗角!NAS一键部署AI狼人杀,假日休闲必备。 - 少数派 电商必备!Comfyui工作流批量生图插件,一次生成12张!支持Nano banana pro模型 - 少数派 Comfyui工作流配置Gpt-image-2模型教程,0.03/张 - 少数派 OpenClaw第三方APi怎么配置?可使用Gpt-image-2模型 - 少数派 会员社区话题精选 Ep. 103 - 少数派
Android Q 存储行为大变化,对用户和应用的影响都有哪些 - 少数派
2019-03-15 · via 少数派

与 iOS 不同,过去的 Android 一直都允许应用直接访问内部存储空间(External Storage),并不是所有开发者都能详细考虑到存储空间使用方式对用户体验的影响,尽管这些在 Android Developers 官网文档中都有提及过。

Google 在前面的版本也有一点一点地探索存储功能的改进,例如 Android 4.4 引入的存储访问框架(即 Storage Access Framework,它包括了 Documents Provider 这一利器)和对 SD 卡的访问限制;Android 7.0 增强了 Documents Provider 的接口,提供了虚拟文件的概念,并提供限定目录访问权限控制等等。然而这些改进都需要开发者认真考虑如何设计、使用这些接口,也跟解决内部存储空间脏乱现象没有直接帮助。

自欧盟颁布 GDPR 并实际应用以来,越来越多互联网企业开始意识到用户隐私的保护问题,Android 作为一个移动应用平台,也必须承担起相应的责任。Android 6.0 就已经开始收紧权限管理,后续版本也在一点一点变化,终于在 Android Q 开始对存储功能开始作出重大更改,给予每个应用一个独立的存储沙箱,将文件数据隔离开来。

哪些应用会受到影响?

沙箱化后现有的存储权限申请、数据存放都必须改动,因此 Google 把 Android Q 上会被沙箱化条件设为 “目标 SDK 至少为 Q (29) 的应用或者运行 Android Q 时全新安装的应用”。
不符合这个条件的应用将会运行在兼容模式下,在兼容模式中应用行为大致和过去相同,以保证不会出现严重的数据丢失问题。其中,兼容模式在应用重新安装后会被关闭。

看到这里我比较惊讶,按照这个条件即使应用不是为 Android Q+ 设计(目标 SDK < 29)也会被沙箱化,Google 难得地采取这个强硬的态度,这可能意味着现有的文件管理类应用没有提升目标 SDK 也会受到沙箱化影响,一旦没有 Root 可能就废了。(除非升级适配到 Storage Access Framework)

会受到怎样的影响?

沙箱化后,应用不能再通过 Java File API 来互相访问内部存储文件数据,就像 “/data/data” 中各个应用的数据各自有一个目录存放私有数据一样,应用访问 “/sdcard” 实质上访问的是一个独立的存储空间。如果你在过去的 Android 版本中使用过 “存储重定向(Storage Redirect)” 应用,它们的效果是近似相同的。

值得注意的是,这个独立的存储空间会受到很多限制,你的媒体文件保存在里面可能不再能和其它应用共享,同时也无法通过遍历扫描来自建一个图片/音乐列表,除非通过标准的媒体存储(MediaStore)接口来读写。如果你的应用一开始就采取这些规范的做法,即便没有及时更新目标 SDK,大部分功能也应该能正常运作。

这里就有一个疑问了,既然不能通过 Java File API 来访问别人的文件数据,那么 MediaStore 中获取的媒体地址要怎么访问,必须迁移到 ContentProvider 方式吗?过去 MediaStore 查询返回指针中的 DATA 栏对应的是媒体文件的真实存储路径,现在变成了类似 “/mnt/content/media/external/images/media/10” 这样的路径,允许拥有存储权限的应用继续通过 Java File API 访问而不必迁移到 ContentProvider 方式,保障了正确使用 MediaStore 来读取媒体的权利。

注1:实际使用中发现打开流时会有这样的日志 “V/ActivityThread: Redirecting /mnt/content/media/external/images/media/10 to content://media/external/images/media/10”,经过尝试所有 /mnt/content 都会被内部实现转换成 Content Uri 然后通过 ContentProvider 来打开 FD 以访问,看起来是 libcore 中实现了一个 AndroidOs 类来拦截 /mnt/content 的打开方式。

注2:AndroidOs 类的拦截并不能对 NIO Files API 中的 UnixFileSystemProvider 有效,导致在使用 Files 类中的方法访问 /mnt/content 时会爆炸

公共媒体数据应当通过正确的 MediaStore 接口来读写,那么其它应用数据又应该如何保存呢?首先,沙箱空间跟过去的内部存储空间内 “Android/data/包名” 的文件夹一样,会在应用卸载时被永久清除无法恢复,用户主动下载保存的文件固然不能存在沙箱空间,要想存到沙箱外面,就必须要通过 Storage Access Framework 的 DocumentFile API 进行读写,不限于单个文件的一次性访问,你还可以通过这个接口持续地获得某个目录的存取权限。值得一提的是这个 API 也应该从 Android 4.4 开始就获得了支持,适配 Android Q 后可以大胆地在旧机型同时采用这种方式来访问文件(但也不要忘记在旧机型做 fallback,因为某些国产系统会阉割掉 Documents 应用导致无法请求访问)。

访问公共媒体和保留自己的文档这两个问题都解决了,接下来是如何在跨应用提供文件访问,放到最后才提并不是重头戏,反而对于认真适配了 Android 7.0 的 FileUriExposedException 的同学来说是再简单不过了,通过 Google 在支持库中提供的 FileProvider,只需要编写好 XML 转发规则,完全不必自己实现 ContentProvider 即可将自己的文件路径转换为 Content Uri 提供给其它应用使用。

权限的变化

传统的 READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE 读写权限已经被更加细化的权限替代了,READ_MEDIA_IMAGES 和 READ_MEDIA_VIDEO 分别对应读取图片和视频,授权是会作为一组权限同时授予,而 READ_MEDIA_AUDIO 读取音频权限为单独一组授予,它们会控制应用通过 MediaStore 读取媒体的能力。

如果你的应用还在请求传统的读写权限,在 Android Q 系统中会自动转换成这三个新的权限,同时请求 WRITE_EXTERNAL_STORAGE 对于 Android Q 上运行的应用已没有意义。就像访问自己的私有目录一样,每个沙盒空间只属于对应应用自己,只要沙盒化了无论怎么访问 /sdcard 内置存储也不影响其它应用。

Google 还没有放过媒体存储中图片的隐私位置信息,新增了一个 ACCESS_MEDIA_LOCATION 权限,拥有权限之后还需要调用 MediaStore#setRequireOriginal 方法来更新想要得到位置信息的图片 Uri,具体如何使用可以阅读 Android Developers 官方文档

哪些做法不再推荐

这里所不推荐的做法都是作者本人根据 Android Q 改动和长期以来作为用户体验所总结的,并不是 Google 官方的声明,是否采纳请自行斟酌。

1. 应用内自建图片选择器

大多数社交应用包括海外的 Instagram 都自建了图片选择器,通过 MediaStore 查询列表将结果按照自己的设计进行分类排序显示,提供多选操作,听起来可以扩展许多功能很棒。实际上现代 Android 中 Storage Access Framework 所调用的选取界面已经可以满足几乎所有的需求,甚至支持从网络磁盘(例如 Google Drive、Google Photos 等支持 DocumentProvider 的应用)中选择照片,大幅提高用户的选图效率。尽管选图过程进行编辑还不支持,但我认为使用 SAF 带来的其它好处值得把这些放到下一步去做。

2. 音乐播放器、视频播放器扫描存储并自建列表

沙盒化后要访问公共空间下的媒体就要通过 MediaStore 接口去查询了,应用被关在一个单独的隔离空间里面,又怎么会读得到所有音频、视频呢。当然,用户也有各自的需求,比如一些不适宜给所有拥有权限的应用读到的媒体文件被放在了标记了 .nomedia 的文件夹下无法通过 MediaStore 接口查询,这时候 Storage Access Framework 就派上用场了,让用户自行选择哪些数据需要被你访问到。

3. SDK 组件在应用间共享 IMEI 或其它唯一设备标识符

机智的 SDK 开发者为了解决不是所有应用都被授予了 READ_PHONE_STATE 权限,把用户的 IMEI 或者其它唯一设备标识码写到了内置存储 /sdcard 下,这不仅不安全,也对 Android Q 不再奏效。你可以掏出 ContentProvider 来解决硬需求,但我希望以后大家都克制地追踪、统计用户数据,而不是什么数据都拿到手上未经同意刻画出一批批用户画像。

4. 通过 file:// Uri 来共享文件

适配 Android 7.0 时偷懒通过 StrictMode 来去掉 FileUriExposedException 错误,似乎 Google 自家也有应用偷懒过,现在 “惨遭” 沙箱化后绝对会出问题……也许应该分开一节 “哪些做法已失效”,好像也码不了多少字了,就丢到这里来吧。总之已弃用的方法/行为少用为妙,等到出问题了还得及时改过来。

一点点感叹

Android 一直以来都赋予了应用们对文件系统相当大的使用权利,造就了各式各样的文件管理器、图库和垃圾清理工具等大幅提升使用体验的应用,也遗留下了公共空间脏乱的问题。第一次阅读 Q Preview 文档时还以为 Google 又是只针对新 Target SDK 配合市场规则要求开发者及时适配,认真看才发现这次下了狠手,对所有 Target SDK 都沙盒化,非常惊讶。

去年年初开发者 @RikkaW 推出过 “存储重定向(Storage Redirect)” 应用,也正是解决相同的问题,而它适用于已 Root 的 Android 6.0+ 设备,覆盖用户群更广一些,效果与这次 Android Q 的 Isolated Storage 近似相同,但 Android Q 的做法更暴力一些,如果旧式应用没有使用标准 MediaStore 保存文件,那么用户认为已保存的重要信息可能随着应用卸载而消失。想了解更多可以自行体验,这里不作过多的推广(其实还是想打广告的~)

另外,Storage Access Framework 终于被提到了一个重要的位置,希望大家能好好使用它~