framework层服务分析
Posted Jarry_le
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了framework层服务分析相关的知识,希望对你有一定的参考价值。
framework层服务分析
最近在做公司内部员工android系统培训,编写了一些PPT,引用了网上诸位大侠的贡献,下面就分析下framework框架层服务。
Android Service是android 系统中的四大组件之一(Activity、Service、BroadcastReceiver、ContentProvider),大家都知道,它有下面两大特点: 1)运行在后台的一种服务程序 2)一般很少和用户交互,没有可视化界面。 service可以在很多应用中都有使用,音乐播放器后台播放使用的也是service,比如检测电池电量的变化,statusbar改变等等,总之服务无处不在,深藏后宫不露脸,真是我们新时代的劳模。
/*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/edsam49原创,转载请注明出处,谢谢!
/*****************************************************************************************************/
![](https://image.cha138.com/20221123/892ca464e7dc491f94e5ed0d013f07fa.jpg)
从图上很明显看出,framework框架层服务是由systemserver启动的,那又是怎么启动的呢?先来看看systemserver是怎么启动的: Init.rc里面去启动systemserver:
![](https://image.cha138.com/20221123/93db0f9eb37b465a849fcae4a4d64e37.jpg)
再具体看看app_process怎么用的
![](https://image.cha138.com/20221123/ec9766f91b0f450494d46e60e4c50e29.jpg)
这样就启动了systemserver了,那又具体干了什么呢?往下看: android framework 层服务是android启动时由systemServer启动的。 public static void main(String[] args) ………………… System.loadLibrary(" android_servers"); init1(args); 加载 android_servers 共享库,里面有大把的JNI注册,看看他的android.mk就知道了,如下:
![](https://image.cha138.com/20221123/1eacda377d664800a400d26f82b961d5.jpg)
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里面都干了啥,主要的东西如下:
![](https://image.cha138.com/20221123/84841fa7b0294395bdd043f2e26e06d1.jpg)
大把的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,
![](https://image.cha138.com/20221123/9156410b130c417ebfe687728e8f6b99.jpg)
再看看自动产生的IVibratorService.java,
![](https://image.cha138.com/20221123/ecd4acee453a481f9b420d866f415284.jpg)
头部就说了他是自动产生的了。再看看stub下面的一个重要的接口asinterface,
![](https://image.cha138.com/20221123/368766a764204f838887fbb963486142.jpg)
我们接着看看上层怎么使用这个震荡service的,就不难理解asinterface了, vprivate final IVibratorService mService; v public SystemVibrator(Context context)
mPackageName = context.getOpPackageName();
mService = IVibratorService.Stub.asInterface(
ServiceManager.getService("vibrator"));其实说到这一层层跟进,java部分就解析完了,到执行JNI了,那我们看看JNI里面都有些什么吧,
![](https://image.cha138.com/20221123/93356ba9299741b99bae0bf5df10709f.jpg)
通过JNI注册函数jniRegisterNativeMethods注册进去,把这个最终加到要编译到的android_server共享库的JNI_ONLOAD里面去就大工告成了。至于在native里面继续往下走就应该到HAL了,不在这个讨论范围里,都不难了,直接执行个空函数也行,这样service就完整介绍了。内容有点多,有点乱,是用培训PPT来写这个文章的,敬请见谅。
以上是关于framework层服务分析的主要内容,如果未能解决你的问题,请参考以下文章
Android应用层到Framework到HAL再到驱动层的整个流程分析
我的 Entity Framework 存储库和服务层方法应返回哪些类型:List、IEnumerable、IQueryable?