Skip to content

排查挂载异常问题

GuhDoy edited this page Jun 24, 2023 · 5 revisions

有时,您会在应用中看到挂载异常提示。然而,由于篇幅原因我们无法在应用中给出清晰的解决方案,因此我们将在此页面说明如何解决这些问题。这样的开场白看起来无懈可击,但是也许会有人反驳:为什么 Cleaner 要提示挂载异常并让用户来解决,而不是自动处理?我知道您很急,但是这个问题得留到最后回答。

为了解决挂载异常,我们非常有必要了解造成异常的原因,因此您恐怕不宜在应用列表处看到挂载异常后不停地刷新并希望问题能奇迹般地解决,或是到处跟人抱怨 Cleaner 应用质量不佳。我们推荐的做法是点击进入编辑应用挂载规则的界面,查看其中的运行状态部分以了解造成问题的原因,然后对照此页来排查问题。

为了理解造成异常的原因,我们非常有必要先说明 Cleaner 存储重定向的工作过程。也许您会误认为 Cleaner 会接收所有应用的文件操作请求并找到存储重定向后的路径,但是如果您看了挂载的介绍页,您也许能明白这些都是由系统内核中的 VFS 完成,而不是 Cleaner 应用。Cleaner 存储重定向的核心部分其实很简单——在应用启动时调用挂载接口,这就是全部了。

接下来我们对各个异常分别作说明:

未侦测到进程启动

此问题的出现有两种可能的原因:

  • 在未安装 Zygisk 模块时,侦测进程启动依赖日志猫,而日志猫有可能主动退出。如果您确定不打算安装 Zygisk 模块,则需要在每次出现此问题时手动重启 Cleaner 服务。
  • 如果您发现所有应用都出现此问题,并且已排除上一条原因,那就说明 Cleaner 尚未支持您的系统。我们承诺支持的安卓系统版本为 Q 及以上,如果您遇到此问题且系统版本符合条件,可以创建议题告诉我们。

挂载失败

此问题的出现有两种可能的原因:

  • Cleaner 挂载时,需要执行一系列的系统调用,而系统调用有可能会失败。这种可能发生概率很小,可以忽略,而且恐怕必须忽略,因为强行解决有可能导致整个系统死锁。
  • 如果您发现所有应用都出现此问题,并且手动重新挂载也无济于事,那就说明 Cleaner 尚未支持您的系统。我们承诺支持的安卓系统版本为 Q 及以上,如果您遇到此问题且系统版本符合条件,可以创建议题告诉我们。

无法检查挂载状态

这是一个竞态条件问题,发生在应用的部分进程正在创建或销毁时。您可以忽略此问题,或者过几秒再检查。

创建挂载文件夹失败

Cleaner 挂载时,需要先保证来源文件系统都是文件夹,并在挂载点处创建文件夹。如果此过程失败则会出现此问题,您需要检查这些地方是否被文件占用。

挂载的文件系统(来源)被删除

这说明来源文件夹被删除。如果应用关闭时这些文件夹为空,Cleaner 服务会自动删除它们,所以建议您不要手动删除这些文件夹。另外 Cleaner 的清理功能会自动排除这些文件夹。

重新挂载

造成此问题的原因有很多。

  • 最直接的原因就是有其它程序调用了 mount 或者 umount2
  • 文件系统可以让挂载点失效。例如当您删除挂载点处的文件夹时,挂载就会消失。
  • 对于安卓 S 及以上用户,如果在未激活媒体存储设备管理的情况下开启了记录应用专属存储空间中的文件操作选项,会有很大概率出现此问题。

挂载信息的解析由 Cleaner 自己实现,旧版本 Cleaner 在部分情况下显示的检查结果不正确,新版本虽然已经修复了此问题,但是仍有可能在挂载异常的情况下错误显示挂载正常。如果有必要,您可以自行检查 /proc/ + pid + /mountinfo 文件。

为什么 Cleaner 要提示挂载异常并让用户来解决,而不是自动处理?

现在我们可以回到开头提出的问题了,不自动处理有以下原因:

  • 绝大多数挂载异常正是由用户的不当操作造成的,因此由用户来解决理所应当。而剩下的小部分是兼容性问题,需要我们更新适配,采用 Google Play 更新机制以外的方式更新违反开发者计划政策,因此不能自动处理。
  • 部分问题的自动解决需要更多的权限,而出现这些问题的原因也是用户没有给予足够的权限,这本质是同一个问题。换言之,对于这部分问题,您想要的“自动解决方案”就是安装 Zygisk 模块
  • 对于部分问题是否有亡羊补牢式的解决方案是非常令人怀疑的,而且就算有,也肯定不如防患于未然。