Android 系统因挂载u盘导致的系统黑屏解决方案

Android 系统 因挂载U盘导致的系统重启

原因

在 Android 系统中,vold 进程是进行挂载u盘的主要模块,vold 进程通过和 StorageManagerService 协同协作,完成u盘的挂载。那么为什么会因为U盘挂载而导致系统黑屏重启呢?这里我们引入Watchdog机制,当Watchdog机制检测到vold 进程中的某一流程持锁超60秒,就会重启系统导致系统黑屏重启。
那么为什么会持锁超60s呢?原因在于U盘本身老化,存在坏快,vold 在对U盘的虚拟节点做IO系统调用时,会阻塞住,从而导致持锁超时,这个是和硬件强相关的,如果不做处理,一直使用u盘,那么迟早会发生这个问题的。

解决方案 一

超时检测

首先vold 挂载u盘分了很多步骤,他都是通过在vold中fork一个子进程去对u盘本身进行检查以及修复的,这个检查的过程,也是导致系统黑屏重启的元凶。所以,如果我们想要避免黑屏重启,那么我就就需要细分时间,时检查过程,不超过60s。
那么如何实现这个问题呢?上面提到了fork进程,那么也就是多进程,所以我们可以利用多进程并行的性质,制定超时机制。原生的vold 进程fork的子进程之后,vold 在wait 子进程,保持同步,但正是这种原因导致对老化或者损坏的u盘做检查修复流程超时,现在我们父进程可以不wait子进程,给子进程设置一个timeout,当子进程处于timeout时间内,我们父子进程通过循环等待保持同步,超出timeout,解除同步,执行后续流程,将变成僵尸流程的子进程交由init去回收掉。

效果

不一定能把所有case都兜住底,因为这个超时时间是一个经验值,设置太短不行,太长也不行,但可以极大的降低挂载引起的黑屏重启。

风险

由于修改的是vold 进程,vold 在Android 系统中的地位不言而喻,非常的重要,且危险,负责文件系统的挂载加密等各种功能,修改不甚可能会造成更严重的危害。
且修改时,需要考虑数据状态同步等信息,复杂度高。

推荐指数 ***

解决方案 二

从vold 中解耦U盘挂载相关的逻辑放到一个新的进程kvold 且 适配 编写适配kvold 的 kStorageManagerService
效果

目前面临这种问题,我们也是这样做的,效果还不错,由u盘引起的黑屏重启问题得到解决,但是和u盘硬件强相关的问题还是无法解决,比如检测不到u盘。

风险

由于是自己编写的kvold ,所以稳定性不一定比原生的vold那么稳定,所有得对一些崩溃场景,进行应对,保证崩溃后重新拉起,还是能正常工作。

推荐指数 *****

你可能感兴趣的:(Andorid,android,linux,c++)