Refactor dumpsys to expose helper apis
- allow dumpstate to interact with services without executing dumpsys binary
- Remove "NORMAL" priority from section name for backwards compatibility when switching to version 2.0
Bug: 67716082
Test: mmm -j56 frameworks/native/cmds/dumpsys && \
adb sync data && \
adb shell /data/nativetest/dumpsys_test/dumpsys_test && \
adb shell /data/nativetest64/dumpsys_test/dumpsys_test && \
printf "\n\n#### ALL TESTS PASSED ####\n"
Test: manual tests with "adb bugreport"
Change-Id: I4198333a58ffe6cb521b5cb7066520c7a3ef0675
diff --git a/cmds/dumpsys/dumpsys.h b/cmds/dumpsys/dumpsys.h
index 2534dde..1d78aa4 100644
--- a/cmds/dumpsys/dumpsys.h
+++ b/cmds/dumpsys/dumpsys.h
@@ -17,6 +17,9 @@
#ifndef FRAMEWORK_NATIVE_CMD_DUMPSYS_H_
#define FRAMEWORK_NATIVE_CMD_DUMPSYS_H_
+#include <thread>
+
+#include <android-base/unique_fd.h>
#include <binder/IServiceManager.h>
namespace android {
@@ -25,10 +28,97 @@
public:
Dumpsys(android::IServiceManager* sm) : sm_(sm) {
}
+ /**
+ * Main entry point into dumpsys.
+ */
int main(int argc, char* const argv[]);
+ /**
+ * Returns a list of services.
+ * @param priorityFlags filter services by specified priorities
+ * @param supportsProto filter services that support proto dumps
+ * @return list of services
+ */
+ Vector<String16> listServices(int priorityFlags, bool supportsProto) const;
+
+ /**
+ * Modifies @{code args} to add additional arguments to indicate if the service
+ * must dump as proto or dump to a certian priority bucket.
+ * @param args initial list of arguments to pass to service dump method.
+ * @param asProto dump service as proto by passing an additional --proto arg
+ * @param priorityFlags indicates priority of dump by passing additional priority args
+ * to the service
+ */
+ void setServiceArgs(Vector<String16>& args, bool asProto, int priorityFlags) const;
+
+ /**
+ * Starts a thread to connect to a service and get its dump output. The thread redirects
+ * the output to a pipe. Thread must be stopped by a subsequent callto {@code
+ * stopDumpThread}.
+ * @param serviceName
+ * @param args list of arguments to pass to service dump method.
+ * @return {@code OK} thread is started successfully.
+ * {@code NAME_NOT_FOUND} service could not be found.
+ * {@code != OK} error
+ */
+ status_t startDumpThread(const String16& serviceName, const Vector<String16>& args);
+
+ /**
+ * Writes a section header to a file descriptor.
+ * @param fd file descriptor to write data
+ * @param serviceName
+ * @param priorityFlags dump priority specified
+ */
+ void writeDumpHeader(int fd, const String16& serviceName, int priorityFlags) const;
+
+ /**
+ * Redirects service dump to a file descriptor. This requires
+ * {@code startDumpThread} to be called successfully otherwise the function will
+ * return {@code INVALID_OPERATION}.
+ * @param fd file descriptor to write data
+ * @param serviceName
+ * @param timeout timeout to terminate the dump if not completed
+ * @param asProto used to supresses additional output to the fd such as timeout
+ * error messages
+ * @param elapsedDuration returns elapsed time in seconds
+ * @param bytesWritten returns number of bytes written
+ * @return {@code OK} if successful
+ * {@code TIMED_OUT} dump timed out
+ * {@code INVALID_OPERATION} invalid state
+ * {@code != OK} error
+ */
+ status_t writeDump(int fd, const String16& serviceName, std::chrono::milliseconds timeout,
+ bool asProto, std::chrono::duration<double>& elapsedDuration,
+ size_t& bytesWritten) const;
+
+ /**
+ * Writes a section footer to a file descriptor with duration info.
+ * @param fd file descriptor to write data
+ * @param serviceName
+ * @param elapsedDuration duration of dump
+ */
+ void writeDumpFooter(int fd, const String16& serviceName,
+ const std::chrono::duration<double>& elapsedDuration) const;
+
+ /**
+ * Terminates dump thread.
+ * @param dumpComplete If {@code true}, indicates the dump was successfully completed and
+ * tries to join the thread. Otherwise thread is detached.
+ */
+ void stopDumpThread(bool dumpComplete);
+
+ /**
+ * Returns file descriptor of the pipe used to dump service data. This assumes
+ * {@code startDumpThread} was called successfully.
+ */
+ int getDumpFd() const {
+ return redirectFd_.get();
+ }
+
private:
android::IServiceManager* sm_;
+ std::thread activeThread_;
+ mutable android::base::unique_fd redirectFd_;
};
}