Android系统中的Binder通信机制分析(二)--system_server

声明

  • 其实对于Android系统Binder通信的机制早就有分析的想法,记得去年6、7月份Mr.Deng离职期间约定一起对其进行研究的,但因为我个人问题没能实施这个计划,留下些许遗憾…
  • 最近,刚好在做公司某项目中一个难题就是关于Binder的,于是想借此机会对其进行尽量深入的分析,以算是弥补过去的遗憾吧。而且,一年后我对于Android系统的理解,比去年确实加深了很多;
  • 文中参考了很多前辈们写的书籍及博客内容,可能涉及的比较多先不具体列出来了,等有时间再添加进来;
  • 本文使用的代码是LineageOS的cm-14.1,对应Android 7.1.2,可以参考我的另一篇博客:如何下载Nexus5的LineageOS14.1(cm-14.1)系统源码并编译、刷机

0 写在前面的

    上一篇提到过,Android的系统服务运行在system_server进程的上下文中,因为大部分框架服务十分的简单,并不需要一个专门的进程,只需要以线程的形式承载就够了。system_server就被设计为这些线程的宿主进程。

    system_server是个容器进程。在Android中这样做甚至带来了一个更为重要的好处:尽管Dalvik虚拟机己经为共享内存做了大量的优化,但是在由同一个虚拟机可执行文件启动的另一个进程中运行各个服务,更有利于保护各类资源。但有一个风险就是:其中任何一个服务出现错误,都会波及运行在system_server中的其他服务。然而,因为能运行在system_server中的只有Android系统的服务,厂商提供的或者其他什么服务根本进不来,所以只有系统代码稳定就不会出现问题。

1 system_server启动流程

    我之前在写这篇博客:[日更-2019.4.22、23、24] cm-14.1 Android系统启动过程分析(三)-SystemServer进程启动过程时,比较详细地分析了system_server启动流程及其所作的工作。system_server在分别启动引导服务、核心服务、其它服务之后将会进入一个无限循环Loop中,在Loop中不但轮询它的文件描述符(特别是它的Binder句柄)以获取输入消息,这些消息就会被分发给它们各自对应的目标服务处理。

2 看下我得Nexus5 cm-14.1系统中system_server里的线程

    在我得Nexus 5 cm-14.1系统中,看下system_server进程PID是多少,此时PID为811:

root@hammerhead:/proc # ps | grep system_server
system    811   178   1035720 70016 ffffffff 400c473c S system_server

    进入/proc/811/task目录下,列出的所有线程就是各个系统服务所属的线程了:

root@hammerhead:/proc/811/task # ls
1015
1018
1039
1040
1041
1057
1097
1105
1107
1135
1140
1142
1144
1156
1157
1198
1200
1202
1203
1206
1240
1304
1516
1517
1585
1665
2388
3179
3187
3380
811
815
816
817
818
819
820
821
822
823
824
825
826
835
836
837
838
840
841
842
843
844
845
873
875
876
877
886
887
959
960
962
963
964
965
966
967
968
969
970
971
972
973
974
995

    看来这篇只能靠这一堆线程号来撑场面了,具体哪个TID对应哪个系统服务线程貌似没有办法确定,不过所有的系统服务都在这里面了。

Enjoy it

发布了48 篇原创文章 · 获赞 5 · 访问量 7788

猜你喜欢

转载自blog.csdn.net/Xiaoma_Pedro/article/details/103919488
今日推荐