我又发现了Android13的一个bug

💡 原文中文,约3200字,阅读约需8分钟。
📝

内容提要

这篇文章讨论了一个SDCard格式化的问题,通过深入分析发现是由于格式化后SDCard的路径变化导致的。解决方案是在格式化完毕的代码处重新获取磁盘信息或者重新初始化StorageDashboardFragment。作者还发现了一个与此相关的Android bug,但Google表示不会修复。尽管这个问题影响不大,但仍让人感到无奈。

🔎

延伸解读

问题根源:格式化后SDCard路径变化

文章指出,SDCard格式化后,其路径会发生变化,而路径由磁盘的fsUuid组成。正常情况下,fsUuid应保持不变,但格式化后却变了。这导致Settings在格式化完成后,仍使用旧的路径去文件系统查询磁盘信息,结果找不到,从而获取的磁盘大小为0。

技术细节:statvfs与UnixFileSystem

底层通过UnixFileSystem的getSpace0方法调用statvfs函数获取文件系统信息。statvfs结构体包含文件系统块大小、总块数、剩余块数等字段。当路径变化后,statvfs无法找到对应磁盘信息,导致返回值为0。这提醒开发者在处理文件系统相关需求时,需注意路径的有效性。

解决方案与局限性

文章提出两种解决方案:上层在格式化完毕后重新获取磁盘信息或重新初始化StorageDashboardFragment;底层修改vold格式化逻辑,使fsUuid不随机分配。但两者都涉及修改Google原生代码,不够优雅。作者怀疑这是Android自身的bug,并找到了AOSP中相关提交,但Google表示不会修复。

影响与启示

该bug从Android 7.0开始存在,影响后续版本,但影响不大,开发者可自行修复。文章提醒开发者,在遇到类似问题时,可查阅AOSP提交记录和issue tracker,确认是否为已知问题。同时,也反映了Android碎片化问题,以及Google对非紧急bug的处理态度。

❓

Q&A

Android13中SDCard格式化后出现什么问题?

格式化后SDCard的路径发生变化,导致无法获取磁盘大小,结果为0。

如何解决Android13中SDCard格式化后的路径问题?

解决方案是在格式化完毕后重新获取磁盘信息或初始化StorageDashboardFragment。

这个SDCard格式化的问题是Android的bug吗?

是的,这个问题被怀疑是Android自身的bug,自Android7.0以来一直存在。

Google对这个SDCard格式化的bug有什么回应?

Google表示不会修复这个问题,尽管它从Android7.0开始就存在。

SDCard格式化后如何获取磁盘信息?

可以使用statvfs函数获取文件系统信息,但需注意路径变化问题。

这个问题对开发者有什么影响?

尽管问题存在,但影响不大,开发者可以自行修复。

➡️

继续阅读