Frameworks/base/cmds/bugreport

bugreport:启动dumpstatus服务,并通过socket连接,读取信息,并保持到stdout管道中

frameworks/native/cmds/dumpstatus

dumpstatusandroid的相关信息,内核,进程,相关信息的主要实现地方。我们就

frameworks/native/cmds/dumpysy

dumpsys: 获取android服务进程的各个信息,比如dumpsys media.audio_policy 等


dumpstate主要获取信息:

1,基本信息,如版本信息,内存基本信息,cpu基本信息,硬件信息等

2,系统log

3,网络信息,路由信息,网络撇之信息

4,panic信息

5,锁的使用信息

6,进程信息

7,binder信息

8,应用程序安装信息

9,磁盘使用情况

10,所有activity,services 信息

11,properties信息 等

通过费纳西 dumpstate工具代码,我们能有效的了解在android中过去各种信息,有针对性的对自己需要的信息进行获取。学到了linux的上层如果对系统

信息进行管理与统计的!


如要获取信息渠道:

1,cat proc各个节点获取想要信息

2,property_get各个属性的信息

3,run_commend去运行系统命令,获取需要的信息。主要是这样的方法

4,dumpsys命令


下面附上该函数的实现文件:

frameworks/native/cmds/dumpstate/dumpstate.c 文件:

