diff options
-rw-r--r-- | cmds/servicemanager/ServiceManager.cpp | 17 | ||||
-rw-r--r-- | cmds/servicemanager/ServiceManager.h | 2 | ||||
-rw-r--r-- | libs/binder/Android.bp | 1 | ||||
-rw-r--r-- | libs/binder/aidl/android/os/IServiceManager.aidl | 6 | ||||
-rw-r--r-- | libs/binder/aidl/android/os/ServiceDebugInfo.aidl | 32 |
5 files changed, 58 insertions, 0 deletions
diff --git a/cmds/servicemanager/ServiceManager.cpp b/cmds/servicemanager/ServiceManager.cpp index b21010d49a..0dbab4e055 100644 --- a/cmds/servicemanager/ServiceManager.cpp +++ b/cmds/servicemanager/ServiceManager.cpp @@ -623,4 +623,21 @@ Status ServiceManager::tryUnregisterService(const std::string& name, const sp<IB return Status::ok(); } +Status ServiceManager::getServiceDebugInfo(std::vector<ServiceDebugInfo>* outReturn) { + if (!mAccess->canList(mAccess->getCallingContext())) { + return Status::fromExceptionCode(Status::EX_SECURITY); + } + + outReturn->reserve(mNameToService.size()); + for (auto const& [name, service] : mNameToService) { + ServiceDebugInfo info; + info.name = name; + info.debugPid = service.debugPid; + + outReturn->push_back(std::move(info)); + } + + return Status::ok(); +} + } // namespace android diff --git a/cmds/servicemanager/ServiceManager.h b/cmds/servicemanager/ServiceManager.h index 9f43eb4f58..c0891152e6 100644 --- a/cmds/servicemanager/ServiceManager.h +++ b/cmds/servicemanager/ServiceManager.h @@ -26,6 +26,7 @@ namespace android { using os::IClientCallback; using os::IServiceCallback; +using os::ServiceDebugInfo; class ServiceManager : public os::BnServiceManager, public IBinder::DeathRecipient { public: @@ -48,6 +49,7 @@ public: binder::Status registerClientCallback(const std::string& name, const sp<IBinder>& service, const sp<IClientCallback>& cb) override; binder::Status tryUnregisterService(const std::string& name, const sp<IBinder>& binder) override; + binder::Status getServiceDebugInfo(std::vector<ServiceDebugInfo>* outReturn) override; void binderDied(const wp<IBinder>& who) override; void handleClientCallbacks(); diff --git a/libs/binder/Android.bp b/libs/binder/Android.bp index e754d74655..ed079db4b3 100644 --- a/libs/binder/Android.bp +++ b/libs/binder/Android.bp @@ -214,6 +214,7 @@ filegroup { "aidl/android/os/IClientCallback.aidl", "aidl/android/os/IServiceCallback.aidl", "aidl/android/os/IServiceManager.aidl", + "aidl/android/os/ServiceDebugInfo.aidl", ], path: "aidl", } diff --git a/libs/binder/aidl/android/os/IServiceManager.aidl b/libs/binder/aidl/android/os/IServiceManager.aidl index 2b1e49283f..ce30050a89 100644 --- a/libs/binder/aidl/android/os/IServiceManager.aidl +++ b/libs/binder/aidl/android/os/IServiceManager.aidl @@ -18,6 +18,7 @@ package android.os; import android.os.IClientCallback; import android.os.IServiceCallback; +import android.os.ServiceDebugInfo; /** * Basic interface for finding and publishing system services. @@ -116,4 +117,9 @@ interface IServiceManager { * Attempt to unregister and remove a service. Will fail if the service is still in use. */ void tryUnregisterService(@utf8InCpp String name, IBinder service); + + /** + * Get debug information for all currently registered services. + */ + ServiceDebugInfo[] getServiceDebugInfo(); } diff --git a/libs/binder/aidl/android/os/ServiceDebugInfo.aidl b/libs/binder/aidl/android/os/ServiceDebugInfo.aidl new file mode 100644 index 0000000000..b95d222394 --- /dev/null +++ b/libs/binder/aidl/android/os/ServiceDebugInfo.aidl @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2021 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; + +/** + * Debug information associated with a registered service + * @hide + */ +parcelable ServiceDebugInfo { + /** + * Service name (see IServiceManager.addService/checkService/getService) + */ + @utf8InCpp String name; + /** + * PID of service at the time of registration (may no longer be valid). + */ + int debugPid; +} |