Change how we do debug dumps from the activity manager to make everything go through the activity manager interface (no more secondary interfaces), and use the command line arguments to control what gets dumped. The output from dumpsys without args still dumps everything. When just dumping the activity service, we now dump a subset of all of the am state that is interesting without being overwhelming. You can use "dumpsys activity -h" to get help with other things that can be dumped.
86 lines
2.2 KiB
C++
86 lines
2.2 KiB
C++
/*
|
|
* Command that dumps interesting system state to the log.
|
|
*
|
|
*/
|
|
|
|
#define LOG_TAG "dumpsys"
|
|
|
|
#include <utils/Log.h>
|
|
#include <binder/Parcel.h>
|
|
#include <binder/ProcessState.h>
|
|
#include <binder/IServiceManager.h>
|
|
#include <utils/TextOutput.h>
|
|
#include <utils/Vector.h>
|
|
|
|
#include <getopt.h>
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <sys/time.h>
|
|
|
|
using namespace android;
|
|
|
|
static int sort_func(const String16* lhs, const String16* rhs)
|
|
{
|
|
return lhs->compare(*rhs);
|
|
}
|
|
|
|
int main(int argc, char* const argv[])
|
|
{
|
|
sp<IServiceManager> sm = defaultServiceManager();
|
|
fflush(stdout);
|
|
if (sm == NULL) {
|
|
LOGE("Unable to get default service manager!");
|
|
aerr << "dumpsys: Unable to get default service manager!" << endl;
|
|
return 20;
|
|
}
|
|
|
|
Vector<String16> services;
|
|
Vector<String16> args;
|
|
if (argc == 1) {
|
|
services = sm->listServices();
|
|
services.sort(sort_func);
|
|
args.add(String16("-a"));
|
|
} else {
|
|
services.add(String16(argv[1]));
|
|
for (int i=2; i<argc; i++) {
|
|
args.add(String16(argv[i]));
|
|
}
|
|
}
|
|
|
|
const size_t N = services.size();
|
|
|
|
if (N > 1) {
|
|
// first print a list of the current services
|
|
aout << "Currently running services:" << endl;
|
|
|
|
for (size_t i=0; i<N; i++) {
|
|
sp<IBinder> service = sm->checkService(services[i]);
|
|
if (service != NULL) {
|
|
aout << " " << services[i] << endl;
|
|
}
|
|
}
|
|
}
|
|
|
|
for (size_t i=0; i<N; i++) {
|
|
sp<IBinder> service = sm->checkService(services[i]);
|
|
if (service != NULL) {
|
|
if (N > 1) {
|
|
aout << "------------------------------------------------------------"
|
|
"-------------------" << endl;
|
|
aout << "DUMP OF SERVICE " << services[i] << ":" << endl;
|
|
}
|
|
int err = service->dump(STDOUT_FILENO, args);
|
|
if (err != 0) {
|
|
aerr << "Error dumping service info: (" << strerror(err)
|
|
<< ") " << services[i] << endl;
|
|
}
|
|
} else {
|
|
aerr << "Can't find service: " << services[i] << endl;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|