作者: 软件工程师 Jeff Sharkey 和产品经理 Seb Grubb
应用沙盒是 Android 设计的核心部分,它可将不同的应用隔离。基于应用沙盒的基本原则,Android Q 引入了分区储存特性。
自 Beta 1发布以来,我们收到了许多开发者关于这些变更的宝贵反馈,感谢大家帮助我们打造更好的 Android 平台!鉴于这些反馈,我们在更新迭代 Android Q Beta 的过程中也在不断优化这项特性。在这篇文章中,我们将与您分享在 Android Q 设备上如何声明应用对分区储存特性支持的方法,以及对开发者社区提交上来的一些问题的解答和最佳实践。
应用沙盒
https://source.android.google.cn/security/app-sandbox
分区储存
https://developer.android.google.cn/preview/privacy/scoped-storage
帮助您支持分区储存特性的几项更新
我们预计分区存储对那些遵循最佳实践的应用所造成的影响很小。不过,部分开发者向我们反馈表示,分区储存对于某些应用而言是一项需要谨慎应对的变更,他们需要更多的时间来评估它对应用的影响。我们自己也是开发者,因此我们十分理解您可能需要更多时间来确保应用与此项变更的兼容性。因此,我们很愿意协助您。
在即将发布的 Beta 3 版本中,如果应用的 target SDK 为 Android 9 Pie (API 等级 28) 或更低版本,那么,在默认情况下,应用储存方式将不会发生任何改变,依旧采用与旧版本 Android 系统相同的储存机制。在您更新现有应用以支持分区储存的过程中,您可使用新的清单属性让应用在 Android Q 设备上启用新的行为,即使应用针对 API 等级 28 或更低开发也无妨。
这些变更的具体实现细节将在 Beta 3 版本中公布,但我们想要提前通知您,帮助您更好地计划对于 Android Q 设备的应用更新。在明年发布的下一个 Android 主版本中,不论应用针对哪个目标 SDK 等级开发,都必须支持分区储存特性,因此我们建议您提前在应用中添加支持。欢迎各位继续向我们提交反馈,帮助我们进一步优化分区储存特性,以便为您应用的用例提供更好的支持。如果您有任何意见或建议,请参加分区储存专题调研问卷;您可请前往 Google 错误追踪器页面或点击屏末 | 阅读原文 | 提交错误报告或特性请求。
最佳实践
https://www.youtube.com/watch?v=oIn0MZQJpp0
分区储存专题调研问卷
https://docs.google.com/forms/d/e/1FAIpQLSdhhKVRKp1a7lj5XsQJ6rN9HyJ8d9WGPcdGwmTibWfhPUmj_g/viewform?vc=0&c=0&w=1
Google 错误追踪器页面
https://issuetracker.google.com/issues/new?component=190602&template=1245332
针对常见反馈的几个最佳实践
您的反馈十分有价值,对我们的设计决策帮助也很大。在这里,我们希望与您分享一下团队对几个常见问题的解答以及建议您采用的最佳实践:
存储共享媒体文件: 如果您的应用需要与其它应用 (如照片库) 共享文件,而且即使在应用卸载后,这些文件仍需继续保留在设备中,那么,请您使用 MediaStore API。常见的媒体文件有以下三类特定集合: 音频 (Audio)、视频 (Video) 和图片 (Images)。至于其它类型的文件,您则可将其储存在新的下载文件集合中。应用必须使用系统选择器才能访问下载集合内的文件。
存储应用内部文件: 如果您的应用不与其它应用共享文件,请将文件储存在包下目录。这能帮助您有条理地管理文件并限制文件混乱,因为,当用户卸载应用后,操作系统会负责接手后续的文件清除工作。Context.getExternalFilesDir() 函数可继续使用。
权限及文件所有权: 在使用 MediaStore 的情况下,应用无需权限便可访问自己创建的文件,但是如果应用需要访问由其它应用提供的文件,则需请求权限。不过,在用户卸载应用之后又重新安装的情况下,您需要再次向用户请求权限,才能访问您的应用之前所提供的媒体文件。
使用原生代码或库: 我们推荐的设计模式是先在 Java 或 Kotlin 代码中寻找文件,然后将它的文件描述符 (file descriptor) 传递到您的原生代码中。
高效处理多文件场景: 如果您需要在一个事务中进行批量文件操作,请考虑调用 ContentProvider.applyBatch()。如需获取更多有关 ContentProvider 批量处理的内容,请阅读《内容提供程序基础知识》。
与系统文件选择器 (file picker) 集成:
如文字处理器一类的文档应用可使用 OPEN_DOCUMENT 或 GET_CONTENT action 来启动系统文件选择器。请阅读《存储访问框架》,进一步了解两者差异。
文件管理应用往往需要和各层目录下的其它应用协同工作。请使用 OPEN_DOCUMENT_TREE 让用户选择目录子树,接着,应用便可处理返回目录中的文件。在此项支持的帮助下,用户可通过任何已安装的 DocumentsProvider 事件访问文件,而这些事件则由基于云的或本地的储存解决方案所支持。
此外,我们还为您准备了详细的《分区储存开发者文档》,您可仔细阅读并获取更多技术细节。
MediaStore API
https://developer.android.google.cn/reference/android/provider/MediaStore
音频
https://developer.android.google.cn/reference/android/provider/MediaStore.Audio.html
视频
https://developer.android.google.cn/reference/android/provider/MediaStore.Video
图片
https://developer.android.google.cn/reference/android/provider/MediaStore.Images
Context.getExternalFilesDir()
https://developer.android.google.cn/reference/android/content/Context.html#getExternalFilesDir(java.lang.String)
设计模式
https://developer.android.google.cn/preview/privacy/scoped-storage#media-from-native-code
ContentProvider.applyBatch()
https://developer.android.google.cn/reference/android/content/ContentProvider.html#applyBatch(java.util.ArrayList%3Candroid.content.ContentProviderOperation%3E)
OPEN_DOCUMENT
https://developer.android.google.cn/reference/android/content/Intent.html#ACTION_OPEN_DOCUMENT
GET_CONTENT
https://developer.android.google.cn/reference/android/content/Intent.html#ACTION_GET_CONTENT
《存储访问框架》
https://developer.android.google.cn/guide/topics/providers/document-provider#client
OPEN_DOCUMENT_TREE
https://developer.android.google.cn/reference/android/content/Intent.html#ACTION_OPEN_DOCUMENT_TREE
DocumentsProvider
https://developer.android.google.cn/reference/android/provider/DocumentsProvider.html
《分区储存开发者文档》
https://developer.android.google.cn/preview/privacy/scoped-storage
下一步
很高兴看到开发者们这段时间以来对 Android Q 的热情参与。我们将在接下来的几个月中逐步收尾 Android Q 的开发工作,请继续测试并向我们提交反馈。欢迎大家参加 Google I/O 2019 开发者大会,届时将有更多关于分区储存及其它 Android Q 特性的精彩内容等着您。我们会在 5 月 8 日举办名为 “What’s New in Shared Storage” 的主题演讲,感兴趣的小伙伴可阅读推文《观看 Google I/O’19 的正确姿势》了解直播平台信息,我们会在大会前一天公布直播入口,敬请关注。
“What’s New in Shared Storage”
https://events.google.com/io/schedule/events/ce2389d7-7f7b-45e1-a5d0-c93debb143c4
点击屏末 | 阅读原文 | 提交错误报告或特性请求
推荐阅读