【Android话题-2.3系统服务】你知道怎么添加一个系统服务吗

考察内容:

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

如何使用系统服务?

@Override
public 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——方便其它应用调用

发布了106 篇原创文章 · 获赞 27 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/menghaocheng/article/details/104316165