考察内容:

  • 了解如何使用系统服务
  • 了解系统服务调用的基本原理
  • 了解服务的注册原理

如何使用系统服务?

@Overridepublic Object getSystemService(String name){  return SystemServiceRegistry.getSystemService(this, name);}static Object getSystemService(ContextImpl cts, String name){  ServiceFetcher<?> fetcher = SYSTEM_SERVICE_FETCHERS.get(name);  return fetcher != null? fetcher.getService(ctx): null;}public final T getService(ContextImpl ctx){  final Object[] cache = ctx.mServiceCahe;  synchronized(cache){    Object service = cache[mCacheIndex];    if(service == null){      service = createService(ctx);      cache[mCacheIndex] = service;    }    return (T)service;  }}

例如,PMS的注册:

registerService(Context.POWER_SERVICE, PowerManager.class, new CachedServiceFetcher<PowerManager>(){  @Override  public PowerManager createService(ContextImpl ctx){    IBinder b = ServiceManager.getService(Context.POWER_SERVICE);    IPowerManager service = IPowerManager.Stub.asInterface(b);    return new PowerManager(ctx.getOuterContext(),service, ctx.mMainThread.getHandler());  }});  ...}public static IBinder getService(String name){  try{    IBinder service = sCache.get(name);    if(service != null){      return service;    }else{      return getIServiceManager().getService(name);    }  }catch(RemoteException e){    Log.e(TAG, "error in getService", e);  }  return null;}

如何注册系统服务?

public static void addService(String name, IBinder service){  try{    getIServiceManager().addService(name, service, false);  }catch(RemoteException e){    Log.e(TAG, "error in addService", e);  }}

什么时候注册的系统服务?

(SystemServer启动的时候)

独立进程的系统服务

例如:surfaceflinger——它是native实现的一个系统服务

service surfaceflinger /system/bin/surfaceflinger  class core  user system  group graphics drmrpc  onrestart restart zygote  writepid /dev/cpuset/system-backgroud/tasks

其入口函数:

int main(int, char**){  //ProcessState一个进程类的单例,其构造函数中会启用binder机制,  //包括打开binder驱动、映射内存、分配缓冲区等  sp<ProcessState> ps(ProcessState::self());  //启动binder线程  ps->startThreadPool();  //创建一个SurfaceLinger对象,并初始化  sp<SurfaceFlinger> flinger = new SurfaceFlinger();  flinger->init();  //将服务注册到ServiceManager  sp<IServiceManager> sm(defaultServiceManager());  sm->addService(serviceName, flinger, false);  //进入loop循环  flinger->run();  return 0;}
sp<IServiceManager> defaultServiceManager(){  if (gDefaultServiceManager != NULL) return gDefaultServiceManager;  {    AutoMutex _l(gDefaultServiceManagerLock);      while (gDefaultServiceManager == NULL) {        gDefaultServiceManager = interface_cast<IServiceManager>(                ProcessState::self()->getContextObject(NULL));        if (gDefaultServiceManager == NULL)          sleep(1);      }  }    return gDefaultServiceManager;}

无论是在SystemServer里的服务还是单独进程的系统服务都要向ServiceManager注册,这样应用才能使用对应的服务。——这也就是所谓的“开放”

启动binder机制

  • 打开binder驱动
  • 映射内存,分配缓冲区
  • 启动binder线程,进入binder loop

回归:你知道怎么添加一个系统服务吗?

Why? ——为什么要添加系统服务?

  • 目标就是给别人用

How?——怎么样能让别人用?

  • 启动binder机制——这样就能进行IPC通信
  • 注册开放出去——这样别人就能找到它

What?——具体有哪些事要干?

添加系统服务的时机?

  • 如果服务是准备跑在SystemServer里面:
    代码就在加在SystemServer启动系统服务部分;
  • 如果服务是准备跑在单独的进程:
    a)在init.rc中修改配置
    b)有main入口函数
    c)编译配置
    d)安全配置

服务端要做哪些事?

启用binder机制

应用端要做哪些事?

注册一个ServiceFetcher——方便其它应用调用

更多相关文章

  1. Android(安卓)studio Gradle download 文件 路径
  2. Android之AlarmManager
  3. Android之判断当前指定App是否在前台
  4. Android(安卓)Service小记
  5. Android获取手机系统版本等信息的方法
  6. Android系统通用技巧合集
  7. CentOS7上编译Android系统
  8. Android(安卓)一些指令
  9. 安卓AIDL跨进程间通信

随机推荐

  1. Android(安卓)json知识汇总
  2. android下tcp之client测试
  3. 【Android】播放提示音
  4. android中简单的listview代码
  5. Android源码中的单例模式android.util.Si
  6. 向Button上添加OnclickListener的另一种
  7. Android(安卓)ScrollView滑动到顶部和滑
  8. android之PULL解析xml文档
  9. android点滴3
  10. 【Android】以BaseAdapter做适配器的List