生活随笔
收集整理的這篇文章主要介紹了
Android Framework系统服务详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Android Framework系統服務詳解
操作環境
系統:Linux (Ubuntu 12.04)
平臺:高通
Android版本:5.1
PS: 符號...為省略N條代碼
一、大致原理分析
Android本身有很多系統服務,如:AlarmManagerService、PowerManagerService、AudioService等,這些服務在手機系統啟動時就進行開啟或監聽狀態,由ServiceManager負責實例化運行。系統服務與本地新增的服務屬于兩個不同進程,必須通過AIDL(Android Interface Definition Language :Android接口定義語言)進行跨進程通信
二、新增具體案例
2.1?創建AIDL接口文件
路徑:frameworks/base/core/java/android/service/test/IMyTestManager.aidl
[java]?view plaincopy
package?android.service.test;?? ?? interface?IMyTestManager?{?? ????String?sayHello();?? ????int?priFunction();?? }??
2.2
?將創建的AIDL加入編譯中
路徑:frameworks/base/Android.mk
[javascript]?view plaincopy
##?READ?ME:?########################################################?? ##?? ##?When?updating?this?list?of?aidl?files,?consider?if?that?aidl?is?? ##?part?of?the?SDK?API.??If?it?is,?also?add?it?to?the?list?below?that?? ##?is?preprocessed?and?distributed?with?the?SDK.??This?list?should?? ##?not?contain?any?aidl?files?for?parcelables,?but?the?one?below?should?? ##?if?you?intend?for?3rd?parties?to?be?able?to?send?those?objects?? ##?across?process?boundaries.?? ##?? ##?READ?ME:?########################################################?? LOCAL_SRC_FILES?+=?\?? ...?? core/java/android/service/test/IMyTestManager.aidl?\?? ...?? 2.2.1?注釋的大概意思:
當更新這個文件列表時,如果考慮aidl是SDK API的一部分。如果它是,同時添加到下面的列表進行預處理和分布式的SDK。這個列表不包含任何aidl文件parcelables接口。但是如果你想讓第三方能夠在整個過程發送這些對象的話,你就應該下面有一個的目標 2.2.2?LOCAL_SRC_FILES += \ 這個宏是編譯管理AIDL的,很多系統AIDL在此添加進行編譯 2.2.3?在frameworks/base/下用mm進行單編,把AIDL的java接口生成出來
編譯完成后檢查路徑: out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/service/test/IMyTestManager.java
2.3?創建新的系統服務類
路徑:frameworks/base/core/java/android/service/test/MyTestManagerService.java [java]?view plaincopy
public?class?MyTestManagerService?extends?IMyTestManager.Stub{?? ?? ????private?static?final?String?TAG?=?"MyTestManagerService";?? ?? ????private?Context?mContext;?? ?? ????public?MyTestManagerService(Context?context)?{?? ????????mContext?=?context;?? ????}?? ?? ????@Override?? ????public?String?sayHello()?throws?RemoteException?{?? ?????????? ????????Log.d(TAG,?"sayHello()");?? ????????return?"Hello?AIDL";?? ????}?? ?????? ????@Override?? ????public?int?priFunction()?throws?RemoteException?{?? ?????????? ????????Log.d(TAG,?"priFunction()");?? ????????return?0;?? ????}?? ?? }??
2.4
?創建系統服務公開接口管理類
路徑:frameworks/base/core/java/android/service/test/MyTestManager.java
[java]?view plaincopy
public?class?MyTestManager?{?? ?? ????private?static?final?String?TAG?=?"MyTestManager";?? ?? ????private?IMyTestManager?mService;?? ?? ????public?MyTestManager(IMyTestManager?service)?{?? ????????mService?=?service;?? ????}?? ?? ????public?String?sayHello()?throws?RemoteException?{?? ????????Log.d(TAG,?"sayHello()");?? ????????return?mService.sayHello();?? ????}?? }??
2.4.1?Android系統中很多系統服務API沒有全部公開,都是在Frameworks層通過Manager類封裝一層來進行管理公開接口。也就是說對Application層公開都是通過Manager封裝來決定的,這里我只公開了sayHello()。priFunction()是我故意不公開的,方便理解
2.5?將創建的服務添加進ServiceManager
路徑:frameworks/base/services/java/com/android/server/SystemServer.java
[java]?view plaincopy
private?void?startOtherServices()?{?? ????...?? ????AudioService?audioService?=?null;?? ????MyTestManagerService?mTestService?=?null;?? ????...?? ????if?(!disableMedia?&&?!"0".equals(SystemProperties.get("system_init.startaudioservice")))?{?? ????????try?{?? ????????????Slog.i(TAG,?"Audio?Service");?? ????????????audioService?=?new?AudioService(context);?? ????????????ServiceManager.addService(Context.AUDIO_SERVICE,?audioService);?? ????????}?catch?(Throwable?e)?{?? ????????????reportWtf("starting?Audio?Service",?e);?? ????????}?? ????}?? ????...?? ????try?{?? ????????Slog.i(TAG,?"MyTestManager?Service");?? ????????mTestService?=?new?MyTestManagerService(context);?? ????????ServiceManager.addService(Context.MYTEST_SERVICE,?mTestService);?? ????}?catch?(Throwable?e)?{?? ????????reportWtf("starting?MyTestManager",?e);?? ????}?? ????...?? }?? 2.5.1?為了閱讀思路清晰,我保留了AudioService的服務添加代碼。至于if條件,我們也可以添加,java里面控制的話可以在config.xml中定義bool類型,一般是為了區分多個項目的差異。涉及到項目的overlay,可根據操作項目的具體需求來進行。驅動底層一般都是宏控,稍微提一下。
2.5.2?代碼中的Context.MYTEST_SERVICE服務常量添加 路徑:frameworks/base/core/java/android/content/Context.java
[java]?view plaincopy
...?? ? ? ? ? ? ? ? ?? public?static?final?String?AUDIO_SERVICE?=?"audio";?? ?? public?static?final?String?MYTEST_SERVICE?=?"mytest";?? ...??
2.6
?注冊服務 路徑:frameworks/base/core/java/android/app/ContextImpl.java [java]?view plaincopy
static?{?? ????...?? ????registerService(AUDIO_SERVICE,?new?ServiceFetcher()?{?? ????????public?Object?createService(ContextImpl?ctx)?{?? ????????????return?new?AudioManager(ctx);?? ????????}?? ????});?? ?????? ????registerService(MYTEST_SERVICE,?new?ServiceFetcher()?{?? ????????public?Object?createService(ContextImpl?ctx)?{?? ????????????IBinder?iBinder?=?ServiceManager.getService(Context.MYTEST_SERVICE);?? ????????????????if?(iBinder?==?null)?{?? ????????????????????return?null;?? ????????????????}?? ????????????????IMyTestManager?service?=?IMyTestManager.Stub?? ????????????????????.asInterface(iBinder);?? ????????????????return?new?MyTestManager(service);?? ????????????}?? ????});?? ????...?? }?? 2.6.1?在這里可以看到明顯的對比,有一個差異就是AudioManager在注冊服務的時候并沒有像我添加的一樣將服務傳給IBinder,再通過IBinder來進行接口對接獲取到服務。其實,AudioManger已經在內部類做了這層封裝,原理是一樣的,也有很多系統服務采用我這種方式進行注冊。附AudioManager部分源碼: 路徑:frameworks/base/media/java/android/media/AudioManager.java [java]?view plaincopy
public?class?AudioManager?{?? ????...?? ????private?static?IAudioService?sService;?? ?? ????? ? ?? ????public?AudioManager(Context?context)?{?? ????????mContext?=?context;?? ????????...?? ????}?? ?? ????private?static?IAudioService?getService()?? ????{?? ????????if?(sService?!=?null)?{?? ????????????return?sService;?? ????????}?? ????????IBinder?b?=?ServiceManager.getService(Context.AUDIO_SERVICE);?? ????????sService?=?IAudioService.Stub.asInterface(b);?? ????????return?sService;?? ????}?? ????...?? }??
2.7?調用新增的系統服務 [java]?view plaincopy
MyTestManager?mTestManager?=?(MyTestManager)?getSystemService(Context.MYTEST_SERVICE);?? try?{?? ?????? ????mTestManager.sayHello();?? }?catch?(RemoteException?e)?{?? ?????? ????e.printStackTrace();?? }
原文地址:?http://blog.csdn.net/u012169524/article/details/51264979
總結
以上是生活随笔為你收集整理的Android Framework系统服务详解的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。