Android P 添加系统服务示例

修改涉及的文件:

framework/base/Android.bp
framework/base/api/current.txt
framework/base/core/java/android/app/CCCManager.java
framework/base/core/java/android/app/SystemServiceRegistry.java
framework/base/core/java/android/content/Context.java
framework/base/core/java/android/os/ICCCService.aidl
framework/base/services/core/java/com/android/server/CCCService.java
framework/base/services/java/com/android/server/SystemServer.java

step1 添加编译依赖

framework/base/Android.bp

Index: base/Android.bp
===================================================================
--- base/Android.bp     (revision 6290)
+++ base/Android.bp     (working copy)
@@ -242,6 +242,7 @@
         "core/java/android/os/IThermalService.aidl",
         "core/java/android/os/IUpdateLock.aidl",
         "core/java/android/os/IUserManager.aidl",
+       "core/java/android/os/ICCCService.aidl",
         "core/java/android/os/IVibratorService.aidl",
         "core/java/android/os/storage/IStorageManager.aidl",
         "core/java/android/os/storage/IStorageEventListener.aidl",


step2 创建Manager,即CCCManager

在frameworks/base/core/java/android/app/ 下创建CCCManager.java 文件 内容如下
framework/base/core/java/android/app/CCCManager.java


package android.app;

/**
 * Created by liam on 16/10/2.
 */
import android.annotation.SdkConstant;
import android.annotation.SystemApi;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.RemoteException;
import android.os.ICCCService;
import android.util.Log;

public class CCCManager {
    ICCCService mService;
    public CCCManager(Context ctx,ICCCService service){
        mService=service;
    }
    public void setVal(String key,String value){
        try{
            mService.setVal(key,value);
        }catch(Exception e){
            Log.e("CCCManager",e.toString());
            e.printStackTrace();
        }

    }
    public String getVal(String key){
        try{
            return mService.getVal(key);
        }catch(Exception e){
            Log.e("CCCManager",e.toString());
            e.printStackTrace();
        }
        return null;
    }
    public void appendLog(String log){
        try{
            mService.appendLog(log);
        }catch(Exception e){
            Log.e("CCCManager",e.toString());
            e.printStackTrace();
        }
    }
    public void clearLog(){
        try{
            mService.clearLog();
        }catch(Exception e){
            Log.e("CCCManager",e.toString());
            e.printStackTrace();
        }
    }
    public String readLog(){
        try{
            return mService.readLog();
        }catch(Exception e){
            Log.e("CCCManager",e.toString());
            e.printStackTrace();
        }
        return null;
    }
}

step3 注册到SystemService

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

在静态代码块中增加

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

--- base/core/java/android/app/SystemServiceRegistry.java       (revision 6371)
+++ base/core/java/android/app/SystemServiceRegistry.java       (working copy)
@@ -128,6 +128,7 @@
 import android.os.Vibrator;
 import android.os.health.SystemHealthManager;
 import android.os.storage.StorageManager;
+import android.os.ICCCService;
 import android.print.IPrintManager;
 import android.print.PrintManager;
 import android.service.oemlock.IOemLockService;
@@ -190,6 +191,15 @@
                 return AccessibilityManager.getInstance(ctx);
             }});

