Android SystemServer 中 Service 的創建和啟動方式

今天導師給我將講了一些如何新建一個系統服務,以及如何去初始化。

Android SystemServer 中 Service 的創建和啟動方式

在 Android 系統中,SystemServer 是系統服務的核心進程,負責啟動和管理各種系統服務。以下是 SystemServer 中服務創建和啟動的詳細方式:

1. SystemServer 概述

SystemServer 是 Android 系統啟動過程中的關鍵組件,它運行在 system_server 進程中,負責啟動和管理所有核心系統服務。

2. 服務啟動流程

2.1 主要啟動階段

SystemServer 的服務啟動分為幾個主要階段:

// frameworks/base/services/java/com/android/server/SystemServer.java
private void run() {// 1. 啟動引導服務 (Bootstrap Services)startBootstrapServices();// 2. 啟動核心服務 (Core Services)startCoreServices();// 3. 啟動其他服務 (Other Services)startOtherServices();// 4. 系統就緒后的回調startSystemUi(context);systemReady();
}

2.2 引導服務啟動

// frameworks/base/services/java/com/android/server/SystemServer.java
private void startBootstrapServices() {// 啟動 ActivityManagerServicemActivityManagerService = ActivityManagerService.Lifecycle.startService(mSystemServiceManager, atm);mActivityManagerService.setSystemProcess();// 啟動 PowerManagerServicemPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);// 啟動 PackageManagerServicemPackageManagerService = PackageManagerService.main(mSystemContext, installer,mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);// 更多引導服務...
}

2.3 核心服務啟動

private void startCoreServices() {// 啟動 BatteryServicemSystemServiceManager.startService(BatteryService.class);// 啟動 UsageStatsServicemSystemServiceManager.startService(UsageStatsService.class);mActivityManagerService.setUsageStatsManager(LocalServices.getService(UsageStatsManagerInternal.class));// 啟動 WebViewUpdateServicemWebViewUpdateService = mSystemServiceManager.startService(WebViewUpdateService.class);// 更多核心服務...
}

2.4 其他服務啟動

private void startOtherServices() {// 啟動 WindowManagerServicewm = WindowManagerService.main(context, inputManager, !mFirstBoot, mOnlyCore,new PhoneWindowManager(), mActivityManagerService.mActivityTaskManager);ServiceManager.addService(Context.WINDOW_SERVICE, wm, /* allowIsolated= */ false);ServiceManager.addService(Context.INPUT_SERVICE, inputManager);// 啟動 NotificationManagerServicemSystemServiceManager.startService(NotificationManagerService.class);// 啟動自定義服務(如你的 MDM 服務)try {traceBeginAndSlog("StartMdmPolicyManager");mdmPolicyManager = new MdmPolicyManagerService(context);ServiceManager.addService(Context.MDM_POLICY_SERVICE, mdmPolicyManager);traceEnd();} catch (Throwable e) {reportWtf("starting Mdm Policy Manager", e);}// 更多其他服務...
}

3. 服務創建方式

3.1 使用 SystemServiceManager 啟動

這是推薦的方式,適用于繼承自 SystemService 的服務:

// 在 SystemServer 中
mSystemServiceManager.startService(YourService.class);// 服務類定義
public class YourService extends SystemService {public YourService(Context context) {super(context);}@Overridepublic void onStart() {// 服務啟動邏輯publishBinderService(Context.YOUR_SERVICE, new YourBinder());}@Overridepublic void onBootPhase(int phase) {if (phase == SystemService.PHASE_BOOT_COMPLETED) {// 啟動完成后的操作}}
}

3.2 直接實例化并注冊

對于不繼承 SystemService 的服務:

// 創建服務實例
YourService yourService = new YourService(context);// 添加到 ServiceManager
ServiceManager.addService(Context.YOUR_SERVICE, yourService);// 或者使用帶權限的添加方式
ServiceManager.addService(Context.YOUR_SERVICE, yourService, false, ServiceManager.DUMP_FLAG_PRIORITY_DEFAULT);

3.3 使用靜態 main 方法

某些服務有靜態的 main() 方法:

// 服務類中的靜態方法
public static YourService main(Context context) {YourService service = new YourService(context);ServiceManager.addService(Context.YOUR_SERVICE, service);return service;
}// 在 SystemServer 中調用
YourService.main(mSystemContext);

4. 服務生命周期管理

4.1 啟動階段(Boot Phases)

系統服務可以在不同的啟動階段執行初始化:

public class YourService extends SystemService {// ...@Overridepublic void onBootPhase(int phase) {if (phase == PHASE_THIRD_PARTY_APPS_CAN_START) {// 第三方應用可以啟動時的初始化} else if (phase == PHASE_BOOT_COMPLETED) {// 系統啟動完成后的操作}}
}

4.2 系統就緒回調

private void systemReady() {// 通知所有服務系統已就緒mActivityManagerService.systemReady(() -> {// 系統就緒后的操作}, BOOT_TIMINGS_TRACE_LOG);
}

5. 自定義服務示例

以下是在 SystemServer 中添加自定義服務的完整示例:

5.1 服務接口定義 (AIDL)

// frameworks/base/core/java/android/app/IMyCustomService.aidl
package android.app;interface IMyCustomService {void doSomething(int param);int getSomething();
}

5.2 服務實現

// frameworks/base/services/core/java/com/android/server/MyCustomService.java
package com.android.server;import android.app.IMyCustomService;
import android.content.Context;
import android.os.IBinder;
import android.util.Slog;public class MyCustomService extends IMyCustomService.Stub {private static final String TAG = "MyCustomService";private final Context mContext;public MyCustomService(Context context) {mContext = context;Slog.i(TAG, "MyCustomService created");}@Overridepublic void doSomething(int param) {Slog.d(TAG, "doSomething called with param: " + param);// 實現具體功能}@Overridepublic int getSomething() {Slog.d(TAG, "getSomething called");return 42; // 示例返回值}
}

5.3 在 SystemServer 中啟動服務

// frameworks/base/services/java/com/android/server/SystemServer.java
public final class SystemServer {// ...private void startOtherServices() {// ...// 啟動自定義服務try {traceBeginAndSlog("StartMyCustomService");MyCustomService myCustomService = new MyCustomService(context);ServiceManager.addService(Context.MY_CUSTOM_SERVICE, myCustomService);traceEnd();} catch (Throwable e) {reportWtf("starting My Custom Service", e);}// ...}
}

5.4 在 Context 中定義服務常量

// frameworks/base/core/java/android/content/Context.java
public abstract class Context {// ...public static final String MY_CUSTOM_SERVICE = "my_custom_service";// ...
}

6. 注意事項

  1. 啟動順序:服務的啟動順序很重要,依賴其他服務的服務應該在依賴服務之后啟動
  2. 異常處理:使用 try-catch 塊捕獲服務啟動過程中的異常
  3. 性能考慮:避免在服務啟動過程中執行耗時操作
  4. 權限控制:確保服務有適當的權限檢查
  5. 進程間通信:如果服務需要跨進程訪問,確保正確實現 Binder 接口

7. 調試技巧

  1. 使用 dumpsys 命令檢查服務狀態:

    adb shell dumpsys my_custom_service
    
  2. 查看服務列表:

    adb shell service list
    
  3. 檢查系統日志:

    adb logcat -s SystemServer
    

通過以上方式,你可以在 Android SystemServer 中成功創建和啟動自定義系統服務。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/93894.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/93894.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/93894.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SQL SERVER中位數

有11家門店數據,要求每天所有門店的各個指標的中位數1.第一種做法,使用PERCENTILE_CONT() 函數 SQL SERVER 2012 版本及以上PERCENTILE_CONT 函數簡介PERCENTILE_CONT 是 SQL 中的窗口函數,用于計算連續百分位數&#…

【java中springboot引入geotool】

學習目標: 在Spring Boot項目中引入GeoTools庫,可以按照以下步驟進行:理解GeoTools庫的基本信息和用途 GeoTools是一個開源的Java庫,用于處理地理信息系統(GIS)數據。它提供了對空間數據的讀取、寫入、查詢…

多項目開發環境:如何使用update-alternatives管理多版本Java JDK?(Windows、Mac、Ubuntu)

如何使用update-alternatives管理多版本Java JDK?(Windows、Mac、Ubuntu) 📖 摘要 在實際開發中,往往會遇到既要維護老項目又要跟進新特性的場景,這就需要在一臺機器上同時安裝并切換多個Java JDK版本。本…

力扣57:插入區間

力扣57:插入區間題目思路代碼題目 給你一個 無重疊的 ,按照區間起始端點排序的區間列表 intervals,其中 intervals[i] [starti, endi] 表示第 i 個區間的開始和結束,并且 intervals 按照 starti 升序排列。同樣給定一個區間 newInterval […

KVM虛擬化技術解析:從企業應用到個人創新的開源力量

1 .KVM:開源虛擬化的核心引擎 KVM(Kernel-based Virtual Machine)作為Linux內核原生集成的開源虛擬化模塊,徹底改變了現代數據中心的虛擬化格局。它通過將Linux內核轉變為Type-1型虛擬機監控器(Hypervisor)…

28.Linux :通過源代碼編譯安裝lamp

Linux :通過源代碼編譯安裝lamp 區別特性源代碼編譯安裝yum 安裝安裝方式從源代碼編譯構建預編譯的二進制包自定義程度高度可定制有限定制性能優化可針對特定硬件優化通用優化依賴管理手動解決依賴關系自動解決依賴安裝復雜度復雜,需技術經驗簡單&#x…

應用控制技術

一、 應用特征識別技術1.傳統行為檢測技術1.1 五元組檢測原理1.2 配置思路1.3 效果展示需求背景21.4 傳統行為檢測的缺陷無法識別應用層內容:若應用更換端口(如QQ改用隨機端口)或偽裝協議(如HTTPS加密),傳統…

當MySQL的int不夠用了

關于int的長度很多時候看到int(8)這樣的定義,其實這是工具導出的不專業。int是范圍,不是長度。在開發有了共識(知道這個長度不算數,要看范圍)以后,上來就是所有的類型都是bigint。int的范圍int的取值范圍是…

讓AI學會“邊做邊想“:ReAct的實戰指南

小智的求職困境有個叫小智的AI助手,它剛從"大語言模型大學"畢業,滿懷信心地去應聘一家咨詢公司的智能助理職位。面試官問:"北京和上海哪個城市人口更多?"小智立刻回答:"根據我的知識&#xf…

vue優化有哪些手段?

vue本身存在的方法 v-if 和v-show 的合理運用,頻繁使用的組件使用v-show,不頻繁的使用v-if,來減少dom的渲染路由懶加載 采用()>import(index.vue)當路由被訪問的時候才回去加載使用keep-alive緩存頁面,減少沒必要的重復渲染同時也可以減少服務器的壓力使用computed緩存數據,…

【圖像算法 - 14】精準識別路面墻體裂縫:基于YOLO12與OpenCV的實例分割智能檢測實戰(附完整代碼)

摘要: 裂縫是結構健康的重要隱患,傳統人工巡檢耗時耗力且易遺漏。本文將帶您利用當前最先進的YOLO12實例分割模型,構建一個高效、準確、更高精度的裂縫檢測系統。我們將從數據準備、模型訓練到結果可視化,手把手實現一個完整的項目…

“讓機器人更智慧 讓具身體更智能”北京世界機器人大會行業洞察

2025年8月8日,世界機器人大會在北京盛大開幕。本屆大會以“讓機器人更智慧 讓具身體更智能”為主題,由中國電子學會、世界機器人合作組織主辦,包括開幕式、閉幕式、論壇等。同期舉辦世界機器人博覽會、世界機器人大賽等活動,打造了…

PHP如何使用JpGraph生成折線圖?

JpGraph是一個功能強大的PHP圖表庫,它通過封裝GD庫函數,為開發者提供了簡單高效的數據可視化解決方案。作為專門用于繪制統計圖的面向對象庫,JpGraph支持創建折線圖、柱狀圖、餅圖等20余種圖表類型,并能自動處理坐標軸、刻度、圖例…

超級云平臺:重構數字生態的“超級連接器“

在數字經濟浪潮席卷全球的今天,企業數字化轉型已從"選擇題"變為"必答題"。然而,傳統云服務模式因技術壁壘高、資源分散、協同效率低等問題,讓許多企業在數字化轉型中陷入"上云易、用云難"的困境。 在此背景下,一種以"全域資源整合+智能…

https如何保證傳遞參數的安全

HTTPS 并非直接“加密參數”,而是通過一整套加密傳輸機制,確保客戶端與服務器之間所有通信內容(包括 URL 參數、表單數據、Cookie 等)在傳輸過程中不被竊聽、篡改或偽造。其核心安全保障來自以下技術實現: 一、核心加密…

OpenHarmony之打造全場景智聯基座的“分布式星鏈 ”WLAN子系統

1. 技術架構概覽 無線局域網(Wireless Local Area Networks,WLAN),是通過無線電、紅外光信號或者其他技術發送和接收數據的局域網,用戶可以通過WLAN實現結點之間無物理連接的網絡通訊。常用于用戶攜帶可移動終端的辦公、公眾環境中。 WLAN組件子系統為用戶提供WLAN基礎功…

JMeter(入門篇)

一.簡介 JMeter 是 Apache 組織使用 Java 開發的一款測試工具。 1、可以用于對服務器、網絡或對象模擬巨大的負載 2、通過創建帶有斷言的腳本來驗證程序是否能返回期望的結果 二.優缺點 優點: 開源、免費 跨平臺 支持多協議 小巧 功能強大 缺點&#xff…

Lecture 12: Concurrency 5

回顧:并行用餐哲學家讀者/作者問題哲學家進餐問題方案三:最大化并行需要一個更復雜的解決方案來實現最大的并行性 解決方案使用:state[N]:每個哲學家的當前狀態(THINKING, HUNGRY, EATING&#…

UniApp 微信小程序之間跳轉指南

概述 在UniApp開發中,經常需要實現從當前小程序跳轉到其他微信小程序的功能。本文檔詳細介紹了如何在UniApp中實現微信小程序之間的跳轉。 核心API uni.navigateToMiniProgram() 這是UniApp提供的用于跳轉到其他微信小程序的核心API。 基本語法 uni.navigateToMiniP…

基于SpringBoot+Vue的養老院管理系統的設計與實現 智能養老系統 養老架構管理 養老小程序

🔥作者:it畢設實戰小研🔥 💖簡介:java、微信小程序、安卓;定制開發,遠程調試 代碼講解,文檔指導,ppt制作💖 精彩專欄推薦訂閱:在下方專欄&#x1…