Android Q 分区储存: 最佳实践和几项更新
作者: 软件工程师 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
点击屏末 | 阅读原文 | 提交错误报告或特性请求
推荐阅读
观看 Google I/O’19 的正确姿势
Android Q 赋予用户更多位置控制
Android Q Beta 2 已上线!我们来看看都做了哪些更新
Android Q 分区储存: 最佳实践和几项更新相关推荐
- Android应用性能优化最佳实践.
移动开发 Android应用性能优化最佳实践 罗彧成 著 图书在版编目(CIP)数据 Android应用性能优化最佳实践 / 罗彧成著. -北京:机械工业出版社,2017.1 (移动开发) ISBN ...
- 提升Android开发效率的最佳实践
本文属于Android入门与最佳实践系列,有兴趣的可以围观笔者的前一篇关于Android实践建议的文章:2016里一些Android最佳实践列表--Opinionated 原文地址 软件工程师的工作效 ...
- 《Android和PHP开发最佳实践》一1.3 如何学习Android和PHP
1.3 如何学习Android和PHP 前面我们已经讨论过"为何学"的问题,大家应该对Android加PHP这套应用开发解决方案有了大致的了解.接下来介绍"如何学&quo ...
- Android 路由框架ARouter最佳实践
一.功能介绍 支持直接解析标准URL进行跳转,并自动注入参数到目标页面中 支持多模块工程使用 支持添加多个拦截器,自定义拦截顺序 支持依赖注入,可单独作为依赖注入框架使用 支持InstantRun 支 ...
- Android端WEEX + HTTPDNS 最佳实践
由于WebView并未暴露处设置DNS的接口,因而在WebView场景下使用HttpDns存在很多无法限制,但如果接入WEEX,则可以较好地植入HTTPDNS,本文主要介绍在WEEX场景下接入HTTP ...
- android+php最佳实践视频,Android和PHP开发最佳实践 PDF 第2版
php服务器,java服务器,android,ios开发兼容的3des加密解密, php ?phpclass DES3 {var $key = "my.oschina.net/penngo? ...
- Android应用性能优化最佳实践.2.3 布局优化
2.3 布局优化 布局是否合理主要影响的是页面测量时间的多少,我们知道一个页面的显示测量和绘制过程都是通过递归来完成的,多叉树遍历的时间与树的高度h相关,其时间复杂度为O(h),如果层级太深,每增加一 ...
- 带你学开源项目:Meizhi Android之RxJava Retrofit最佳实践
如果你对开源项目分析感兴趣,欢迎加入我们的android-open-source-project-cracking 原创地址:http://www.jianshu.com/p/47e72693a302 ...
- Android组件化方案最佳实践
舞动着键盘和鼠标,我誓言要把这个世界写的明明白白 本文出自门心叼龙的博客,属于原创类容,转载请注明出处.https://blog.csdn.net/geduo_83/article/details/8 ...
最新文章
- 上传图片到第三方服务器
- java 热替换_class卸载、热替换和Tomcat的热部署的分析
- 模拟计算机病毒效果 js,用户登录模拟效果(原生js实现)
- 二叉查找树的Java实现
- PHP提取中文首字母
- day8网络编程,面向对象1
- 如何用git将本地项目push到GitHub上?
- 比目鱼搜索不能用了_win10搜索功能失效解决办法
- php正在尝试获取中非对象的属性_PHP7-2: 面向对象开发
- 【跃迁之路】【736天】程序员高效学习方法论探索系列(实验阶段493-2019.2.26)...
- 关闭后天 树莓派_树莓派|如何打开和关闭树莓派(绝对新手)
- 已有的事,后必再有。已行的事,后必再行。
- 根据具体地址计算经纬度
- mysql经纬度查范围内_sql语句查询经纬度范围
- 第五章 Spring Boot的数据库编程
- 企业微信支付功能怎么开通?
- Sql Server 2012完全彻底卸载教程
- 10.【CSS定位】:position、z-index、dispaly(none)、visibility、overflow hot new 模块 + 淘宝焦点图布局 +土豆网鼠标经过显示遮罩
- MP2451的应用电路
- python编程工时计算_Python项目:工作量计算器