Android 10 Scoped Storage

为什么会有这么多文件夹?

这些文件夹到底是干嘛的?

这个 app 我明明已经卸载了,为什么还有残留文件?

这些我看不懂的文件夹,到底能不能删除?

万一删除后我手机变砖了怎么办?

在该问题下面,得票最高的回答中的第一句话直中要害:因为开发者不遵守规范

今年发布的 Android 10 引入了全新的 Scoped Storage,恰巧 Android Dev Simmit 上面也提到了相关的内容,我会结合大会中的讲解以及我自己的理解,为大家带来 Scoped Storage 的介绍,以及作为开发者来说,哪些变化是需要我们注意的。没关注的小伙伴记得关注订阅鸭!如果觉得这些文章有点意思,记得分享转发评论点赞鸭!

我们回到最开头的问题:为什么 Android 系统文件夹如此混乱?那是因为一旦 App 拿到了 WRITE_EXTERNAL_STORAGE 这个权限之后,就可以在你的根目录下面肆意妄为的建立无数文件夹,根本原因就是因为开发者不遵守规范。

正确的规范

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

根据官方文档上面的介绍,我们有四种方式存储数据和文件:内部存储、外部存储、SharedPreferences 和数据库。今天我们所关注的地方是上图中画红框的两个,即内部存储和外部存储。为了防止有些同学不清楚这两个存储的定义和目的,我帮大家简单回顾一下。

内部存储

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

内部存储目录主要分为 4 部分,如上图所示。但我们常用的是文件目录和缓存目录,在 Kotlin 中可以分别通过 filesDir 和 cacheDir 获得。

内部存储用来存储应用的私有文件,且通常是应用的功能相关的必要文件。

其他应用(和用户)不能访问这些文件(除非拥有 Root 访问权限)。如此一来,内部存储便非常适合保存用户无需直接访问的内部应用数据。在文件系统中,系统会为每个应用提供私有目录,您可以在该目录中整理应用所需的任何文件。当用户卸载您的应用时,保存在内部存储中的文件也将随之移除。

同时内部存储中的缓存目录,帮我们暂时保留而非永久存储某些数据。系统会在内部存储空间不足时,通过删除这些缓存文件以回收空间。

内部存储目录对应的路径为 /data/data/<包名>/files

内部存储缓存目录对应的路径为 /data/data/<包名>/cache

外部存储

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

存储于外部存储中的文件意味着,这些文件不是应用程序中功能运行时的必要文件,但从技术上讲用户和其他应用程序都可以访问这些文件,但它们无法为应用程序外部的用户提供价值,此目录可视为内部存储的补充方案。

外部存储对应的路径为 /storage/Android/data/<包名>/files

根据上面的定义,无论内部存储或者外部存储都应该只保存与我们自己的 App 有关联的数据。例如使用内部存储保存用户信息、使用外部存储保存只有本 App 才能打开的专门格式的文件。需要注意当用户卸载 App 的时候,内部存储和外部存储都会被自动删除。

针对用户行为产生的文件,例如下载的图片、保存的视频等。Google 要求我们保存在系统公共目录中,这样别的 App 也能访问到这些文件,例如 Pictures、Downloads。这里我们把用户行为产生的文件分为两大类:多媒体文件和其他文件,官方推荐多媒体文件存放在系统中有专门的目录:Music、Movies、Pictures等,其他文件一律保存在下载目录中:Downloads。

所以到这里我想问一下那些 App 的开发者,你们在开发的时候有读过官方文档吗?

前面我也讲到了在 Android 10.0 之前,存储文件需要获取 WRITE_EXTERNAL_STORAGE 权限,得到这个权限之后,App 就可以通过 Environment.getExternalStorageDirectory() 在根目录下面随意创建文件了,但是(划重点!)Android 10.0 之后就不行了,没想到吧?

Android 10 Scoped Storage

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 Android 10 上面,上图中的两个访问根目录的 API 已经被弃用了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

执行上面这段创建文件夹的代码根本不会其任何作用,这样 App 就再也无法肆意创建文件夹了。我们之前说了存储文件需要 WRITE_EXTERNAL_STORAGE 权限,在 Android Q 中我们操作内部和外部存储时,不再需要声明任何权限,可以直接使用。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

结尾

如何才能让我们在面试中对答如流呢?

答案当然是平时在工作或者学习中多提升自身实力的啦,那如何才能正确的学习,有方向的学习呢?为此我整理了一份Android学习资料路线:

这里是一份BAT大厂面试资料专题包:

好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划。来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

计划及职业规划。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
  • 10
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值