主页 > 原创 > 由一句LOG引起的手机重启

由一句LOG引起的手机重启

如下图所示:

log

    在第41行出现了mSourcePathList.get(mIndex)的调用,而没有做出数组边界的判定,这在普通的程序中会导致程序抛出IndexOutOfBoundsException异常退出。

    而图中的这部分代码恰巧写在了framework/base/policy/src下,这些代码最终和system_server有所关联。抛出异常后system_server crash,当system server进程crash时, zygote进程会被杀掉,此后Zyogote进程和system server被重新启动。表现为开机动画重新加载,常被误认为开机重启。

    在init解析init.rc时,Zygote进程作为一个服务被定义,且被声明为自动重启。因此一旦Zygote进程退出,则init会收到子进程退出信号从而重新启动zygote服务,进而Zygote启动System Server。同样,在System server被Zygote作为子进程启动后,Zygote通过信号监听该子进程状态,一旦退出Zygote将会杀死自身等待init再次运行。另外system server进程将监听service manager进程,如service manager退出则杀掉自身从而导致zygote被重启。

    由以上信息可以看出,我们在写代码尤其是系统相关联的代码时,一定要注意异常的判断,即使是一句为分析提供便利的Log也可能引起严重的问题。尤其是Log本身不被设计为程序功能,所以更会使设计者忽略。综上,在我们提交代码时一定要注意Log是否必要,尽量不用或少用Log语句,避免类似情况发生。

发表评论

邮箱地址不会被公开。 必填项已用*标注