考察内容:
- 了解如何使用系统服务
- 了解系统服务调用的基本原理
- 了解服务的注册原理
如何使用系统服务?
@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——方便其它应用调用