1. 程式人生 > >Java層Binder使用(ServiceManager)

Java層Binder使用(ServiceManager)

跟上篇Binder使用一樣,先通過例子來跟蹤JavaBinder機制。本文參考了Binder In java

Init程序的init2階段,系統啟動了ServerThread,在ServerThread中會啟動很多用Java實現的系統服務

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

程式碼

  1. power = new PowerManagerService();  
  2. ServiceManager.addService(Context.POWER_SERVICE, power);  
  3. context = ActivityManagerService.main(factoryTest);  
  4. Slog.i(TAG, "Display Manager");  
  5. display = new DisplayManagerService(context, wmHandler, uiHandler);  
  6. ServiceManager.addService(Context.DISPLAY_SERVICE, display, true);  

通過ServiceManageraddService註冊為binder server端。

我們以PowerManagerService

為例,

(frameworks/base/services/java/com/android/server/power/)


PowerManagerService繼承於IPowerManager.stub,IPowerManager.stub位於

(frameworks/base/core/java/com/android/os/IPowerManager.aidl)

  1. package android.os;  
  2. import android.os.WorkSource;  
  3. /** @hide */
  4. interface IPowerManager  
  5. {  
  6.     // WARNING: The first two methods must remain the first two methods because their
  7.     // transaction numbers must not change unless IPowerManager.cpp is also updated.
  8.     void acquireWakeLock(IBinder lock, int flags, String tag, in WorkSource ws);  
  9.     void releaseWakeLock(IBinder lock, int flags);  
  10.     void updateWakeLockWorkSource(IBinder lock, in WorkSource ws);  
  11.     boolean isWakeLockLevelSupported(int level);  
  12.     void userActivity(long time, int event, int flags);  
  13.     void wakeUp(long time);  
  14.     void goToSleep(long time, int reason);  
  15.     void nap(long time);  
  16.     boolean isScreenOn();  
  17.     void reboot(boolean confirm, String reason, boolean wait);  
  18.     void shutdown(boolean confirm, boolean wait);  
  19.     void crash(String message);  
  20.     void setStayOnSetting(int val);  
  21.     void setMaximumScreenOffTimeoutFromDeviceAdmin(int timeMs);  
  22.     // temporarily overrides the screen brightness settings to allow the user to
  23.     // see the effect of a settings change without applying it immediately
  24.     void setTemporaryScreenBrightnessSettingOverride(int brightness);  
  25.     void setTemporaryScreenAutoBrightnessAdjustmentSettingOverride(float adj);  
  26.     // sets the attention light (used by phone app only)
  27.     void setAttentionLight(boolean on, int color);  
  28. }  

Aidlandroid內部程序通訊介面的描述語言,通過編譯我們可以編譯出


  1. package android.os;  
  2. /** @hide */
  3. publicinterface IPowerManager extends android.os.IInterface {  
  4.     /** Local-side IPC implementation stub class. */
  5.     publicstaticabstractclass Stub extends android.os.Binder implements
  6.             android.os.IPowerManager {  
  7.         privatestaticfinal java.lang.String DESCRIPTOR = "android.os.IPowerManager";  
  8.         /** Construct the stub at attach it to the interface. */
  9.         public Stub() {  
  10.             this.attachInterface(this, DESCRIPTOR);  
  11.         }  
  12.         /** 
  13.          * Cast an IBinder object into an android.os.IPowerManager interface, 
  14.          * generating a proxy if needed. 
  15.          */
  16.         publicstatic android.os.IPowerManager asInterface(  
  17.                 android.os.IBinder obj) {  
  18.             if ((obj == null)) {  
  19.                 returnnull;  
  20.             }  
  21.             android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);  
  22.             if (((iin != null) && (iin instanceof android.os.IPowerManager))) {  
  23.                 return ((android.os.IPowerManager) iin);  
  24.             }  
  25.             returnnew android.os.IPowerManager.Stub.Proxy(obj);  
  26.         }  
  27.         @Override
  28.         public android.os.IBinder asBinder() {  
  29.             returnthis;  
  30.         }  
  31.         @Override
  32.         publicboolean onTransact(int code, android.os.Parcel data,  
  33.                 android.os.Parcel reply, int flags)  
  34.                 throws android.os.RemoteException {  
  35.             switch (code) {  
  36.             case INTERFACE_TRANSACTION: {  
  37.                 reply.writeString(DESCRIPTOR);  
  38.                 returntrue;  
  39.             }  
  40.             case TRANSACTION_acquireWakeLock: {  
  41.                 data.enforceInterface(DESCRIPTOR);  
  42.                 android.os.IBinder _arg0;  
  43.                 _arg0 = data.readStrongBinder();  
  44.                 int _arg1;  
  45.                 _arg1 = data.readInt();  
  46.                 java.lang.String _arg2;  
  47.                 _arg2 = data.readString();  
  48.                 android.os.WorkSource _arg3;  
  49.                 if ((0 != data.readInt())) {  
  50.                     _arg3 = android.os.WorkSource.CREATOR  
  51.                             .createFromParcel(data);  
  52.                 } else {  
  53.                     _arg3 = null;  
  54.                 }  
  55.                 this.acquireWakeLock(_arg0, _arg1, _arg2, _arg3);  
  56.                 reply.writeNoException();  
  57.                 returntrue;  
  58.             }  
  59.             case TRANSACTION_releaseWakeLock: {  
  60.                 data.enforceInterface(DESCRIPTOR);  
  61.                 android.os.IBinder _arg0;