framework层服务分析

来源:互联网 发布:非农数据大于预期 编辑:程序博客网 时间:2024/05/16 02:05

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来写这个文章的,敬请见谅。

3 0