日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Android 系统服务

發布時間:2023/12/20 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 系统服务 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Android系統服務大致分為三大類:本地守護進程、Native系統服務和Java系統服務。如下圖所示:

本地守護進程

init進程根據init.rc文件中的定義,啟動本地守護進程。這些進程會常駐在系統中,有的只會啟動一次,有的如果退出了,還會被init啟動。具體的啟動方式就在init.rc中定義。
下面大體列舉幾個守護進程及其功能。

守護進程功能
vold管理存儲設備,自動安裝存儲設備,將設備分區格式化
netd管理藍牙、wifi、usb等各種網絡連接
installd負責安裝及卸載軟件包,確認軟件包的完整性
rild接收來自于phone應用程序或其他客戶端程序發出的調制解調控制請求,并傳遞給調制解調器
adbd提供可以調試Android的環境
servicemanagerbinder通信大管家
surfaceflinger負責android系統的UI圖形顯示
mediaserver負責播放音頻、視頻,camera拍照錄像

Native系統服務

由c++語言編寫,運行在本地守護進程中。比如mediaserver守護進程中就包含AudioFlinger、MediaPlayerService、CameraService、AudioPolicyService和SoundTriggerHwService等服務。在
mediaserver進程的main函數中,初始化這些服務的實例,代碼如下:

int main(int argc __unused, char** argv) {...sp<ProcessState> proc(ProcessState::self());sp<IServiceManager> sm = defaultServiceManager();ALOGI("ServiceManager: %p", sm.get());AudioFlinger::instantiate();MediaPlayerService::instantiate();CameraService::instantiate();AudioPolicyService::instantiate();SoundTriggerHwService::instantiate();...ProcessState::self()->startThreadPool();IPCThreadState::self()->joinThreadPool(); }

在所屬進程初始化的時候會將Native系統服務注冊到ServiceManager中。這樣,其他的應用或服務就可以通過binder機制調用Native系統服務了。
當然,我們也可以自己開發一個Native系統服務,實現其Binder接口,這樣Native層的其他應用或服務就可以調用該服務了。
如果我們開發的Native系統服務想提供給Java層應用使用,就需要實現一個Java接口,然后通過JNI調用Native系統服務。

Java系統服務

由Java語言編寫,大部分運行在system_server進程中。每個系統服務都以線程的形態運行,等待應用程序發出的請求,然后對請求進程處理,再講結果返回給應用程序。
這部分系統服務又可以分為兩種:Java核心系統服務和Java硬件系統服務。
Java核心系統服務是Android系統正常運轉的基礎,包括大家所熟知的AMS、WMS、PMS等。
Java硬件服務是為應用提供硬件控制服務,如電話服務、wifi服務、PowerManagerService等。

下面羅列了運行在system_server中的系統服務,按字母排序。

