[Android][Framework] 添加系統服務

来源:https://www.cnblogs.com/rossoneri/archive/2018/09/15/9651782.html
-Advertisement-
Play Games

新博客地址 http://wossoneri.github.io/2018/09/15/[Android][Framework]create system service/ 做系統開發,有時候需要自己定義一些介面供App使用, 同時為了方便維護管理,就會需要自己建立一個服務,把新的功能集中在一起。下 ...


新博客地址
http://wossoneri.github.io/2018/09/15/[Android][Framework]create-system-service/

做系統開發,有時候需要自己定義一些介面供App使用, 同時為了方便維護管理,就會需要自己建立一個服務,把新的功能集中在一起。下麵就是新建一個系統服務的基本步驟。

  1. 添加介面

    frameworks/base/core/java/android/app/IDemoManager.aidl

    package android.app;
    
    interface IDemoManager
    {
        int getCpuTemperature();
    }
  2. 添加服務,實現aidl文件定義的介面

    frameworks/base/services/core/java/com/android/server/DemoManagerService.java

    package com.android.server;
    
    import android.app.IDemoManager;
    import android.content.Context;
    import android.util.Slog;
    
    public class DemoManagerService extends IDemoManager.Stub {
        private Context mContext;
    
        public DemoManagerService(Context context) {
            mContext = context;
            Slog.d("Demo", "Construct");
        }
    
        @Override
        public int getCpuTemperature() {
            return 100; // Test code
        }
    }
  3. 添加對應的Manager

    frameworks/base/core/java/android/app/DemoManager.java

    package android.app;
    
    import android.content.Context;
    import android.os.RemoteException;
    import android.util.Slog;
    
    public class DemoManager {
        Context mContext;
        IDemoManager mService;
    
        public DemoManager(Context context, IDemoManager service) {
            mContext = context;
            mService = service;
        }
    
        public int getCpuTemperature() {
            if (mService != null) {
                try {
                    return mService.getCpuTemperature();
                } catch (RemoteException e) {
                    Slog.e("Demo", "RemoteException " + e);
                }
            }
            return -1;
        }
    }
  4. 添加aidl到Makefile src

    frameworks/base/Android.mk

    LOCAL_SRC_FILES += \
        core/java/android/app/IDemoManager.aidl \
  5. 添加DEMO_SERVICE常量

    frameworks/base/core/java/android/content/Context.java

    public static final String DEMO_SERVICE = "demo";
  6. 註冊系統服務

    frameworks/base/core/java/android/app/SystemServiceRegistry.java

    registerService(Context.ORISLINK_SERVICE, DemoManager.class,
        new CachedServiceFetcher<DemoManager>() {
            @Override
            public DemoManager createService(ContextImpl ctx) {
                IBinder b = ServiceManager.getService(Context.DEMO_SERVICE);
                return new DemoManager(ctx, IDemoManager.Stub.asInterface(b));
    }});
  7. 開機啟動服務

    frameworks/base/services/java/com/android/server/SystemServer.java

    try {
        ServiceManager.addService(Context.DEMO_SERVICE, new DemoManagerService(context));
    } catch (Throwable e) {
        Slog.e("Demo", "Failed to start Demo Service " + e);
    }
  8. 編譯源碼,因為添加了介面,所以需要

    make update-api

    更新介面。然後再整編刷機。

  9. service list 查看服務,不存在,這是因為selinux許可權沒加。

  10. 添加sepolicy許可權

device/qcom/sepolicy/msm8937/service.te

type demo_service, system_api_service, system_server_service, service_manager_type;

device/qcom/sepolicy/msm8937/service_contexts

demo  u:object_r:demo_service:s0
  1. 重新編譯代碼,使用下麵測試代碼驗證

    import android.app.DemoManager;
    
    DemoManager om = (DemoManager) getSystemService(Context.DEMO_SERVICE);
    Log.d(TAG, "Current temperature is " + om.getCpuTemperature());

    最終log列印出100,服務添加完成。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 昨天一開發同事反饋一個存儲過程很慢,但是重編譯後,存儲過程就很快了。瞭解基本情況後,初步判斷是參數嗅探問題。那麼如何診斷定位、分析問題呢?下麵簡單介紹一下這次參數嗅探問題定位的流程過程。 首先查看該存儲過程的執行計劃相關信息: 如下截圖所示,此存儲過程是2018-09-12 9:03:01緩存的,最... ...
  • 使用閃回技術,實現基於磁碟上閃回恢復區的自動備份與還原。 一、恢復表對象 1.創建學生表 2.添加記錄 3.刪除表 4.資料庫回收站多一條新的記錄 二、找回表數據 1.按某條件刪除表記錄,例如 2.如果是刪了或修改裡面的數據,可以先建立一個快表將刪除修改之前狀態的數據找回到這個表中 3.QUICK_ ...
  • SQL語句沒寫好可能導致: 1)網速不給力,不穩定。 2)伺服器記憶體不夠,或者SQL 被分配的記憶體不夠。 3)sql語句設計不合理 4)沒有相應的索引,索引不合理 5)沒有有效的索引視圖 6)表數據過大沒有有效的分區設計 7)資料庫設計太2,存在大量的數據冗餘 8)索引列上缺少相應的統計信息,或者統 ...
  • 1、xcall.sh 批量命令腳本,例:xcall.sh jps ,查看hadoop101~ hadoop104的jps進程 2、xsync.sh 集群同步文件,分發文件腳本,例:xsync.sh /usr/loacl/test.sh,在hadoop101~hadoop104上的/usr/local ...
  • 一般使用dp,不使用px。sp啥時候用呢?給TextView設置文字大小的時候用。 ...
  • 線性佈局: 相對佈局: ...
  • 第一種:內部類的方式 第二種:匿名內部類 第三種按鈕點擊事件:讓當前類實現onClickListener介面。 第四種按鈕的點擊事件: 如果將click方法中的View v去掉或者方法名不是click都會報異常。 原因是什麼呢? 查看View源碼得知: 查看View源碼裡面的onClick屬性: 里 ...
  • 自古開篇先說兩句,寫這些筆記不是學慣用的,主要是後續分享一些遇到的坑,碰到過什麼樣的問題,怎麼去解決,如果你不是一個很耐心無看文章的人,建議去 網易雲課堂找一些課程,跟著別人的腳步或許會更有動力,我的筆記也是從哪裡學習,記一些小筆記,我覺得大學里做這件事是最合適的了,當然最重要的是有沒有興趣,如果沒 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...