Andrioid Framework中添加系统服务

来源:互联网 发布:大唐软件招聘 编辑:程序博客网 时间:2024/06/06 06:46

前言 
本文的方法要修改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);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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 \
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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));+  }}); ......        
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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";
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
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);+        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

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;+  }++}
原创粉丝点击