【Android话题-2.3系统服务】你知道怎么添加一个系统服务吗
16lz
2021-01-24
考察内容:
- 了解如何使用系统服务
- 了解系统服务调用的基本原理
- 了解服务的注册原理
如何使用系统服务?
@Overridepublic 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——方便其它应用调用
更多相关文章
- Android(安卓)studio Gradle download 文件 路径
- Android之AlarmManager
- Android之判断当前指定App是否在前台
- Android(安卓)Service小记
- Android获取手机系统版本等信息的方法
- Android系统通用技巧合集
- CentOS7上编译Android系统
- Android(安卓)一些指令
- 安卓AIDL跨进程间通信