网站客服:zx81024163 |

Android存储挖坑记

2024-01-23 03:01:29发布    浏览465次    信息编号:94326

友情提醒:凡是以各种理由向你收取费用,均有骗子嫌疑,请提高警惕,不要轻易支付。

Android存储挖坑记

原来的:

昨天的文章得到了很多同学的支持。 除了给我留言的同学之外,还有很多人在后台给我留言。 我这才发现,很多跳水学员一直在默默支持我。 我很受感动和鼓励。 由于我的性格,我不太擅长与读者互动。 有时候,虽然很多人看我的帖子,但是留言的人却不多。 但其实我知道大家都在默默关注,这就足够了。 我更希望这篇文章能够被更多的人传播,这对我和作者都是一种鼓励。 如果您觉得文章有帮助,不妨让更多人看到。 这也算是对我最大的支持了。

5月1日后的第一篇技术文章推送来自姚佳一。 本文对目前存储相关知识进行了梳理。 虽然时间不长,但我相信会对你有所帮助。 学习的往往是一个小知识点。 一颗一颗地吃完。 之前我还给大家推荐过一篇关于家居艺术的文章,没看过的同学也可以在这里看看。

最近在从事存储相关的业务,很困惑 /// 那是什么。 国内没有系统讲这个的好文章,所以我就挖了各种资料,整理了一下。

1. 对比

关于and,官方文档中有这么一段话,描述的很详细。 我翻译了一下:

所有设备都有两个存储区域: 和 。 它们的名字来自于早期的系统,当时每个人的手机都有一个内置的()小存储板(ie)和一个外置的()存储卡(ie)。 后来,一些手机开始将原来定义的“”,即内置存储分成两部分。 这样,即使没有外部存储,手机仍然有两个存储区域。 这两个存储区域的区别是:

信誉度

始终可用()

可能不可用,最常见的是当设备作为 USB 存储安装时

访问权限

App存储内容仅可由App本身(或共享uid的App)访问(Root除外)

应用存储内容全局可读

内容持久

应用程序卸载后应用程序存储内容消失

App卸载时,只有exist()路径下的文件会消失

适应情况

存储只能由应用程序本身访问的内容时的最佳选择

当您想要与其他应用程序共享存储的内容或将其传输到您的计算机,但又不想申请任何权限时,这是最佳选择。

注意:这里讨论的访问权限是应用程序路径下的权限。

总结起来,存储区域有几个好处:

可传输至电脑;

可以与其他应用程序共享;

4.4以后App路径(/data/包名)下读写不需要任何权限;

应用程序路径之外存在的文件不会随应用程序一起卸载。

相应地,也有几个缺点:

可能不可用;

将被其他应用程序读取;

在非应用程序路径中写入和修改文件需要权限。

1.1 权限

在App路径下(/data/data/包名下),App的读写操作不需要任何权限。 我们只需总结一下情况:

版本读取和写入

4.4以下

无需许可

需要申请GE

4.4及以上

无需许可

在App目录外写入需要申请GE

关于读权限,有这样一段话:

目前,所有应用程序都可以在不需要任何权限的情况下读取存储,但这种情况将来可能会改变。 如果要读取存储,最好申请E权限。 另外,写权限默认已经包含读权限。

一般情况下,当您使用任何文件管理器时,您点击的根目录就是您的存储。 你可以进入其下的应用程序目录,你会发现甚至可以看到每个包名下的文件。

1.2 多用户

系统4.2及以上版本引入了多用户机制。 您可能会在存储路径后面找到“0”/“1”字样(例如///0/)。 后面的数字代表用户。 主要用户后面是0。

2. 对比

这笔钱从哪里来? 其实一开始并没有考虑到这种区别,但是后来出现了一种情况,如上所述:

后来,一些手机开始将原来定义的“”,即内置存储分成两部分。

那么如果此时将SD卡插入手机中,岂不是多张卡了?

此时,与其分离的那块“ ”称为主存储( ),插入的外部存储称为副存储( )。

获取主存储路径的方法很简单,可以通过.()或.(null)来获取。

对于4.4及以上系统中的辅助存储路径,可以使用.(null)(注意末尾多了一个's'),它返回一个字符串数组。 第0个是主存储路径,第1个是辅助存储路径(如果有)。

在4.4及以下系统中,获取二级存储的方法是一个很大的陷阱。 我把我看到的方法一一介绍一下。

2.1 二级存储路径-

可以通过.()来获取,但遗憾的是,里面有价值的方法都被隐藏了。

幸好还有反思。 我们可以调用()函数。 返回的List中,主存储为第0个,辅存储(如果有)为第1个。

可以看到它是在.()中实现的。 可以说这个方法是目前最靠谱的。 通过系统获取挂载的设备,可以知道存储是否、是否、挂载状态等。

说到存储,由于 ROM 是各种奇怪的东西,它不可能是完美的。 如果反映的方法缺少变量、方法,或者有其他陷阱,就只能尝试其他方法来保底。

可靠性:99%

2.2 二级存储路径-读取配置xml

读取com...R.xml..xml可以获取系统信息,但是这个方法不行。 我们可以看一下源代码。

在6.0之前,我看到了上面的()函数。 它将在构造函数中被调用来读取xml文件。 但我们可以看到,它在变化时并不是动态写入的。

并且参考AOSP,这个xml文件存储的是厂商配置的分区,它根本无法更新存储的热插拔信息。

注意:该xml在6.0中被删除(参考AOSP)

可靠性:0%

2.3 辅助存储路径-挂载命令

在Linux shell下执行mount命令,遍历各个挂载点,找到辅助存储。

目前,它确实具有列出辅助存储的能力。 但是,许多挂载点将同时列出,包括系统挂载点。 似乎没有已知的可靠方法来准确找到辅助存储。 二级存储的命名不规范,枚举排除系统挂载点的方法不能保证100%的准确性。

可靠性:10%

2.4 二级存储路径-读取vold.fstab文件

解析/etc/void.fstab并找到辅助存储位置。

Vold()是层与层之间的桥梁,其信息维护在/etc/vold.fstab中。

乍一看,这似乎是一种奇怪的方法。 文件位置和信息可能会被各个制造商篡改,并且可能会出现瞬时不一致的情况。 不考虑它。 有兴趣的同学可以研究一下--vold。

可靠性:0%

总结

总结一下目前手机的存储方式:

6.0之前

在 6.0 之前,所有存储类型都是。 它支持多用户、模拟存储。 由于是MBR分区,因此存储容量为2TB。

最原始的版本是只有机身内置存储和现有的外部存储。 此时,主存储就只有一个了,确实如此。

( ) 正如我之前所说,留出一块来给予。 这个存储空间是在存储版本中“模拟”的。 所以可以看到主存储经常有这样的字样。 如果此时再插入一张SD卡,就会多一个存储空间。

6.0之后

一般情况下,它的存储方式和前面两种是一样的,但是有一种新的存储方式:

由于存在缺点(有时不可用、存储内容不受保护),6.0之后增加了更多的存储方式。

当系统采用某个存储区域时,会同时对其进行查看、格式化和加密。 格式化后为GPT分区,存储容量为9ZB。

当您在支持的手机上插入SD卡时,会提示您是否格式化并使用SD卡,或者正常使用它。

推荐一篇文章:

帖子从不同角度解释了,非常好!

提醒:请联系我时一定说明是从星空网上看到的!