天天看點

framework層服務分析

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:

framework層服務分析

  再具體看看app_process怎麼用的

framework層服務分析

     這樣就啟動了systemserver了,那又具體幹了什麼呢?往下看:

android framework 層服務是android啟動時由systemServer啟動的。

   public static void main(String[] args) {

   …………………

   System.loadLibrary("android_servers");        init1(args);

}   加載android_servers共享庫,裡面有大把的JNI注冊,看看他的android.mk就知道了,如下:

framework層服務分析

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裡面都幹了啥,主要的東西如下:

framework層服務分析

    大把的service都在這裡注冊了。下面以震蕩的service做解析:

vVibratorServicevibrator = null;

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,

framework層服務分析

   再看看自動産生的IVibratorService.java,

framework層服務分析

   頭部就說了他是自動産生的了。再看看stub下面的一個重要的接口asinterface,

framework層服務分析

      我們接着看看上層怎麼使用這個震蕩service的,就不難了解asinterface了,

vprivate final IVibratorService mService;

v public SystemVibrator(Context context) {

    mPackageName = context.getOpPackageName();       

    mService = IVibratorService.Stub.asInterface(               

     ServiceManager.getService("vibrator"));}

    其實說到這一層層跟進,java部分就解析完了,到執行JNI了,那我們看看JNI裡面都有些什麼吧,

framework層服務分析

       通過JNI注冊函數jniRegisterNativeMethods注冊進去,把這個最終加到要編譯到的android_server共享庫的JNI_ONLOAD裡面去就大工告成了。至于在native裡面繼續往下走就應該到HAL了,不在這個讨論範圍裡,都不難了,直接執行個空函數也行,這樣service就完整介紹了。内容有點多,有點亂,是用教育訓練PPT來寫這個文章的,敬請見諒。

繼續閱讀