andriod cs 架构

android中大量采用cs结构来实现应用层和底层服务交互,比较典型的就是android系统中通过getSystemService获取的各类服务。如ams,pms,这些服务是运行在systemserver进程中的,
对于systemserver进程在android中的地位是相当重要的,即由Zygote进程(fork)出来的第一进程,而Zygote进程就是由linux的init进程fork出来的,我们可以看到在init.rc中有如下:

    service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server  
        socket zygote stream 666  
        onrestart write /sys/android_power/request_state wake  
        onrestart write /sys/power/state on  
        onrestart restart media  
        onrestart restart netd  

这是android从linux真正转向andriod定义层的关键点,我们可以看到app_process(App_main.cpp)就是zygote实际的执行文件。socket关键字表示这个zygote进程需要一个名称为”zygote”的socket资源,这样,系统启动后,我们就可以在/dev/socket目录下看到有一个名为zygote的文件。这里定义的socket的类型为unix domain socket,它是用来作本地进程间通信用的。这里为什么要产生这么一个socket,原因在于AMS需要通这个socket来和zygote进程通信请求fork一个应用程序进程。
我们回到systemserver中,因为AMS相比其他系统服务比较特殊(比较直观的IActivityManager不是aidl而是java这样我们cs跨进程通信就必须在ActivityManagerNative中实现的代理实现类(ActivityManagerProxy)采用binder进行进程通信了,而非像aidl中那样系统帮我们做了),所以下面我们提到的都是围绕ams服务来的,因为systemserver中通过ServiceManager.addService添加很多的系统服务。而我们使用的getSystemservice方法是来自于ContextImpl类中的,ContextImpl是如何做到AM和AMS之间的关联呢。原因在于ContextImpl中维护了一个hashMap用来存储serviceName和ServiceFetcher的键值对。内部类ServiceFetcher的createService用以返回创建的am对象,比较特殊的是am在构建时不需要传入ams对象,因为ams可以通过ActivityManagerNative的getDefault的方法拿到该对象。而且是作为一个单例来返回其IActivityManager接口对象。

你可能感兴趣的:(android)