Loading core/java/android/os/IServiceManager.javadeleted 100644 → 0 +0 −87 Original line number Diff line number Diff line /* * Copyright (C) 2006 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.os; import android.annotation.UnsupportedAppUsage; /** * Basic interface for finding and publishing system services. * * An implementation of this interface is usually published as the * global context object, which can be retrieved via * BinderNative.getContextObject(). An easy way to retrieve this * is with the static method BnServiceManager.getDefault(). * * @hide */ public interface IServiceManager extends IInterface { /** * Retrieve an existing service called @a name from the * service manager. Blocks for a few seconds waiting for it to be * published if it does not already exist. */ @UnsupportedAppUsage IBinder getService(String name) throws RemoteException; /** * Retrieve an existing service called @a name from the * service manager. Non-blocking. */ @UnsupportedAppUsage IBinder checkService(String name) throws RemoteException; /** * Place a new @a service called @a name into the service * manager. */ void addService(String name, IBinder service, boolean allowIsolated, int dumpFlags) throws RemoteException; /** * Return a list of all currently running services. */ String[] listServices(int dumpFlags) throws RemoteException; static final String descriptor = "android.os.IServiceManager"; int GET_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION; int CHECK_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+1; int ADD_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+2; int LIST_SERVICES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+3; int CHECK_SERVICES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+4; int SET_PERMISSION_CONTROLLER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+5; /* * Must update values in IServiceManager.h */ /* Allows services to dump sections according to priorities. */ int DUMP_FLAG_PRIORITY_CRITICAL = 1 << 0; int DUMP_FLAG_PRIORITY_HIGH = 1 << 1; int DUMP_FLAG_PRIORITY_NORMAL = 1 << 2; /** * Services are by default registered with a DEFAULT dump priority. DEFAULT priority has the * same priority as NORMAL priority but the services are not called with dump priority * arguments. */ int DUMP_FLAG_PRIORITY_DEFAULT = 1 << 3; int DUMP_FLAG_PRIORITY_ALL = DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_HIGH | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PRIORITY_DEFAULT; /* Allows services to dump sections in protobuf format. */ int DUMP_FLAG_PROTO = 1 << 4; } core/java/android/os/ServiceManagerNative.java +20 −64 Original line number Diff line number Diff line Loading @@ -18,8 +18,6 @@ package android.os; import android.annotation.UnsupportedAppUsage; import java.util.ArrayList; /** * Native implementation of the service manager. Most clients will only * care about asInterface(). Loading @@ -32,26 +30,27 @@ public final class ServiceManagerNative { /** * Cast a Binder object into a service manager interface, generating * a proxy if needed. * * TODO: delete this method and have clients use * IServiceManager.Stub.asInterface instead */ @UnsupportedAppUsage static public IServiceManager asInterface(IBinder obj) { public static IServiceManager asInterface(IBinder obj) { if (obj == null) { return null; } IServiceManager in = (IServiceManager) obj.queryLocalInterface(IServiceManager.descriptor); if (in != null) { return in; } // ServiceManager is never local return new ServiceManagerProxy(obj); } } // This class should be deleted and replaced with IServiceManager.Stub whenever // mRemote is no longer used class ServiceManagerProxy implements IServiceManager { public ServiceManagerProxy(IBinder remote) { mRemote = remote; mServiceManager = IServiceManager.Stub.asInterface(remote); } public IBinder asBinder() { Loading @@ -60,73 +59,30 @@ class ServiceManagerProxy implements IServiceManager { @UnsupportedAppUsage public IBinder getService(String name) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IServiceManager.descriptor); data.writeString(name); mRemote.transact(GET_SERVICE_TRANSACTION, data, reply, 0); IBinder binder = reply.readStrongBinder(); reply.recycle(); data.recycle(); return binder; // Same as checkService (old versions of servicemanager had both methods). return mServiceManager.checkService(name); } public IBinder checkService(String name) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IServiceManager.descriptor); data.writeString(name); mRemote.transact(CHECK_SERVICE_TRANSACTION, data, reply, 0); IBinder binder = reply.readStrongBinder(); reply.recycle(); data.recycle(); return binder; return mServiceManager.checkService(name); } public void addService(String name, IBinder service, boolean allowIsolated, int dumpPriority) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IServiceManager.descriptor); data.writeString(name); data.writeStrongBinder(service); data.writeInt(allowIsolated ? 1 : 0); data.writeInt(dumpPriority); mRemote.transact(ADD_SERVICE_TRANSACTION, data, reply, 0); reply.recycle(); data.recycle(); mServiceManager.addService(name, service, allowIsolated, dumpPriority); } public String[] listServices(int dumpPriority) throws RemoteException { ArrayList<String> services = new ArrayList<String>(); int n = 0; while (true) { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IServiceManager.descriptor); data.writeInt(n); data.writeInt(dumpPriority); n++; try { boolean res = mRemote.transact(LIST_SERVICES_TRANSACTION, data, reply, 0); if (!res) { break; } } catch (RuntimeException e) { // The result code that is returned by the C++ code can // cause the call to throw an exception back instead of // returning a nice result... so eat it here and go on. break; } services.add(reply.readString()); reply.recycle(); data.recycle(); } String[] array = new String[services.size()]; services.toArray(array); return array; return mServiceManager.listServices(dumpPriority); } /** * Same as mServiceManager but used by apps. * * Once this can be removed, ServiceManagerProxy should be removed entirely. */ @UnsupportedAppUsage private IBinder mRemote; private IServiceManager mServiceManager; } Loading
core/java/android/os/IServiceManager.javadeleted 100644 → 0 +0 −87 Original line number Diff line number Diff line /* * Copyright (C) 2006 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.os; import android.annotation.UnsupportedAppUsage; /** * Basic interface for finding and publishing system services. * * An implementation of this interface is usually published as the * global context object, which can be retrieved via * BinderNative.getContextObject(). An easy way to retrieve this * is with the static method BnServiceManager.getDefault(). * * @hide */ public interface IServiceManager extends IInterface { /** * Retrieve an existing service called @a name from the * service manager. Blocks for a few seconds waiting for it to be * published if it does not already exist. */ @UnsupportedAppUsage IBinder getService(String name) throws RemoteException; /** * Retrieve an existing service called @a name from the * service manager. Non-blocking. */ @UnsupportedAppUsage IBinder checkService(String name) throws RemoteException; /** * Place a new @a service called @a name into the service * manager. */ void addService(String name, IBinder service, boolean allowIsolated, int dumpFlags) throws RemoteException; /** * Return a list of all currently running services. */ String[] listServices(int dumpFlags) throws RemoteException; static final String descriptor = "android.os.IServiceManager"; int GET_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION; int CHECK_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+1; int ADD_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+2; int LIST_SERVICES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+3; int CHECK_SERVICES_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+4; int SET_PERMISSION_CONTROLLER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+5; /* * Must update values in IServiceManager.h */ /* Allows services to dump sections according to priorities. */ int DUMP_FLAG_PRIORITY_CRITICAL = 1 << 0; int DUMP_FLAG_PRIORITY_HIGH = 1 << 1; int DUMP_FLAG_PRIORITY_NORMAL = 1 << 2; /** * Services are by default registered with a DEFAULT dump priority. DEFAULT priority has the * same priority as NORMAL priority but the services are not called with dump priority * arguments. */ int DUMP_FLAG_PRIORITY_DEFAULT = 1 << 3; int DUMP_FLAG_PRIORITY_ALL = DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_HIGH | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PRIORITY_DEFAULT; /* Allows services to dump sections in protobuf format. */ int DUMP_FLAG_PROTO = 1 << 4; }
core/java/android/os/ServiceManagerNative.java +20 −64 Original line number Diff line number Diff line Loading @@ -18,8 +18,6 @@ package android.os; import android.annotation.UnsupportedAppUsage; import java.util.ArrayList; /** * Native implementation of the service manager. Most clients will only * care about asInterface(). Loading @@ -32,26 +30,27 @@ public final class ServiceManagerNative { /** * Cast a Binder object into a service manager interface, generating * a proxy if needed. * * TODO: delete this method and have clients use * IServiceManager.Stub.asInterface instead */ @UnsupportedAppUsage static public IServiceManager asInterface(IBinder obj) { public static IServiceManager asInterface(IBinder obj) { if (obj == null) { return null; } IServiceManager in = (IServiceManager) obj.queryLocalInterface(IServiceManager.descriptor); if (in != null) { return in; } // ServiceManager is never local return new ServiceManagerProxy(obj); } } // This class should be deleted and replaced with IServiceManager.Stub whenever // mRemote is no longer used class ServiceManagerProxy implements IServiceManager { public ServiceManagerProxy(IBinder remote) { mRemote = remote; mServiceManager = IServiceManager.Stub.asInterface(remote); } public IBinder asBinder() { Loading @@ -60,73 +59,30 @@ class ServiceManagerProxy implements IServiceManager { @UnsupportedAppUsage public IBinder getService(String name) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IServiceManager.descriptor); data.writeString(name); mRemote.transact(GET_SERVICE_TRANSACTION, data, reply, 0); IBinder binder = reply.readStrongBinder(); reply.recycle(); data.recycle(); return binder; // Same as checkService (old versions of servicemanager had both methods). return mServiceManager.checkService(name); } public IBinder checkService(String name) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IServiceManager.descriptor); data.writeString(name); mRemote.transact(CHECK_SERVICE_TRANSACTION, data, reply, 0); IBinder binder = reply.readStrongBinder(); reply.recycle(); data.recycle(); return binder; return mServiceManager.checkService(name); } public void addService(String name, IBinder service, boolean allowIsolated, int dumpPriority) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IServiceManager.descriptor); data.writeString(name); data.writeStrongBinder(service); data.writeInt(allowIsolated ? 1 : 0); data.writeInt(dumpPriority); mRemote.transact(ADD_SERVICE_TRANSACTION, data, reply, 0); reply.recycle(); data.recycle(); mServiceManager.addService(name, service, allowIsolated, dumpPriority); } public String[] listServices(int dumpPriority) throws RemoteException { ArrayList<String> services = new ArrayList<String>(); int n = 0; while (true) { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IServiceManager.descriptor); data.writeInt(n); data.writeInt(dumpPriority); n++; try { boolean res = mRemote.transact(LIST_SERVICES_TRANSACTION, data, reply, 0); if (!res) { break; } } catch (RuntimeException e) { // The result code that is returned by the C++ code can // cause the call to throw an exception back instead of // returning a nice result... so eat it here and go on. break; } services.add(reply.readString()); reply.recycle(); data.recycle(); } String[] array = new String[services.size()]; services.toArray(array); return array; return mServiceManager.listServices(dumpPriority); } /** * Same as mServiceManager but used by apps. * * Once this can be removed, ServiceManagerProxy should be removed entirely. */ @UnsupportedAppUsage private IBinder mRemote; private IServiceManager mServiceManager; }