+       registerService(Context.CCC_SERVICE, CCCManager.class,
+                new CachedServiceFetcher<CCCManager>() {
+                    @Override
+                    public CCCManager createService(ContextImpl ctx) {
+                        IBinder b = ServiceManager.getService(Context.CCC_SERVICE);
+                        ICCCService service = ICCCService.Stub.asInterface(b);
+                        return new CCCManager(ctx, service);
+                    }});
+
         registerService(Context.CAPTIONING_SERVICE, CaptioningManager.class,
                 new CachedServiceFetcher<CaptioningManager>() {
             @Override


step4 创建aidl文件
framework/base/core/java/android/os/ICCCService.aidl

// ICCCService.aidl
package android.os;

// Declare any non-default types here with import statements

interface ICCCService {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
   void setVal(String key,String value);
   String getVal(String key);
   void appendLog(String log);
   void clearLog();
   String readLog();
}

step5 创建Service文件 (CCCService)

在 frameworks/base/services/core/java/com/android/server/ 下新增一个 CCCService.java 用来实现aidl文件定义的接口。
framework/base/services/core/java/com/android/server/CCCService.java

package com.android.server;

import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.lang.*;
import java.util.HashMap;
import android.os.RemoteException;
import android.os.ICCCService;


/**
 *
 * Created by zhuangqianliu on 2016/9/21.
 */

public class CCCService extends ICCCService.Stub {
    private static HashMap<String,String> map=new HashMap<>();
    private static String inner_log="";

    public CCCService() {

    }

    @Override
    public void setVal(String key, String value) throws RemoteException {
        map.put(key,value);
    }

    @Override
    public String getVal(String key) throws RemoteException {
        return map.get(key);
    }

    @Override
    public void appendLog(String log) throws RemoteException {
        inner_log+=log+"\n";
    }

    @Override
    public void clearLog() throws RemoteException {
        inner_log="";
    }

    @Override
    public String readLog() throws RemoteException {
        return inner_log;
    }

}

step6 将自定义Service 加入到SystemServer 启动进程

先在 frameworks/base/core/java/android/content/Context.java 中添加一行 
    public static final String CCC_SERVICE="ccc";

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


--- base/core/java/android/content/Context.java (revision 6371)
+++ base/core/java/android/content/Context.java (working copy)
@@ -369,7 +369,7 @@
      * modes (removing network access etc).
      */
     public static final int BIND_FOREGROUND_SERVICE = 0x04000000;
-
+    public static final String CCC_SERVICE="ccc";
     /**
      * @hide Flag for {@link #bindService}: Treat the binding as hosting
      * an activity, an unbinding as the activity going in the background.


修改 frameworks/base/services/java/com/android/server/SystemServer.java在startOtherServices() 函数 的try模块中增加以下代码
framework/base/services/java/com/android/server/SystemServer.java


--- base/services/java/com/android/server/SystemServer.java     (revision 6371)
+++ base/services/java/com/android/server/SystemServer.java     (working copy)
@@ -760,6 +760,18 @@
         }

         try {
+
+                Slog.i(TAG, "CCC Service");
+
+                ServiceManager.addService(Context.CCC_SERVICE, new CCCService());
+
+            } catch (Throwable e) {
+
+                Slog.e(TAG, "Failure starting CCC Service", e);
+
+            }
+
+        try {
             final String SECONDARY_ZYGOTE_PRELOAD = "SecondaryZygotePreload";
             // We start the preload ~1s before the webview factory preparation, to
             // ensure that it completes before the 32 bit relro process is forked

step7 修改SePolicy的编译验证

修改 /external/sepolicy/service.te

在最后一行添加

type ccc_service, system_api_service, system_server_service, service_manager_type;

然后修改同目录下 /external/sepolicy/service_contexts 文件

中间插入一行 

ccc u:object_r:ccc_service:s0

 

step8 重新编译源码

别忘了先 make update-api。

framework/base/api/current.txt


Index: base/api/current.txt
===================================================================
--- base/api/current.txt        (revision 6371)
+++ base/api/current.txt        (working copy)
@@ -4388,6 +4388,15 @@
     field public static final android.os.Parcelable.Creator<android.app.AutomaticZenRule> CREATOR;
   }

+  public class CCCManager {
+    ctor public CCCManager(android.content.Context, android.os.ICCCService);
+    method public void appendLog(java.lang.String);
+    method public void clearLog();
+    method public java.lang.String getVal(java.lang.String);
+    method public java.lang.String readLog();
+    method public void setVal(java.lang.String, java.lang.String);
+  }
+
   public class DatePickerDialog extends android.app.AlertDialog implements android.widget.DatePicker.OnDateChangedListener android.content.DialogInterface.OnClickListener {
     ctor public DatePickerDialog(android.content.Context);
     ctor public DatePickerDialog(android.content.Context, int);
@@ -9483,6 +9492,7 @@
     field public static final java.lang.String CAMERA_SERVICE = "camera";
     field public static final java.lang.String CAPTIONING_SERVICE = "captioning";
     field public static final java.lang.String CARRIER_CONFIG_SERVICE = "carrier_config";
+    field public static final java.lang.String CCC_SERVICE = "ccc";
     field public static final java.lang.String CLIPBOARD_SERVICE = "clipboard";
     field public static final java.lang.String COMPANION_DEVICE_SERVICE = "companiondevice";
     field public static final java.lang.String CONNECTIVITY_SERVICE = "connectivity";
@@ -32607,6 +32617,21 @@
     method public abstract void binderDied();
   }

+  public abstract interface ICCCService implements android.os.IInterface {
+    method public abstract void appendLog(java.lang.String) throws android.os.RemoteException;
+    method public abstract void clearLog() throws android.os.RemoteException;
+    method public abstract java.lang.String getVal(java.lang.String) throws android.os.RemoteException;
+    method public abstract java.lang.String readLog() throws android.os.RemoteException;
+    method public abstract void setVal(java.lang.String, java.lang.String) throws android.os.RemoteException;
+  }
+
+  public static abstract class ICCCService.Stub extends android.os.Binder implements android.os.ICCCService {
+    ctor public ICCCService.Stub();
+    method public android.os.IBinder asBinder();
+    method public static android.os.ICCCService asInterface(android.os.IBinder);
+    method public boolean onTransact(int, android.os.Parcel, android.os.Parcel, int) throws android.os.RemoteException;
+  }
+
   public abstract interface IInterface {
     method public abstract android.os.IBinder asBinder();
   }

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值