//主要处理函数 与注释static void dumpstate() {    time_t now = time(NULL);//当前时间    char build[PROPERTY_VALUE_MAX], fingerprint[PROPERTY_VALUE_MAX];    char radio[PROPERTY_VALUE_MAX], bootloader[PROPERTY_VALUE_MAX];    char network[PROPERTY_VALUE_MAX], date[80];    char build_type[PROPERTY_VALUE_MAX];       //获取基本信息    property_get("ro.build.display.id", build, "(unknown)");    property_get("ro.build.fingerprint", fingerprint, "(unknown)");    property_get("ro.build.type", build_type, "(unknown)");    property_get("ro.baseband", radio, "(unknown)");    property_get("ro.bootloader", bootloader, "(unknown)");    property_get("gsm.operator.alpha", network, "(unknown)");    strftime(date, sizeof(date), "%Y-%m-%d %H:%M:%S", localtime(&now));    printf("========================================================\n");    printf("== dumpstate: %s\n", date);    printf("========================================================\n");    printf("\n");    printf("Build: %s\n", build);    printf("Bootloader: %s\n", bootloader);    printf("Radio: %s\n", radio);    printf("Network: %s\n", network);    printf("Kernel: ");//版本信息    dump_file(NULL, "/proc/version");    printf("Command line: %s\n", strtok(cmdline_buf, "\n"));    printf("\n");//运行外部命令:获取系统的开机时间,等相关信息    run_command("UPTIME", 10, "uptime", NULL);//内存概要信息    dump_file("MEMORY INFO", "/proc/meminfo");//CPU 信息    run_command("CPU INFO", 10, "top", "-n", "1", "-d", "1", "-m", "30", "-t", NULL);//内存快照工具 在xbin下面    run_command("PROCRANK", 20, "procrank", NULL);//内存详细信息    dump_file("VIRTUAL MEMORY STATS", "/proc/vmstat");    dump_file("VMALLOC INFO", "/proc/vmallocinfo");    dump_file("SLAB INFO", "/proc/slabinfo");    dump_file("ZONEINFO", "/proc/zoneinfo");    dump_file("PAGETYPEINFO", "/proc/pagetypeinfo");    dump_file("BUDDYINFO", "/proc/buddyinfo");    if (screenshot_path[0]) {        LOGI("taking screenshot\n");        run_command(NULL, 5, "su", "root", "screenshot", screenshot_path, NULL);        LOGI("wrote screenshot: %s\n", screenshot_path);    }//系统log    run_command("SYSTEM LOG", 20, "logcat", "-v", "threadtime", "-d", "*:v", NULL);    /* show the traces we collected in main(), if that was done */    if (dump_traces_path != NULL) {        dump_file("VM TRACES JUST NOW", dump_traces_path);    }    /* only show ANR traces if they're less than 15 minutes old */    struct stat st;    char anr_traces_path[PATH_MAX];    property_get("dalvik.vm.stack-trace-file", anr_traces_path, "");    if (!anr_traces_path[0]) {        printf("*** NO VM TRACES FILE DEFINED (dalvik.vm.stack-trace-file)\n\n");    } else if (stat(anr_traces_path, &st)) {        printf("*** NO ANR VM TRACES FILE (%s): %s\n\n", anr_traces_path, strerror(errno));    } else {        dump_file("VM TRACES AT LAST ANR", anr_traces_path);    }    // dump_file("EVENT LOG TAGS", "/etc/event-log-tags");    run_command("EVENT LOG", 20, "logcat", "-b", "events", "-v", "threadtime", "-d", "*:v", NULL);    run_command("RADIO LOG", 20, "logcat", "-b", "radio", "-v", "threadtime", "-d", "*:v", NULL);//netcfg 网络配置信息    run_command("NETWORK INTERFACES", 10, "su", "root", "netcfg", NULL);    dump_file("NETWORK DEV INFO", "/proc/net/dev");    dump_file("QTAGUID NETWORK INTERFACES INFO", "/proc/net/xt_qtaguid/iface_stat_all");    dump_file("QTAGUID CTRL INFO", "/proc/net/xt_qtaguid/ctrl");    run_command("QTAGUID STATS INFO", 10, "su", "root", "cat", "/proc/net/xt_qtaguid/stats", NULL);//路由情况    dump_file("NETWORK ROUTES", "/proc/net/route");    dump_file("NETWORK ROUTES IPV6", "/proc/net/ipv6_route");    run_command("IP RULES", 10, "ip", "rule", "show", NULL);    run_command("IP RULES v6", 10, "ip", "-6", "rule", "show", NULL);    run_command("ROUTE TABLE 60", 10, "ip", "route", "show", "table", "60", NULL);    run_command("ROUTE TABLE 61 v6", 10, "ip", "-6", "route", "show", "table", "60", NULL);    run_command("ROUTE TABLE 61", 10, "ip", "route", "show", "table", "61", NULL);    run_command("ROUTE TABLE 61 v6", 10, "ip", "-6", "route", "show", "table", "61", NULL);    dump_file("ARP CACHE", "/proc/net/arp");    run_command("IPTABLES", 10, "su", "root", "iptables", "-L", "-nvx", NULL);    run_command("IP6TABLES", 10, "su", "root", "ip6tables", "-L", "-nvx", NULL);    run_command("IPTABLE NAT", 10, "su", "root", "iptables", "-t", "nat", "-L", "-n", NULL);    run_command("IPT6ABLE NAT", 10, "su", "root", "ip6tables", "-t", "nat", "-L", "-n", NULL);    run_command("WIFI NETWORKS", 20,            "su", "root", "wpa_cli", "list_networks", NULL);    property_get("dhcp.wlan0.gateway", network, "");    if (network[0])        run_command("PING GATEWAY", 10, "su", "root", "ping", "-c", "3", "-i", ".5", network, NULL);    property_get("dhcp.wlan0.dns1", network, "");    if (network[0])        run_command("PING DNS1", 10, "su", "root", "ping", "-c", "3", "-i", ".5", network, NULL);    property_get("dhcp.wlan0.dns2", network, "");    if (network[0])        run_command("PING DNS2", 10, "su", "root", "ping", "-c", "3", "-i", ".5", network, NULL);#ifdef FWDUMP_bcm4329    run_command("DUMP WIFI STATUS", 20,            "su", "root", "dhdutil", "-i", "wlan0", "dump", NULL);    run_command("DUMP WIFI INTERNAL COUNTERS", 20,            "su", "root", "wlutil", "counters", NULL);#endif//    char ril_dumpstate_timeout[PROPERTY_VALUE_MAX] = {0};    property_get("ril.dumpstate.timeout", ril_dumpstate_timeout, "30");    if (strnlen(ril_dumpstate_timeout, PROPERTY_VALUE_MAX - 1) > 0) {        if (0 == strncmp(build_type, "user", PROPERTY_VALUE_MAX - 1)) {            // su does not exist on user builds, so try running without it.            // This way any implementations of vril-dump that do not require            // root can run on user builds.            run_command("DUMP VENDOR RIL LOGS", atoi(ril_dumpstate_timeout),                    "vril-dump", NULL);        } else {            run_command("DUMP VENDOR RIL LOGS", atoi(ril_dumpstate_timeout),                    "su", "root", "vril-dump", NULL);        }    }//打印 properties    print_properties();//打印系统信息    run_command("KERNEL LOG", 20, "dmesg", NULL);//打印锁信息    dump_file("KERNEL WAKELOCKS", "/proc/wakelocks");//打印cpu使用情况    dump_file("KERNEL CPUFREQ", "/sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state");    run_command("VOLD DUMP", 10, "vdc", "dump", NULL);    run_command("SECURE CONTAINERS", 10, "vdc", "asec", "list", NULL);//进程信息    run_command("PROCESSES", 10, "ps", "-P", NULL);    run_command("PROCESSES AND THREADS", 10, "ps", "-t", "-p", "-P", NULL);    run_command("LIBRANK", 10, "librank", NULL);//BINDER相关信息    dump_file("BINDER FAILED TRANSACTION LOG", "/sys/kernel/debug/binder/failed_transaction_log");    dump_file("BINDER TRANSACTION LOG", "/sys/kernel/debug/binder/transaction_log");    dump_file("BINDER TRANSACTIONS", "/sys/kernel/debug/binder/transactions");    dump_file("BINDER STATS", "/sys/kernel/debug/binder/stats");    dump_file("BINDER STATE", "/sys/kernel/debug/binder/state");//磁盘使用信息    run_command("FILESYSTEMS & FREE SPACE", 10, "su", "root", "df", NULL);//应用程序安装信息    dump_file("PACKAGE SETTINGS", "/data/system/packages.xml");    dump_file("PACKAGE UID ERRORS", "/data/system/uiderrors.txt");    dump_file("LAST KMSG", "/proc/last_kmsg");    run_command("LAST RADIO LOG", 10, "parse_radio_log", "/proc/last_radio_log", NULL);//panic信息    dump_file("LAST PANIC CONSOLE", "/data/dontpanic/apanic_console");    dump_file("LAST PANIC THREADS", "/data/dontpanic/apanic_threads");    for_each_pid(show_wchan, "BLOCKED PROCESS WAIT-CHANNELS");    printf("------ BACKLIGHTS ------\n");    printf("LCD brightness=");    dump_file(NULL, "/sys/class/leds/lcd-backlight/brightness");    printf("Button brightness=");    dump_file(NULL, "/sys/class/leds/button-backlight/brightness");    printf("Keyboard brightness=");    dump_file(NULL, "/sys/class/leds/keyboard-backlight/brightness");    printf("ALS mode=");    dump_file(NULL, "/sys/class/leds/lcd-backlight/als");    printf("LCD driver registers:\n");    dump_file(NULL, "/sys/class/leds/lcd-backlight/registers");    printf("\n");    run_command("LIST OF OPEN FILES", 10, "su", "root", "lsof", NULL);    for_each_pid(do_showmap, "SMAPS OF ALL PROCESSES");#ifdef BOARD_HAS_DUMPSTATE    printf("========================================================\n");    printf("== Board\n");    printf("========================================================\n");    dumpstate_board();    printf("\n");#endif    printf("========================================================\n");    printf("== Android Framework Services\n");    printf("========================================================\n");    /* the full dumpsys is starting to take a long time, so we need       to increase its timeout.  we really need to do the timeouts in       dumpsys itself... */    run_command("DUMPSYS", 60, "dumpsys", NULL);    printf("========================================================\n");    printf("== Running Application Activities\n");    printf("========================================================\n");    run_command("APP ACTIVITIES", 30, "dumpsys", "activity", "all", NULL);    printf("========================================================\n");    printf("== Running Application Services\n");    printf("========================================================\n");//使用dumpsys 打印activity 和 services的信息    run_command("APP SERVICES", 30, "dumpsys", "activity", "service", "all", NULL);    printf("========================================================\n");    printf("== dumpstate: done\n");    printf("========================================================\n");}


欢迎联系交流:jinpronet@gmail.com




更多相关文章

  1. Android(安卓)关于获取摄像头帧数据
  2. Android之使用HttpURLConnection进行网络访问
  3. Android_判断文件是否存在并创建代码
  4. Android这可能是当今最火,功能最全的快速开发框架了
  5. Android(安卓)获取应用的icon、名字、版本号
  6. android studio 获取sha1和md5值
  7. Android(安卓)获取IP地址的实现方法
  8. android平台解析epub格式的书籍信息
  9. Android从零开始(二)

随机推荐

  1. Android(安卓)NetworkCallback
  2. Android(安卓)Opencore OpenMAX学习(1)
  3. Android(安卓)读取Assets中图片
  4. 操作Android(安卓)手机通讯录数据库
  5. android环境配置
  6. Android入门三 Http通信(实例)
  7. android监听SD卡状态
  8. android 由entity创建创建表的sql语句
  9. Android(安卓)保持屏幕常亮
  10. 【工具类】Android判断SD卡状态