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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值