framework层服务分析
最近在做公司内部员工android系统培训,编写了一些PPT,引用了网上诸位大侠的贡献,下面就分析下framework框架层服务。
Android Service是android 系统中的四大组件之一(Activity、Service、BroadcastReceiver、ContentProvider),大家都知道,它有下面两大特点:
1)运行在后台的一种服务程序
2)一般很少和用户交互,没有可视化界面。
service可以在很多应用中都有使用,音乐播放器后台播放使用的也是service,比如检测电池电量的变化,statusbar改变等等,总之服务无处不在,深藏后宫不露脸,真是我们新时代的劳模。
/*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/edsam49原创,转载请注明出处,谢谢!
/*****************************************************************************************************/
服务的本质就是响应客户端请求,提供服务,要提供服务就必须建立接收请求,处理请求,应答客服端的框架。从程序的角度,服务一定要存在一个闭合循环框架和请求处理框架。下面我们开始深度分析framework框架层服务。
下面首先引用一下android启动流程图:
从图上很明显看出,framework框架层服务是由systemserver启动的,那又是怎么启动的呢?先来看看systemserver是怎么启动的:
Init.rc里面去启动systemserver:
再具体看看app_process怎么用的
这样就启动了systemserver了,那又具体干了什么呢?往下看:
android framework 层服务是android启动时由systemServer启动的。
public static void main(String[] args) {
…………………
System.loadLibrary("android_servers"); init1(args);
}
加载android_servers共享库,里面有大把的JNI注册,看看他的android.mk就知道了,如下:
v再细一点看:是由systemserver的init2 阶段的第一个 java 线程ServerTHread 初始化的。
v
vSystemserver.java文件中:
vpublic static final void init2() {
v Slog.i(TAG, "Entered theAndroid system server!");
Thread thr = new ServerThread();
thr.setName("android.server.ServerThread");
thr.start();
v}
看看这个thread里面都干了啥,主要的东西如下:
大把的service都在这里注册了。下面以震荡的service做解析:
vVibratorServicevibrator = null;
v
vSlog.i(TAG, "VibratorService");
vvibrator = new VibratorService(context);
ServiceManager.addService("vibrator", vibrator);
添加到系统里了。
vpublic class VibratorService extends IVibratorService.Stub{ 。。。}
那这个IVibratorService.Stub怎么来的呢?我告诉你,他是由IVibratorService.aidl在编译的时候自动产生的。下面看看AIDL的介绍,
Implement your interfacemethods - The AIDL compiler creates an interface in the Java programminglanguage from your AIDL interface. This interface has an inner abstract classnamed Stub that inherits the interface (and implements a few additional methodsnecessary for the IPC call). You must create a class that extends Your Interface.Stub andimplements the methods you declared in your .aidl file.
那我们看看震荡的这个IVibratorService.aidl,
再看看自动产生的IVibratorService.java,
头部就说了他是自动产生的了。再看看stub下面的一个重要的接口asinterface,
我们接着看看上层怎么使用这个震荡service的,就不难理解asinterface了,
vprivate final IVibratorService mService;
v public SystemVibrator(Context context) {
mPackageName = context.getOpPackageName();
mService = IVibratorService.Stub.asInterface(
ServiceManager.getService("vibrator"));}
其实说到这一层层跟进,java部分就解析完了,到执行JNI了,那我们看看JNI里面都有些什么吧,
通过JNI注册函数jniRegisterNativeMethods注册进去,把这个最终加到要编译到的android_server共享库的JNI_ONLOAD里面去就大工告成了。至于在native里面继续往下走就应该到HAL了,不在这个讨论范围里,都不难了,直接执行个空函数也行,这样service就完整介绍了。内容有点多,有点乱,是用培训PPT来写这个文章的,敬请见谅。