Merge "AIDL it! IServiceManager" into stage-aosp-master
This commit is contained in:
committed by
Android (Google) Code Review
commit
1c373c4361
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user