AccessibilityManagerService 截獲用戶輸入,并根據輸入給用戶一些額外的反饋,起到輔助效果的服務
AccountManagerService 管理設備中所有賬號的服務,包括賬號、密碼、授權管理功能
ActivityManagerService 管理所有組件的服務,安卓系統的核心服務 AlarmManagerService 管理鬧鐘的服務
AppWidgetService 管理APP widgets的工作,包括加載、刪除、布局等
AssetAtlasService 將一些系統圖片資源合并成一個紋理圖傳給GPU達到硬件加速的效果的服務
AudioService 管理音頻的服務
BackupManagerService 管理備份和應用數據的服務
BatteryService 管理電池的服務
BluetoothManagerService 管理系統藍牙的服務
CertBlacklister 更新系統SSL證書的公共秘鑰和序列號黑名單的服務
ClipboardService 管理系統剪貼板的服務
CommonTimeManagementService 管理公共時間配置的服務
ConnectivityService 管理網絡連接的服務
ContentService 管理系統數據更新通知的服務,和ContentProvider密切相關
CountryDetectorService 檢測當前系統所屬國家的服務
DevicePolicyManagerService 管理系統設備配置的服務
DeviceStorageMonitorService 管理系統存儲空間的服務,當存儲空間小于某個閾值時,會發出警告廣播
DiskStateService 管理系統存儲空間統計的服務
DisplayManagerService 管理顯示設備的服務
DreamManagerService 管理屏幕保護的服務
DropBoxManagerService 生成和管理系統運行中日志文件的服務
EntropyMixer 加載和保存隨機信息的服務
IdleMaintenanceService 管理系統在空閑時執行維護任務的服務
InputManagerService 管理觸屏輸入的服務
InputMethodManagerService 管理系統輸入法的服務
LightsService 管理光傳感器的服務
LocationManagerService 管理定位和位置的服務
LockSettingsService 管理系統鎖屏設置的服務
MountService 管理系統存儲設備掛載和卸載的服務
NetWorkManagementService 管理系統網絡的服務
NetWorkPolicyManagerService 管理網絡連接策略的服務
NetWorkStatsService 管理網絡連接狀態的服務
NetWorkTimeUpdateService 根據網絡時間更新本地時間的服務
NotificationManagerService 管理系統通知的服務
PackageManagerService 管理應用包的服務
PowerManagerService 管理系統電源的服務
PrintManagerService 管理打印的服務
RecognitionManagerService 管理身份識別的服務
SamplingProfilerService 記錄和分析系統啟動性能的服務
SchedulingPolicyService 管理系統調度策略的服務
SearchManagerServcie 管理系統搜索功能的服務
SerialServie 管理系統串口設備的服務
StatusBarManagerService 管理系統狀態欄的服務
TelephonyRegistry 監聽和管理通話事件和狀態的服務
TextServicesManagerService 文本拼寫檢查的服務
UiModeManagerService 設置和管理系統UI模式的服務
UsbService 管理USB連接的服務
UserManagerService 管理系統用戶身份信息的服務
VibratorService 管理系統振動器的服務
WallpaperManagerService 管理系統桌面背景墻紙的服務
WifiP2pService 管理Wifi點對點連接的服務
WifiService 管理系統Wifi設備的服務
WindowManagerService 管理窗口的服務,安卓系統的核心服務

Java系統服務的實現

從在android5.1.1中,Java Service一般都會繼承一個虛類SystemService,在其中定義了兩個接口onStart和onBootPhase。

  • onStart() :Java Service啟動的時候會回調該函數。
  • onBootPhase() : 系統啟動的各個階段會回調該函數。

這樣,啟動服務就很簡單了:

mSystemServiceManager.startService(xxxxxxService.class);

我們繼續看一下startService的實現:

public class SystemServiceManager {// 保存所有SystemServiceprivate final ArrayList<SystemService> mServices = new ArrayList<SystemService>();public SystemService startService(String className) {final Class<SystemService> serviceClass;try {//調用JVM加載className指定的類,會執行該類的靜態代碼段serviceClass = (Class<SystemService>)Class.forName(className); } catch (ClassNotFoundException ex) { ...}...mServices.add(service); // 添加該servicetry {service.onStart(); // 回調該service的onStart方法} catch (RuntimeException ex) {...}...} }

下面看一下onBootPhase回調方法。
在system啟動的一些階段,系統會調用如下代碼,主動回調SystemService的onBootPhase方法。

mSystemServiceManager.startBootPhase(SystemService.PHASE_XXXXXX);public class SystemServiceManager {public void startBootPhase(final int phase) {// 階段值會隨著系統啟動的進行越來越大,因此下一個階段值肯定要大于當前階段if (phase <= mCurrentPhase) {throw new IllegalArgumentException("Next phase must be larger than previous");} mCurrentPhase = phase; //保存當前階段// 遍歷所有的SystemService,并回調它的onBootPhase方法。final int serviceLen = mServices.size();for (int i = 0; i < serviceLen; i++) {final SystemService service = mServices.get(i);try {service.onBootPhase(mCurrentPhase); // 將階段值也傳進去} catch (Exception ex) {...}}} }

PHASE_XXXXXX指示了各個不同的啟動階段,定義如下:

public abstract class SystemService { public static final int PHASE_WAIT_FOR_DEFAULT_DISPLAY = 100; public static final int PHASE_LOCK_SETTINGS_READY = 480; public static final int PHASE_SYSTEM_SERVICES_READY = 500;public static final int PHASE_ACTIVITY_MANAGER_READY = 550;public static final int PHASE_THIRD_PARTY_APPS_CAN_START = 600;public static final int PHASE_BOOT_COMPLETED = 1000; }

所以,在onBootPhase(int phase)中,我們可以根據phase中指示的啟動階段,做不同的操作!在自己設計新的系統服務時,這個很重要。因為一些操作需要系統環境的支持,有了這個回調函數及phase參數,我們就可以在合適的階段做合適的操作了。

另外,Java系統服務中一般還會實現一個方法:systemReady()。該方法在SystemServer.java–>startOtherServices()調用:

final XXXService xxxService;mActivityManagerService.systemReady(new Runnable() {@Overridepublic void run() {try {if (xxxService != null) xxxService.systemReady();} catch (Throwable e) {reportWtf("making XXX Service ready", e);}...} }

在[Android5.1]ActivityManagerService啟動過程分析中,我們知道AMS的systemReady方法會回調這個Runnable,上述代碼就會執行。

注意:Java系統服務的onStart、onBootPhase、systemReady等方法,都運行在system_server主線程中。建議新建一個線程來處理復雜、耗時操作。

Java系統服務Binder通信

上面講了Java系統服務的實現,隨之而來的一個問題是,其他服務或應用怎么調用Java系統服務的功能?當然是通過Binder通信。
下面就講一下Java系統服務的Binder服務實現。假設服務名為ExampleService。
首先,需要新建和實現三個文件:

frameworks/base/core/java/android/app/IExample.aidl
frameworks/base/core/java/android/app/Example.java
frameworks/base/services/core/java/android/server/ExampleService.java

frameworks/base/core/java/android/app/IExample.aidl代碼如下:

interface IExample {boolean helloWorld(String str); }

frameworks/base/core/java/android/app/Example.java代碼如下:

class Example {private final IExample mService;Example(Context context, IExample service) {mService = service;}public boolean helloWorld(String str) {try {return mService.helloWorld(str);} catch(RemoteException e) {return null;}} }

frameworks/base/services/core/java/android/server/ExampleService.java代碼如下:

class ExampleService extends SystemService {private Context mContext;public ExampleService(Context context) {super(context);mContext = context;} @Overridepublic void onStart() {publishBinderService(Context.EXAMPLE_SERVICE, new BinderService());}@Overridepublic void onBootPhase(int phase) {if (phase == PHASE_SYSTEM_SERVICES_READY) {...}if (phase == PHASE_ACTIVITY_MANAGER_READY) {...}if (phase == PHASE_BOOT_COMPLETED) {...}...}public void systemReady() {...}class BinderService extend IExample.Stub {@Override boolean helloWorld(String str) {...}} }

其次,修改如下文件的代碼:

frameworks/base/services/java/com/android/server/SystemServer.java
frameworks/base/core/java/android/content/Context.java
frameworks/base/core/java/android/app/SystemServiceRegistry.java

  • frameworks/base/services/java/com/android/server/SystemServer.java修改如下:
import com.android.server.ExampleService; public final class SystemServer {ExampleService mExampleService = null;...private void startOtherServices() {...mExampleService = mSystemServiceManager.startService(ExampleService.class);...try {if (mExampleService != null) mExampleService.systemReady();} catch (Throwable e) {reportWtf("making Example Service ready", e);}...}
  • frameworks/base/core/java/android/content/Context.java修改如下:
public abstract class Context {...public static final String EXAMPLE_SERVICE = "example";... }
  • frameworks/base/core/java/android/app/SystemServiceRegistry.java修改如下:
final class SystemServiceRegistry {...registerService(Context.EXAMPLE_SERVICE, Example.class,new CachedServiceFetcher<Example>() {@Overridepublic Example createService(ContextImpl ctx) {IBinder b = ServiceManager.getService(Context.EXAMPLE_SERVICE);IExample service = IExample.Stub.asInterface(b);if (service == null) {Log.wtf(TAG, "Failed to get Example Service.");}return new Example(ctx.getOuterContext(),service);}});... }

最后,其他應用或服務通過binder調用ExampleService的helloWorld方法,代碼如下:

import android.app.Example;class Client {static Example mService;mService = (Example) context.getSystemService(Context.EXAMPLE_SERVICE);mService.helloWorld(str); }

總結

以上是生活随笔為你收集整理的Android 系统服务的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。