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接口对象。

更多相关文章

  1. Android(安卓)okhttp + rxJava + retorfit2使用心得
  2. The application has stopped unexpectedly
  3. Android进程保活招式大全
  4. Android的OkHttp包中的HTTP拦截器Interceptor用法示例
  5. 页面跳转与传值(Activity跳转与传值)
  6. Android(安卓)Intent 传递二进制数值的两种方法
  7. 让Android应用程序支持安装到SD卡
  8. Android的平台架构
  9. Android(安卓)ROM开发之预制GMS

随机推荐

  1. Android的应用程序框架
  2. android的edittext怎么设置不默认被选中
  3. PhoneGap Android(安卓)hello android:mi
  4. PhoneGap android环境设置
  5. Android(安卓)Bundle类别
  6. 《Android学习指南》目录
  7. 2011.08.15——— android audioManager
  8. ListItem更改背景色
  9. Android(安卓)GCM使用
  10. android 动画