diff options
author | Pawan Wagh <waghpawan@google.com> | 2024-02-09 03:30:26 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2024-02-09 03:30:26 +0000 |
commit | 0fcb8c2fc1d2b2a41ec8f98dedbac61723de519e (patch) | |
tree | c3f3f108f1982b02c5e64e273831d110350f9e99 | |
parent | 17705ed910f679bf13d54d0bca51fba638d1860b (diff) | |
parent | 2eed130607109075ddf07df83eb82361e295360a (diff) | |
download | aidl-0fcb8c2fc1d2b2a41ec8f98dedbac61723de519e.tar.gz |
Add --all to record_binder am: 2eed130607
Original change: https://android-review.googlesource.com/c/platform/system/tools/aidl/+/2955617
Change-Id: I0b59bb6d3218082bd5c68b40060d68ea74d98652
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r-- | analyzer/analyzerMain.cpp | 111 |
1 files changed, 76 insertions, 35 deletions
diff --git a/analyzer/analyzerMain.cpp b/analyzer/analyzerMain.cpp index e5e61285..f6f3564d 100644 --- a/analyzer/analyzerMain.cpp +++ b/analyzer/analyzerMain.cpp @@ -30,18 +30,32 @@ using android::NO_ERROR; using android::sp; using android::status_t; using android::String16; +using android::String8; using android::aidl::Analyzer; using android::base::unique_fd; using android::binder::debug::RecordedTransaction; using std::string; - namespace { static std::atomic_uint gCtrlCCount = 0; static constexpr unsigned kCtrlCLimit = 3; static const char kStandardRecordingPath[] = "/data/local/recordings/"; -status_t startRecording(const sp<IBinder>& binder, const string& filePath) { +string getRecordingPath(const string& serviceName) { + // Service names may contain '/', replace them with '.' to avoid interpreting as path + string filename = serviceName; + std::replace(filename.begin(), filename.end(), '/', '.'); + return kStandardRecordingPath + filename; +} + +status_t startRecording(const string& serviceName) { + sp<IBinder> binder = + android::defaultServiceManager()->checkService(String16(serviceName.c_str())); + if (binder == nullptr) { + return android::BAD_VALUE; + } + + auto filePath = getRecordingPath(serviceName); if (auto mkdir_return = mkdir(kStandardRecordingPath, 0666); mkdir_return != 0 && errno != EEXIST) { std::cout << "Failed to create recordings directory.\n"; @@ -87,14 +101,20 @@ status_t startRecording(const sp<IBinder>& binder, const string& filePath) { } } -status_t stopRecording(const sp<IBinder>& binder) { +status_t stopRecording(const string& serviceName) { + sp<IBinder> binder = + android::defaultServiceManager()->checkService(String16(serviceName.c_str())); + if (binder == nullptr) { + return android::BAD_VALUE; + } + if (status_t err = binder->remoteBinder()->stopRecordingBinder(); err != NO_ERROR) { std::cout << "Failed to stop recording with error: " << err << '\n'; return err; - } else { - std::cout << "Recording stopped successfully.\n"; - return NO_ERROR; } + + std::cout << "Recording stopped successfully.\n"; + return NO_ERROR; } void printTransaction(const RecordedTransaction& transaction) { @@ -142,7 +162,8 @@ void incrementCtrlCCount(int signum) { } } -status_t listenToFile(const string& filePath) { +status_t listenToFile(const string& serviceName) { + auto filePath = getRecordingPath(serviceName); unique_fd listenFd(open(filePath.c_str(), O_RDONLY)); if (!listenFd.ok()) { std::cout << "Failed to open listening file with error: " << strerror(errno) << '\n'; @@ -229,45 +250,70 @@ const AnalyzerCommand helpCommand = {helpCommandEntryPoint, "Show help informati const AnalyzerCommand listCommand = {listAvailableInterfaces, "Prints a list of available interfaces.", "", ""}; +status_t startRecordingAllBinders() { + auto services = android::defaultServiceManager()->listServices(); + for (auto service : services) { + std::string serviceName = String8(service.c_str()).c_str(); + // Print failed service name. Don't exit early because it would leave the previous successful + // services recording. + if (status_t result = startRecording(serviceName); result != NO_ERROR) { + std::cout << "Failed to start binder recording on service : " << service << std::endl; + } + } + + return NO_ERROR; +} + status_t startCommandEntryPoint(int argc, char* argv[]) { if (argc != 3) { helpCommandEntryPoint(argc, argv); return android::BAD_VALUE; } - sp<IBinder> binder = android::defaultServiceManager()->checkService(String16(argv[2])); - if (binder == nullptr) { - helpCommandEntryPoint(argc, argv); - return android::BAD_VALUE; + string startOption = argv[2]; + if (startOption == "--all") { + return startRecordingAllBinders(); } - string filename = argv[2]; - std::replace(filename.begin(), filename.end(), '/', '.'); - auto filePath = kStandardRecordingPath + filename; - - return startRecording(binder, filePath); + return startRecording(startOption); } -const AnalyzerCommand startCommand = { - startCommandEntryPoint, "Start recording Binder transactions from a given service.", - "<service>", " <service>\tService to record. See 'dumpsys -l'"}; +const AnalyzerCommand startCommand = {startCommandEntryPoint, + "Start recording Binder transactions from a given service. " + "Use --all to start recoding all binders.", + "<service>, --all", + " <service>\tService to record. See 'dumpsys -l'"}; + +status_t stopRecordingAllBinders() { + auto services = android::defaultServiceManager()->listServices(); + for (auto service : services) { + std::string serviceName = String8(service.c_str()).c_str(); + // Print failed service name. Don't exit early because it would leave the other recordings on. + if (status_t result = stopRecording(serviceName); result != NO_ERROR) { + std::cout << "Failed to stop binder recording on service : " << service << std::endl; + } + } + + return NO_ERROR; +} status_t stopCommandEntryPoint(int argc, char* argv[]) { if (argc != 3) { helpCommandEntryPoint(argc, argv); return android::BAD_VALUE; } - - sp<IBinder> binder = android::defaultServiceManager()->checkService(String16(argv[2])); - if (binder == nullptr) { - helpCommandEntryPoint(argc, argv); - return android::BAD_VALUE; + string stopOption = argv[2]; + if (stopOption == "--all") { + stopRecordingAllBinders(); } - return stopRecording(binder); + + return stopRecording(stopOption); } const AnalyzerCommand stopCommand = { stopCommandEntryPoint, - "Stops recording Binder transactions from a given process. (See 'start')", "<service>", + "Stops recording Binder transactions from a given process. (See 'start') Use --all to stop " + "recoding all binders", + "<service>, --all", " <service>\tService to stop recording; <service> argument to previous 'start' command."}; status_t inspectCommandEntryPoint(int argc, char* argv[]) { @@ -292,19 +338,14 @@ status_t listenCommandEntryPoint(int argc, char* argv[]) { return android::BAD_VALUE; } - sp<IBinder> binder = android::defaultServiceManager()->checkService(String16(argv[2])); - - string filename = argv[2]; - std::replace(filename.begin(), filename.end(), '/', '.'); - auto filePath = kStandardRecordingPath + filename; - - if (status_t startErr = startRecording(binder, filePath); startErr != NO_ERROR) { + string serviceName = argv[2]; + if (status_t startErr = startRecording(serviceName); startErr != NO_ERROR) { return startErr; } - status_t listenStatus = listenToFile(filePath); + status_t listenStatus = listenToFile(serviceName); - if (status_t stopErr = stopRecording(binder); stopErr != NO_ERROR) { + if (status_t stopErr = stopRecording(serviceName); stopErr != NO_ERROR) { return stopErr; } |