目标:
1.了解如何使用系统服务
2.系统服务调用的基本原理
3.了解服务的注册
client通过serverManager 查询service 的binder ,然后再向server发起系统服务调用。
1.如何使用系统服务
public Object getSystemService(String name){
return SystemServiceRegistry.getSystemService(this,name);
}
static Object getSystemService(ContextImpl ctx,String name){
ServiceFetcher<?>fetcher = SYSTEM_SERVICE_FETCHETRS.get(name);
return fetcher!=null?fetcher.getService(ctx):null;
}
public final T getService(ContextImpl cts){
final Object[]cache =ctx.mServiceCache;
sychronized(cache){
Object service = cache[mCacheIndex];
if(service==null){
service = createService(ctx);
cache[mCacheIndex] = service;
}
return (T)service;
}
}
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());
}
静态代理 动态代理
ServiceManager 里面的函数
public static IBinder getService(String name ){
try{
IBinder service = sCache.get(name);//HashMap<String,IBinder> 系统在启动的时候,预先会在里面放一些东西,后面就直接获取
if(service!=null){
return service;
}else{
return getIServiceManager().getService(name);//ServiceManagerNative.asInterface(BInderInternal.getContextObject())
}
}catch(RemoteException e){
Log error
}
return null;
}
如何注册系统服务:
public static void addService(String name,IBinder service){
try{
getIServiceManager().addService(name,service,false);
}catch(RemoteException e){
Log error in add service
}
}
什么时候注册系统服务:
SystemServer 启动
1.启动binder机制
2.启动各类系统服务
3.进入Loop循环
独立进程的系统服务
service surfaceflinger /system/bin/surfaceflinger
class core
user system
group graphic drmrpc
onrestart restart zygote
writepid /dev/cpuset/system-background/tasks
int main(int,char**){
//进程的单利,里面能够打开binder
sp<ProcessState> pa(ProcessState::self())
ps->startThreadPool();//创建thread 线程池
sp<SurfaceFlinger> flinger = new SurfaceFlinger();
sp<IServiceManager> sm(defaultServiceManager());
sm-->addService(serviceName,flinger,false);
flinger->run();
return 0;
}
服务都要向serviceManager里面注册,才能让应用找到服务
跨进城通信:
打开binder驱动
映射内存,分配缓冲区
启动binder线程,进入binder loop
如何添加系统服务:
1.why 为什么它添加系统服务
2.how 怎么才能让别人用
3.waht 具体要做什么
添加系统服务的时机:如果添加的系统服务跑在SystemServer进程,那么需要在SystemServer 添加这个系统服务,addService。
如果独立进程,需要init.rc拉起这个服务,有自己的main入口函数,创建对应的binder 等,然后addService 将这个系统服务加入到SystemServer里面。
服务端要做哪些事情:
服务端要创建对应的binder,启用binder机制,服务初始化工作,将Binder 注册到SystemServer中。
客户端要做哪些事情:
context.getSystemService,主要为这个服务注册到serviceFetcher,也就是要调用getService的方式
这个是本人总结的,mkw的framework面试的资料,需要具体的视频和其他的资料,TB店铺 纳新工作室 中找framework 资料就好哈。