1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2005 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define LOG_TAG "ServiceManager" 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 19c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IServiceManager.h> 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h> 22375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian#include <binder/IPCThreadState.h> 2347f876b74be0a2d6d417f5ff385f85d835a97fe9Jiyong Park#ifndef __ANDROID_VNDK__ 2447f876b74be0a2d6d417f5ff385f85d835a97fe9Jiyong Park#include <binder/IPermissionController.h> 2547f876b74be0a2d6d417f5ff385f85d835a97fe9Jiyong Park#endif 26c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/Parcel.h> 27788e1c413914731b2e2e52a9b1e007422fc367cfYunfan Chen#include <cutils/properties.h> 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/String8.h> 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/SystemClock.h> 30273e144215bbe3042686577032e584c4ec701447Iliyan Malchev#include <utils/CallStack.h> 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 32208059f67ed2dd9fa025e07fcb6954d3cb61c79eMathias Agopian#include <private/binder/Static.h> 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <unistd.h> 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectsp<IServiceManager> defaultServiceManager() 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gDefaultServiceManager != NULL) return gDefaultServiceManager; 41c2832705373b1ba058aafa6064f6ebd30ac6ee48Daniel Erat 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project AutoMutex _l(gDefaultServiceManagerLock); 44a7b0f04aaf7f04a9617dbbc839b1aaa6f20ca6d6Todd Poynor while (gDefaultServiceManager == NULL) { 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gDefaultServiceManager = interface_cast<IServiceManager>( 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ProcessState::self()->getContextObject(NULL)); 47a7b0f04aaf7f04a9617dbbc839b1aaa6f20ca6d6Todd Poynor if (gDefaultServiceManager == NULL) 48a7b0f04aaf7f04a9617dbbc839b1aaa6f20ca6d6Todd Poynor sleep(1); 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 51c2832705373b1ba058aafa6064f6ebd30ac6ee48Daniel Erat 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return gDefaultServiceManager; 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 5547f876b74be0a2d6d417f5ff385f85d835a97fe9Jiyong Park#ifndef __ANDROID_VNDK__ 5647f876b74be0a2d6d417f5ff385f85d835a97fe9Jiyong Park// IPermissionController is not accessible to vendors 5747f876b74be0a2d6d417f5ff385f85d835a97fe9Jiyong Park 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool checkCallingPermission(const String16& permission) 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return checkCallingPermission(permission, NULL, NULL); 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatic String16 _permission("permission"); 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 65375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool checkCallingPermission(const String16& permission, int32_t* outPid, int32_t* outUid) 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project IPCThreadState* ipcState = IPCThreadState::self(); 69375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian pid_t pid = ipcState->getCallingPid(); 70375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian uid_t uid = ipcState->getCallingUid(); 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (outPid) *outPid = pid; 72375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian if (outUid) *outUid = uid; 73375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian return checkPermission(permission, pid, uid); 74375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian} 75375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian 76375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopianbool checkPermission(const String16& permission, pid_t pid, uid_t uid) 77375f56363a8737119ce2222dcfaacbe1cf733fc0Mathias Agopian{ 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project sp<IPermissionController> pc; 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gDefaultServiceManagerLock.lock(); 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pc = gPermissionController; 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gDefaultServiceManagerLock.unlock(); 82c2832705373b1ba058aafa6064f6ebd30ac6ee48Daniel Erat 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int64_t startTime = 0; 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project while (true) { 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (pc != NULL) { 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bool res = pc->checkPermission(permission, pid, uid); 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (res) { 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (startTime != 0) { 90a19954ab377b46dbcb9cbe8a6ab6d458f2e32bcaSteve Block ALOGI("Check passed after %d seconds for %s from uid=%d pid=%d", 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project (int)((uptimeMillis()-startTime)/1000), 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String8(permission).string(), uid, pid); 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return res; 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 96c2832705373b1ba058aafa6064f6ebd30ac6ee48Daniel Erat 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Is this a permission failure, or did the controller go away? 98097ca275f4717a2c47a5d49f302ed2b72c8a1370Marco Nelissen if (IInterface::asBinder(pc)->isBinderAlive()) { 9932397c1cd3327905173b36baa6fd1c579bc328ffSteve Block ALOGW("Permission failure: %s from uid=%d pid=%d", 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String8(permission).string(), uid, pid); 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return false; 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 103c2832705373b1ba058aafa6064f6ebd30ac6ee48Daniel Erat 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Object is dead! 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gDefaultServiceManagerLock.lock(); 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (gPermissionController == pc) { 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gPermissionController = NULL; 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gDefaultServiceManagerLock.unlock(); 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 111c2832705373b1ba058aafa6064f6ebd30ac6ee48Daniel Erat 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Need to retrieve the permission controller. 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project sp<IBinder> binder = defaultServiceManager()->checkService(_permission); 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (binder == NULL) { 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Wait for the permission controller to come back... 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (startTime == 0) { 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project startTime = uptimeMillis(); 118a19954ab377b46dbcb9cbe8a6ab6d458f2e32bcaSteve Block ALOGI("Waiting to check permission %s from uid=%d pid=%d", 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String8(permission).string(), uid, pid); 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project sleep(1); 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } else { 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project pc = interface_cast<IPermissionController>(binder); 124c2832705373b1ba058aafa6064f6ebd30ac6ee48Daniel Erat // Install the new permission controller, and try again. 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gDefaultServiceManagerLock.lock(); 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gPermissionController = pc; 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project gDefaultServiceManagerLock.unlock(); 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 13247f876b74be0a2d6d417f5ff385f85d835a97fe9Jiyong Park#endif //__ANDROID_VNDK__ 13347f876b74be0a2d6d417f5ff385f85d835a97fe9Jiyong Park 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------- 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass BpServiceManager : public BpInterface<IServiceManager> 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic: 139e2347b7953f70232541bdc1b392230d6231aaeb9Chih-Hung Hsieh explicit BpServiceManager(const sp<IBinder>& impl) 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : BpInterface<IServiceManager>(impl) 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 143702ea9d42f52fc145090c0f0bfbe64993e4b8b33Brad Fitzpatrick 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual sp<IBinder> getService(const String16& name) const 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 146788e1c413914731b2e2e52a9b1e007422fc367cfYunfan Chen sp<IBinder> svc = checkService(name); 147788e1c413914731b2e2e52a9b1e007422fc367cfYunfan Chen if (svc != NULL) return svc; 148788e1c413914731b2e2e52a9b1e007422fc367cfYunfan Chen 149788e1c413914731b2e2e52a9b1e007422fc367cfYunfan Chen const bool isVendorService = 150788e1c413914731b2e2e52a9b1e007422fc367cfYunfan Chen strcmp(ProcessState::self()->getDriverName().c_str(), "/dev/vndbinder") == 0; 151788e1c413914731b2e2e52a9b1e007422fc367cfYunfan Chen const long timeout = uptimeMillis() + 5000; 152788e1c413914731b2e2e52a9b1e007422fc367cfYunfan Chen if (!gSystemBootCompleted) { 153788e1c413914731b2e2e52a9b1e007422fc367cfYunfan Chen char bootCompleted[PROPERTY_VALUE_MAX]; 154788e1c413914731b2e2e52a9b1e007422fc367cfYunfan Chen property_get("sys.boot_completed", bootCompleted, "0"); 155788e1c413914731b2e2e52a9b1e007422fc367cfYunfan Chen gSystemBootCompleted = strcmp(bootCompleted, "1") == 0 ? true : false; 156788e1c413914731b2e2e52a9b1e007422fc367cfYunfan Chen } 157788e1c413914731b2e2e52a9b1e007422fc367cfYunfan Chen // retry interval in millisecond. 158788e1c413914731b2e2e52a9b1e007422fc367cfYunfan Chen const long sleepTime = gSystemBootCompleted ? 1000 : 100; 159788e1c413914731b2e2e52a9b1e007422fc367cfYunfan Chen 160788e1c413914731b2e2e52a9b1e007422fc367cfYunfan Chen int n = 0; 161788e1c413914731b2e2e52a9b1e007422fc367cfYunfan Chen while (uptimeMillis() < timeout) { 162788e1c413914731b2e2e52a9b1e007422fc367cfYunfan Chen n++; 163788e1c413914731b2e2e52a9b1e007422fc367cfYunfan Chen if (isVendorService) { 164788e1c413914731b2e2e52a9b1e007422fc367cfYunfan Chen ALOGI("Waiting for vendor service %s...", String8(name).string()); 165788e1c413914731b2e2e52a9b1e007422fc367cfYunfan Chen CallStack stack(LOG_TAG); 166788e1c413914731b2e2e52a9b1e007422fc367cfYunfan Chen } else if (n%10 == 0) { 167788e1c413914731b2e2e52a9b1e007422fc367cfYunfan Chen ALOGI("Waiting for service %s...", String8(name).string()); 1686456e4488d59c0568a1f29dc93b7beb472236086Andy Hung } 169788e1c413914731b2e2e52a9b1e007422fc367cfYunfan Chen usleep(1000*sleepTime); 170788e1c413914731b2e2e52a9b1e007422fc367cfYunfan Chen 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project sp<IBinder> svc = checkService(name); 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (svc != NULL) return svc; 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 174788e1c413914731b2e2e52a9b1e007422fc367cfYunfan Chen ALOGW("Service %s didn't start. Returning NULL", String8(name).string()); 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NULL; 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 177702ea9d42f52fc145090c0f0bfbe64993e4b8b33Brad Fitzpatrick 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project virtual sp<IBinder> checkService( const String16& name) const 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(IServiceManager::getInterfaceDescriptor()); 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeString16(name); 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project remote()->transact(CHECK_SERVICE_TRANSACTION, data, &reply); 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return reply.readStrongBinder(); 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 187a94f129a7bbaa8ea45c50e49ba3e6127ca2a15ecDianne Hackborn virtual status_t addService(const String16& name, const sp<IBinder>& service, 188f56042d6a496fca2e5cfc1f598251f77a9bc7986Vishnu Nair bool allowIsolated, int dumpsysPriority) { 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(IServiceManager::getInterfaceDescriptor()); 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeString16(name); 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeStrongBinder(service); 193a94f129a7bbaa8ea45c50e49ba3e6127ca2a15ecDianne Hackborn data.writeInt32(allowIsolated ? 1 : 0); 194f56042d6a496fca2e5cfc1f598251f77a9bc7986Vishnu Nair data.writeInt32(dumpsysPriority); 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project status_t err = remote()->transact(ADD_SERVICE_TRANSACTION, data, &reply); 196837a0d0fb2c3fba8082d47d04cb6120af1eb9a54Brad Fitzpatrick return err == NO_ERROR ? reply.readExceptionCode() : err; 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 199f56042d6a496fca2e5cfc1f598251f77a9bc7986Vishnu Nair virtual Vector<String16> listServices(int dumpsysPriority) { 200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Vector<String16> res; 201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project int n = 0; 202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (;;) { 204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel data, reply; 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInterfaceToken(IServiceManager::getInterfaceDescriptor()); 206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project data.writeInt32(n++); 207f56042d6a496fca2e5cfc1f598251f77a9bc7986Vishnu Nair data.writeInt32(dumpsysPriority); 208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project status_t err = remote()->transact(LIST_SERVICES_TRANSACTION, data, &reply); 209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (err != NO_ERROR) 210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project break; 211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project res.add(reply.readString16()); 212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return res; 214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; 216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectIMPLEMENT_META_INTERFACE(ServiceManager, "android.os.IServiceManager"); 218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 220