android framework 添加系統服務

前言
本文的方法要修改Android源碼。我們自定義一個自己的服務,並將其添加到ServiceManager中。

步驟
1. 添加一個aidl文件,我將aidl文件添加到這個路徑下:
frameworks/base/core/java/android/content/dyna/IDynaSystemManager.aidl

package android.content.dyna; 

interface IDynaSystemManager
{
    byte[] read();
    boolean write(in byte[] buffer);
}

2.在frameworks/base/Android.mk文件的LOCAL_SRC_FILES中系統添加了很多aidl文件,我們在系統添加的文件列表中添加一行:

@@ -103,6 +103,7 @@ LOCAL_SRC_FILES += \
    core/java/android/bluetooth/IBluetoothGatt.aidl \
    core/java/android/bluetooth/IBluetoothGattCallback.aidl \
    core/java/android/bluetooth/IBluetoothGattServerCallback.aidl \
+   core/java/android/content/dyna/IDynaSystemManager.aidl \
    core/java/android/content/IClipboard.aidl \
    core/java/android/content/IContentService.aidl \
    core/java/android/content/IIntentReceiver.aidl \

3.frameworks/base/services/java/com/android/server/dyna/ 路徑下新建一個DynaSystemService.java類,該類繼承了IDynaSystemManager.Stub

4.frameworks/base/core/java/android/content/dyna創建一個管理器類DynaSystemManager.java

5.爲了讓應用層可以使用getSystemService接口獲得服務,現在需要在ContextImpl.java的static代碼塊將DynaSystemManager創建起來

frameworks/base/core/java/android/app/ContextImpl.java
@@ -50,6 +50,8 @@ 
+import android.content.dyna.DynaSystemManager;
+import android.content.dyna.IDynaSystemManager;
@@ -586,6 +588,12 @@
class ContextImpl extends Context {
+                
+  registerService(DYNASYSTEM_SERVICE, new ServiceFetcher() {
+  public Object createService(ContextImpl ctx) {
+  IBinder b = ServiceManager.getService(DYNASYSTEM_SERVICE);
+  return new DynaSystemManager(ctx, IDynaSystemManager.Stub.asInterface(b));
+  }});

 ......        

6.將DynaSystemService服務加入到ServiceManager中,

frameworks/base/core/java/android/content/Context.java
@@ -2449,6 +2449,8 @@ 
     public static final String SERIAL_SERVICE = "serial";
+    
+    public static final String DYNASYSTEM_SERVICE = "dynasystem";
frameworks/base/services/java/com/android/server/SystemServer.java
@@ -136,6 +136,8 @@
+import com.android.server.dyna.DynaSystemService;
@@ -233,6 +235,7 @@ class ServerThread {
         DockObserver dock = null;
         UsbService usb = null;
         SerialService serial = null;
+        DynaSystemService dynasystem = null;
         TwilightService twilight = null;
         UiModeManagerService uiMode = null;
         RecognitionManagerService recognition = null;
@@ -896,6 +899,14 @@

+        try {
+             Slog.i(TAG, "DynaSystemService");
+             dynasystem = new DynaSystemService(context);
+             ServiceManager.addService(Context.DYNASYSTEM_SERVICE,dynasystem);
+        } catch (Throwable e) {
+                reportWtf("starting DynaSystemService", e);
+        }

3.執行update-api命令更新:frameworks/base/api/current.txt

@@ -5987,6 +5987,7 @@ package android.content {
     field public static final java.lang.String DISPLAY_SERVICE = "display";
     field public static final java.lang.String DOWNLOAD_SERVICE = "download";
     field public static final java.lang.String DROPBOX_SERVICE = "dropbox";
+    field public static final java.lang.String DYNASYSTEM_SERVICE = "dynasystem";
     field public static final java.lang.String INPUT_METHOD_SERVICE = "input_method";
     field public static final java.lang.String INPUT_SERVICE = "input";
     field public static final java.lang.String KEYGUARD_SERVICE = "keyguard";
@@ -6939,6 +6940,29 @@ package android.content {

 }

+package android.content.dyna {
+
+  public class DynaSystemManager {
+    ctor public DynaSystemManager(android.content.Context, android.content.dyna.IDynaSystemManager);
+    method public byte[] read();
+    method public boolean write(byte[]);
+    field public static final java.lang.String TAG = "DynaSystemManager";
+  }
+
+  public abstract interface IDynaSystemManager implements android.os.IInterface {
+    method public abstract byte[] read() throws android.os.RemoteException;
+    method public abstract boolean write(byte[]) throws android.os.RemoteException;
+  }
+
+  public static abstract class IDynaSystemManager.Stub extends android.os.Binder implements android.content.dyna.IDynaSystemManager {
+    ctor public IDynaSystemManager.Stub();
+    method public android.os.IBinder asBinder();
+    method public static android.content.dyna.IDynaSystemManager asInterface(android.os.IBinder);
+    method public boolean onTransact(int, android.os.Parcel, android.os.Parcel, int) throws android.os.RemoteException;
+  }
+
+}
+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章