xref: /aosp_15_r20/frameworks/native/cmds/dumpsys/dumpsys.h (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright (C) 2016 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker #ifndef FRAMEWORK_NATIVE_CMD_DUMPSYS_H_
18*38e8c45fSAndroid Build Coastguard Worker #define FRAMEWORK_NATIVE_CMD_DUMPSYS_H_
19*38e8c45fSAndroid Build Coastguard Worker 
20*38e8c45fSAndroid Build Coastguard Worker #include <thread>
21*38e8c45fSAndroid Build Coastguard Worker 
22*38e8c45fSAndroid Build Coastguard Worker #include <android-base/unique_fd.h>
23*38e8c45fSAndroid Build Coastguard Worker #include <binder/IServiceManager.h>
24*38e8c45fSAndroid Build Coastguard Worker 
25*38e8c45fSAndroid Build Coastguard Worker namespace android {
26*38e8c45fSAndroid Build Coastguard Worker 
27*38e8c45fSAndroid Build Coastguard Worker class Dumpsys {
28*38e8c45fSAndroid Build Coastguard Worker   public:
Dumpsys(android::IServiceManager * sm)29*38e8c45fSAndroid Build Coastguard Worker     explicit Dumpsys(android::IServiceManager* sm) : sm_(sm) {
30*38e8c45fSAndroid Build Coastguard Worker     }
31*38e8c45fSAndroid Build Coastguard Worker     /**
32*38e8c45fSAndroid Build Coastguard Worker      * Main entry point into dumpsys.
33*38e8c45fSAndroid Build Coastguard Worker      */
34*38e8c45fSAndroid Build Coastguard Worker     int main(int argc, char* const argv[]);
35*38e8c45fSAndroid Build Coastguard Worker 
36*38e8c45fSAndroid Build Coastguard Worker     /**
37*38e8c45fSAndroid Build Coastguard Worker      * Returns a list of services.
38*38e8c45fSAndroid Build Coastguard Worker      * @param priorityFlags filter services by specified priorities
39*38e8c45fSAndroid Build Coastguard Worker      * @param supportsProto filter services that support proto dumps
40*38e8c45fSAndroid Build Coastguard Worker      * @return list of services
41*38e8c45fSAndroid Build Coastguard Worker      */
42*38e8c45fSAndroid Build Coastguard Worker     Vector<String16> listServices(int priorityFlags, bool supportsProto) const;
43*38e8c45fSAndroid Build Coastguard Worker 
44*38e8c45fSAndroid Build Coastguard Worker     /**
45*38e8c45fSAndroid Build Coastguard Worker      * Modifies @{code args} to add additional arguments  to indicate if the service
46*38e8c45fSAndroid Build Coastguard Worker      * must dump as proto or dump to a certian priority bucket.
47*38e8c45fSAndroid Build Coastguard Worker      * @param args initial list of arguments to pass to service dump method.
48*38e8c45fSAndroid Build Coastguard Worker      * @param asProto dump service as proto by passing an additional --proto arg
49*38e8c45fSAndroid Build Coastguard Worker      * @param priorityFlags indicates priority of dump by passing additional priority args
50*38e8c45fSAndroid Build Coastguard Worker      * to the service
51*38e8c45fSAndroid Build Coastguard Worker      */
52*38e8c45fSAndroid Build Coastguard Worker     static void setServiceArgs(Vector<String16>& args, bool asProto, int priorityFlags);
53*38e8c45fSAndroid Build Coastguard Worker 
54*38e8c45fSAndroid Build Coastguard Worker     enum Type {
55*38e8c45fSAndroid Build Coastguard Worker         TYPE_DUMP = 0x1,       // dump using `dump` function
56*38e8c45fSAndroid Build Coastguard Worker         TYPE_PID = 0x2,        // dump pid of server only
57*38e8c45fSAndroid Build Coastguard Worker         TYPE_STABILITY = 0x4,  // dump stability information of server
58*38e8c45fSAndroid Build Coastguard Worker         TYPE_THREAD = 0x8,     // dump thread usage of server only
59*38e8c45fSAndroid Build Coastguard Worker         TYPE_CLIENTS = 0x10,   // dump pid of clients
60*38e8c45fSAndroid Build Coastguard Worker     };
61*38e8c45fSAndroid Build Coastguard Worker 
62*38e8c45fSAndroid Build Coastguard Worker     /**
63*38e8c45fSAndroid Build Coastguard Worker      * Starts a thread to connect to a service and get its dump output. The thread redirects
64*38e8c45fSAndroid Build Coastguard Worker      * the output to a pipe. Thread must be stopped by a subsequent call to {@code
65*38e8c45fSAndroid Build Coastguard Worker      * stopDumpThread}.
66*38e8c45fSAndroid Build Coastguard Worker      * @param dumpTypeFlags operations to perform
67*38e8c45fSAndroid Build Coastguard Worker      * @param serviceName
68*38e8c45fSAndroid Build Coastguard Worker      * @param args list of arguments to pass to service dump method.
69*38e8c45fSAndroid Build Coastguard Worker      * @return {@code OK} thread is started successfully.
70*38e8c45fSAndroid Build Coastguard Worker      *         {@code NAME_NOT_FOUND} service could not be found.
71*38e8c45fSAndroid Build Coastguard Worker      *         {@code != OK} error
72*38e8c45fSAndroid Build Coastguard Worker      */
73*38e8c45fSAndroid Build Coastguard Worker     status_t startDumpThread(int dumpTypeFlags, const String16& serviceName,
74*38e8c45fSAndroid Build Coastguard Worker                              const Vector<String16>& args);
75*38e8c45fSAndroid Build Coastguard Worker 
76*38e8c45fSAndroid Build Coastguard Worker     /**
77*38e8c45fSAndroid Build Coastguard Worker      * Writes a section header to a file descriptor.
78*38e8c45fSAndroid Build Coastguard Worker      * @param fd file descriptor to write data
79*38e8c45fSAndroid Build Coastguard Worker      * @param serviceName
80*38e8c45fSAndroid Build Coastguard Worker      * @param priorityFlags dump priority specified
81*38e8c45fSAndroid Build Coastguard Worker      */
82*38e8c45fSAndroid Build Coastguard Worker     void writeDumpHeader(int fd, const String16& serviceName, int priorityFlags) const;
83*38e8c45fSAndroid Build Coastguard Worker 
84*38e8c45fSAndroid Build Coastguard Worker     /**
85*38e8c45fSAndroid Build Coastguard Worker      * Redirects service dump to a file descriptor. This requires
86*38e8c45fSAndroid Build Coastguard Worker      * {@code startDumpThread} to be called successfully otherwise the function will
87*38e8c45fSAndroid Build Coastguard Worker      * return {@code INVALID_OPERATION}.
88*38e8c45fSAndroid Build Coastguard Worker      * @param fd file descriptor to write data
89*38e8c45fSAndroid Build Coastguard Worker      * @param serviceName
90*38e8c45fSAndroid Build Coastguard Worker      * @param timeout timeout to terminate the dump if not completed
91*38e8c45fSAndroid Build Coastguard Worker      * @param asProto used to supresses additional output to the fd such as timeout
92*38e8c45fSAndroid Build Coastguard Worker      * error messages
93*38e8c45fSAndroid Build Coastguard Worker      * @param elapsedDuration returns elapsed time in seconds
94*38e8c45fSAndroid Build Coastguard Worker      * @param bytesWritten returns number of bytes written
95*38e8c45fSAndroid Build Coastguard Worker      * @return {@code OK} if successful
96*38e8c45fSAndroid Build Coastguard Worker      *         {@code TIMED_OUT} dump timed out
97*38e8c45fSAndroid Build Coastguard Worker      *         {@code INVALID_OPERATION} invalid state
98*38e8c45fSAndroid Build Coastguard Worker      *         {@code != OK} error
99*38e8c45fSAndroid Build Coastguard Worker      */
100*38e8c45fSAndroid Build Coastguard Worker     status_t writeDump(int fd, const String16& serviceName, std::chrono::milliseconds timeout,
101*38e8c45fSAndroid Build Coastguard Worker                        bool asProto, std::chrono::duration<double>& elapsedDuration,
102*38e8c45fSAndroid Build Coastguard Worker                        size_t& bytesWritten) const;
103*38e8c45fSAndroid Build Coastguard Worker 
104*38e8c45fSAndroid Build Coastguard Worker     /**
105*38e8c45fSAndroid Build Coastguard Worker      * Writes a section footer to a file descriptor with duration info.
106*38e8c45fSAndroid Build Coastguard Worker      * @param fd file descriptor to write data
107*38e8c45fSAndroid Build Coastguard Worker      * @param serviceName
108*38e8c45fSAndroid Build Coastguard Worker      * @param elapsedDuration duration of dump
109*38e8c45fSAndroid Build Coastguard Worker      */
110*38e8c45fSAndroid Build Coastguard Worker     void writeDumpFooter(int fd, const String16& serviceName,
111*38e8c45fSAndroid Build Coastguard Worker                          const std::chrono::duration<double>& elapsedDuration) const;
112*38e8c45fSAndroid Build Coastguard Worker 
113*38e8c45fSAndroid Build Coastguard Worker     /**
114*38e8c45fSAndroid Build Coastguard Worker      * Terminates dump thread.
115*38e8c45fSAndroid Build Coastguard Worker      * @param dumpComplete If {@code true}, indicates the dump was successfully completed and
116*38e8c45fSAndroid Build Coastguard Worker      * tries to join the thread. Otherwise thread is detached.
117*38e8c45fSAndroid Build Coastguard Worker      */
118*38e8c45fSAndroid Build Coastguard Worker     void stopDumpThread(bool dumpComplete);
119*38e8c45fSAndroid Build Coastguard Worker 
120*38e8c45fSAndroid Build Coastguard Worker     /**
121*38e8c45fSAndroid Build Coastguard Worker      * Returns file descriptor of the pipe used to dump service data. This assumes
122*38e8c45fSAndroid Build Coastguard Worker      * {@code startDumpThread} was called successfully.
123*38e8c45fSAndroid Build Coastguard Worker      */
getDumpFd()124*38e8c45fSAndroid Build Coastguard Worker     int getDumpFd() const {
125*38e8c45fSAndroid Build Coastguard Worker         return redirectFd_.get();
126*38e8c45fSAndroid Build Coastguard Worker     }
127*38e8c45fSAndroid Build Coastguard Worker 
128*38e8c45fSAndroid Build Coastguard Worker   private:
129*38e8c45fSAndroid Build Coastguard Worker     android::IServiceManager* sm_;
130*38e8c45fSAndroid Build Coastguard Worker     std::thread activeThread_;
131*38e8c45fSAndroid Build Coastguard Worker     mutable android::base::unique_fd redirectFd_;
132*38e8c45fSAndroid Build Coastguard Worker };
133*38e8c45fSAndroid Build Coastguard Worker }
134*38e8c45fSAndroid Build Coastguard Worker 
135*38e8c45fSAndroid Build Coastguard Worker #endif  // FRAMEWORK_NATIVE_CMD_DUMPSYS_H_
136