1 /* 2 * Copyright (C) 2006 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.os; 18 19 import android.compat.annotation.UnsupportedAppUsage; 20 21 /** 22 * Native implementation of the service manager. Most clients will only 23 * care about asInterface(). 24 * 25 * @hide 26 */ 27 public final class ServiceManagerNative { ServiceManagerNative()28 private ServiceManagerNative() {} 29 30 /** 31 * Cast a Binder object into a service manager interface, generating 32 * a proxy if needed. 33 * 34 * TODO: delete this method and have clients use 35 * IServiceManager.Stub.asInterface instead 36 */ 37 @UnsupportedAppUsage asInterface(IBinder obj)38 public static IServiceManager asInterface(IBinder obj) { 39 if (obj == null) { 40 return null; 41 } 42 43 // ServiceManager is never local 44 return new ServiceManagerProxy(obj); 45 } 46 } 47 48 // This class should be deleted and replaced with IServiceManager.Stub whenever 49 // mRemote is no longer used 50 class ServiceManagerProxy implements IServiceManager { ServiceManagerProxy(IBinder remote)51 public ServiceManagerProxy(IBinder remote) { 52 mRemote = remote; 53 mServiceManager = IServiceManager.Stub.asInterface(remote); 54 } 55 asBinder()56 public IBinder asBinder() { 57 return mRemote; 58 } 59 60 @UnsupportedAppUsage getService(String name)61 public IBinder getService(String name) throws RemoteException { 62 // Same as checkService (old versions of servicemanager had both methods). 63 return mServiceManager.checkService(name); 64 } 65 checkService(String name)66 public IBinder checkService(String name) throws RemoteException { 67 return mServiceManager.checkService(name); 68 } 69 addService(String name, IBinder service, boolean allowIsolated, int dumpPriority)70 public void addService(String name, IBinder service, boolean allowIsolated, int dumpPriority) 71 throws RemoteException { 72 mServiceManager.addService(name, service, allowIsolated, dumpPriority); 73 } 74 listServices(int dumpPriority)75 public String[] listServices(int dumpPriority) throws RemoteException { 76 return mServiceManager.listServices(dumpPriority); 77 } 78 registerForNotifications(String name, IServiceCallback cb)79 public void registerForNotifications(String name, IServiceCallback cb) 80 throws RemoteException { 81 mServiceManager.registerForNotifications(name, cb); 82 } 83 unregisterForNotifications(String name, IServiceCallback cb)84 public void unregisterForNotifications(String name, IServiceCallback cb) 85 throws RemoteException { 86 throw new RemoteException(); 87 } 88 isDeclared(String name)89 public boolean isDeclared(String name) throws RemoteException { 90 return mServiceManager.isDeclared(name); 91 } 92 getDeclaredInstances(String iface)93 public String[] getDeclaredInstances(String iface) throws RemoteException { 94 return mServiceManager.getDeclaredInstances(iface); 95 } 96 updatableViaApex(String name)97 public String updatableViaApex(String name) throws RemoteException { 98 return mServiceManager.updatableViaApex(name); 99 } 100 getConnectionInfo(String name)101 public ConnectionInfo getConnectionInfo(String name) throws RemoteException { 102 return mServiceManager.getConnectionInfo(name); 103 } 104 registerClientCallback(String name, IBinder service, IClientCallback cb)105 public void registerClientCallback(String name, IBinder service, IClientCallback cb) 106 throws RemoteException { 107 throw new RemoteException(); 108 } 109 tryUnregisterService(String name, IBinder service)110 public void tryUnregisterService(String name, IBinder service) throws RemoteException { 111 throw new RemoteException(); 112 } 113 getServiceDebugInfo()114 public ServiceDebugInfo[] getServiceDebugInfo() throws RemoteException { 115 return mServiceManager.getServiceDebugInfo(); 116 } 117 118 /** 119 * Same as mServiceManager but used by apps. 120 * 121 * Once this can be removed, ServiceManagerProxy should be removed entirely. 122 */ 123 @UnsupportedAppUsage 124 private IBinder mRemote; 125 126 private IServiceManager mServiceManager; 127 } 128