android framework 面试--如何添加系统服务

目标:

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 资料就好哈。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值