summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/os/IServiceManager.java87
-rw-r--r--core/java/android/os/ServiceManagerNative.java84
2 files changed, 20 insertions, 151 deletions
diff --git a/core/java/android/os/IServiceManager.java b/core/java/android/os/IServiceManager.java
deleted file mode 100644
index 053c5ede7224..000000000000
--- a/core/java/android/os/IServiceManager.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * 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;
-
-}
diff --git a/core/java/android/os/ServiceManagerNative.java b/core/java/android/os/ServiceManagerNative.java
index 011dfa03c70a..7991cd46b65c 100644
--- a/core/java/android/os/ServiceManagerNative.java
+++ b/core/java/android/os/ServiceManagerNative.java
@@ -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().
@@ -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() {
@@ -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;
}