Android架构纵横谈之——软件自愈能力 (1)
By 宋宝华
笔者决定,从今天开始,连载Android架构纵横谈系列。之所以叫纵横谈而不是叫别的题目,是因为整个系列是横着竖着乱弹琴,可以说是阴阳不分,黑白颠倒,望湘园里望湘园。我不谈任何一个小的点,比如启动过程、某个HAL移植、一个具体的native service或者Java service,我要谈的是横穿在其中的设计思想,因此,我谈的任何一个方面,都有可能涉及到Android从内核到应用的所有层面。
欢迎广大读者通过本博客交流,也可透过我的新浪微薄“@宋宝华Barry”讨论,亲,记得给好评喽!这个纵横谈既然决定乱弹,我们就不要那么严肃了,人民邮电出版社的老黄让我在《Linux设备驱动开发详解》里一直严肃着,让我装深沉,我郁闷啊,我独立的人格不为人们所理解啊。这个系列没人管,我们放开了整。《Linux设备驱动开发详解》曾经是年度10大畅销书啊,这个系列怎么也是年度10大瞎扯吧?
今天我们要整的是Android软件架构的超强自愈能力。自愈说白了,就是不小心被人k了,不进医院,自己躺了几天,并且辅助心灵阿q精神胜利疗法, 就又活蹦乱跳了。作为一个丝,咱们也只能这样了。咱们像小强一样活着,不断自愈。Android 估计也是个资深丝啊,它可以说处处都自愈 。你想啊,一个Android,啥都要整啊,里面多少组件啊,zygote啊,Dalvik啊,systemserver啊,各种service和框架啊,你妹的,丈母娘要买房,老婆要买车,随时要跪搓衣板,不具备自愈能力还能混吗?
说到这里,我们要稍微严肃点,这边开始严肃认真地进行打劫活动。自愈能力,其实是电信、工控、航天等嵌入式系统的基本要求,Android 作为大型软件,挂的时候我们往往看到一个桌面退隐江湖,新的桌面马上起来,而不是直接死机了。死了个东方不败,又来个任我行啊,这就是Android的江湖规则。自愈极其重要,我们平时说的看门狗就是典型的自愈方式之一。看门狗干什么的,就是在那蹲点,情况不对比如动车要撞了,就开始“汪汪”了。没有看门狗是不行的,如果神九的软件跑飞了,不恢复回来,那我们的宇航员就变太空垃圾了。有人要问了,软件不跑飞不就行了吗?软件不跑飞,我已经失业,哪里还有机会来这里纵横乱弹琴呢?
Android里面有几个地方都有东西“蹲点”,虽然不是明确的看门狗。
第一只狗:带你去投胎
Android的第一只狗在init进程里面,init进程会通过捕获SIGCHLD得知其子进程的死亡,并据情况决定是否重启之。记住,在Linux的世界里,在子进程死亡的时候,父进程会收到一个SIGCHLD信号,而后父进程通过wait()系统调用,清理子进程僵尸。大家都知道,一个进程死亡的时候,如果它还有子进程,典型地,子进程会被托孤给init进程,这种情况非常普遍,所以任何一个Linux系统,它的init程序,少不了要做一件事情,就是反复通过wait()清理僵尸,否则Linux系统就会尸横遍野,整个一部生化危机啊有木有?Linux是个怎样残酷的世界啊,我艰于呼吸视听啊,哪里还能有什么言语?永远都是白发人送黑发人,父进程清理子进程。
Android的init进程为SIGCHLD绑定了信号处理函数sigchld_handler(),并创建了一个socket用于接收该函数中发送的socket消息。sigchld_handler()函数只是简单的派送一个消息到该socket: