前言
本文的方法要修改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;
+ }
+
+}