Framework入门01-初识系统服务

1-1 谈谈对zygote的理解

(1) zygote的作用:1.启动SystemServer;2.孵化应用进程。

(2) 启动3段式:进程启动 =》准备工作 =》LOOP

(3) zygote进程启动之后做了什么?

Zygote的Native世界:为进入java做准备,1.启动虚拟机;2.注册jni函数;3.进入Java世界

Zygote的Java世界:1.预加载资源;2.启动systemServer;3.进入Loop循环,执行runOnce函数(ActivityThread.main)。

Zygote的IPC没有采用binder。

思考:

1.孵化应用进程这种事为什么不交给SystemServer来做,而专门设计一个Zygote?

2.Zygote的IPC通信机制为什么不采用binder?如果采用binder的话会有什么问题么?

1-2 说说Android系统的启动

(1) 系统进程有哪些? zygote,servicemanager,surfaceflinger,media,systemserver ...

(2) zygote的runOnce函数:1.从socker读取参数列表;2.fork应用,会返回两次(pid为0:在子进程执行;pid为其他值,在父进程(当前进程)执行);

(3) systemServer是怎么启动的?

startSystemServer

=> Zygote.forkSystemServer(...)

=> 在systemserve进程中执行(pid=0) handleSystemServerProcess(parsedArgs)

=> Runtimelnit.zygotelnit

=> commonlnit();//常规初始化 nativeZygotelnit();//启动bind机制,并且启动bind线程 applicationInit(argv,...);//调用java类的入口函数,即SystemServer.main函数

=> new SystemServer().run() : 为主线程创建mainLooper;加载共享so库;createSystemContext;(分3批)启动systemserver服务;进入loop循环。

(4) 系统服务是怎么启动的?主要关注2个问题:

1.系统服务怎么发布,让应用程序可见?答:将系统服务的binder注册到serviceManager。

2.系统服务跑在什么线程? 答;主线程(无);工作线程(DisplayThread,FgThread,ioThread,UiThread);binder线程(应用刚刚调用过来时在这个线程内)。

(5) 怎么解决系统服务之间的互相依赖?

答:分批启动(AMS,PMS,PKMS等重要的服务先启动);分阶段启动。

(6) 桌面的启动?

答:AMS服务就绪时会调用systemReady()函数 => startHomeActivityLocked(mCurrentUserld,"systemReady");

=> 在Launcher activity的onCreate里,mLoaderTask = new LoaderTask(mApp.getContext(), loadFlags);

=> mPm.querylntentActivitiesAsUser //向pms获取已安装的应用

=> 显示应用图标。

思考:

1.为什么系统服务不都跑在binder线程里呢?

2.为什么系统服务不都跑在自己私有的工作线程里呢?

3.跑在binder线程和跑在工作线程,如何取舍?

面试技巧:1.条理清晰―what、how、why;2.结论+细节;3.引导面试官谈论自己的精通或有优势的技术点,掌握主动权。

1-3 你知道怎么添加一个系统服务吗?

(1) 添加一个系统服务

答:加入到systemServe,或者单独的进程在init.rc配置里加。启用binder机制,然后通过serviceManager获取服务实例。

(2) systemserver的启动:启用binder机制 =》启动各类系统服务 =》进入Loop循环

(3) 启用binder机制:打开binder驱动;映射内存,分配缓冲区;启动binder线程,进入binder loop。

1-4 系统服务和bind的应用服务有什么区别?

(1) 启动方式:大部分都是在systemServer里启动,大部分在binder线程,少部分有自己单独的工作线程。bind的应用服务,bindServices => startServiceCommon =>ActivityManagerNative.startService => 向AMS发送启动请求,增加一条服务记录。ams只是负责管理和调度,真正的启动还是在应用端实现的。应用服务启动流程:在handleCreateService中,loadClass(加载服务的类) => newInstance => 创建context => makeApplication,返回app =》 service.attach(context,this,...) =》service.onCreate();

(2) 注册方式:systemserver的系统服务,ServiceManager.addService();单独进程的服务,在c层的main函数中,addService()。应用的服务,bindService() => 向AMS发生请求,如果服务已注册,回调binder。如果未注册,ams向service发送请求binder,服务的发布binder到ams,再回调binder。可见,应用服务是被动注册的,是发送请求后才注册,系统服务则是启动后主动注册的。

(3) 使用方式:系统服务的调用context.getSystemService(..)获取到XxServiceManager,然后直接调用api方法。对于应用服务,应用bindService,参数需传ServiceConnection对象,ServiceConnection会回调onServiceConnected方法,将binder包装一下,即asIntetface后返回业务接口对象,然后调用其业务的接口方法。

1-5 ServiceManager启动和工作原理

(1) ServiceManager启动流程是怎样的?

1.启动进程,是单独的进程,在init进程中启动;

2.启用Binder机制

3.发布自己的服务

4.等待并响应请求

(2) 怎么获取ServiceManager的binder对象?

0号handle值获取一个BpHander

(3) 怎么向ServiceManager添加服务?

首先获取ServiceManager的binder对象,然后发起asSrvice binder调用,要带2个参数,服务的名称和服务的binder实例对象。

(4) 怎么从ServiceManager获取服务?

首先获取ServiceManager的binder对象,然后发起getService调用。

你可能感兴趣的:(Android进阶,android,Framework,zygote,SystemServer,binder,ServiceManager)