63507-tkbub03yxp.png
本文已获得授权
作者CA@Anm718


应用运行时,不可避免的要产生数据与缓存。这时自然需要一个目录,给应用存放这些文件。
根据Android机制,应用有两个目录存放数据与缓存,一个是加密的隐私数据,在 root/data/data/应用包名/ 下,此目录为应用专有,其他应用无权访问,除非是root级权限。
另外一个是 root/storage/emulated/0/Android/data/应用包名/ 下,这个目录通常是放置缓存,以及数据包(常见于游戏)。这个目录没有加密,用文件管理器就可以查看。这两个目录是属于应用自己的私人空间,应用无需用户授权,就拥有读写权限。

为便于下文理解,这里引入两个概念:私有存储和公开存储。
上文介绍的两个目录就是私有存储,相当于应用自己的地盘,在都没有权限的情况下,应用只能控制自己地盘上的文件,而不能访问其他应用私有的文件,以及公开存储,相对较安全。

而公开存储则是存储根目录 root/storage/emulated/0 下除Android文件夹外,其他文件、文件夹,这里是开放场地,这里的文件是公开的,可被所有应用调用API捕获;如果获得了存储权限,便可以自己读写所有文件,而不需要调用文档。

接着解释Android系统的存储权限(STORAGE)。应用在申请权限时,通常会有下面这个界面
13642-5bfsojj5mvq.png
文章开头提到过,私有存储空间不需要权限,这个存储权限是为读写公开存储而设计的。一般有一下几类应用需用到存储权限:

①下载器类,如Adm,下载文件是为了让用户使用,所以不能放进私有文件夹;一些浏览器自带下载功能,比如夸克浏览器,它也需要存储权限(有人反映并不规范,那个下期图文再讲);还有通讯聊天工具也有下载功能,如tg、wechat,他们接收并保存图片、视频时也需要存储权限。

②图库类,这里指所有的看图软件,它要查看公开存储中所有图片,当然需要权限。

③播放器类,音乐播放器,如163music;视频播放器,如mx player,它们要读取媒体文件,需要存储权限。

④编辑、创作类,如Microsoft office,纯纯写作,snapseed。这些应用打开和保存的文档、图片,都是在公开存储的,只有缓存在自己的私有目录。

⑤文件管理器类。这个应该是不需要解释的吧,毕竟想要读写文件,就必须要有权限。re管理器,mix plorer、es文件浏览器等。

⑥SDK需求。如果应用接入的SDK需要存储,那么应用就必须申请存储权限,无论是否需要。

——————

对于存储权限有许多误解,下面就来一项项解释:

1.所有应用都需要存储权限。

很多人常用的软件,在启动时都会要存储权限,不给便不能运行,虽然如今这种情况有改善(我上期图文有介绍),但应用的许多功能都受限,这使得人们认为应用必须要存储权限。其实并不是,应用可以在 私有存储 存放数据,在运行基本功能时 没必要请求存储权限,例如kernel adiutor(内核调控),via(浏览器),devcheck(硬件检测),哔哩哔哩(视频网站客户端),这些应用在无存储权限的情况下可以完全正常运行,不影响功能。

2.存储权限只有一个。

在应用请求授权时,只会弹出一个授权框,作为一个权限申请。但实际上存储权限是两个,一个WRITE,一个READ,读写权限是分开的。这个从app ops中就可以看到。这就有两种授权方案,第一种是只读,第二种是读写。但申请只读权限的应用很少.
3.不用存储权限就不能读取公开目录文件。

存储空间权限只是限制应用的写入、自行读取权限,在应用拉起文档时,可由用户手动选择读取的文件。不好理解的话,可以尝试一下,关掉浏览器的存储权限,打开一个搜图网站,上传本地图片。当然这样效率很低,所以大量访问媒体的应用(如图库播放器)还是需要存储权限。

via无权限搜图

此外还有一种特殊情况,就是应用以root身份运行,root权限高于一切,系统级别的限制便失去了意义。

——————

以上是本期图文的所有内容,喜欢的老哥 点赞、转发、评论素质三连