【问题标题】:writing dumpstate to file android将转储状态写入文件android
【发布时间】:2012-01-25 22:05:36
【问题描述】:

我需要可以在 adb 中使用的 bugreport 选项来转到我的应用程序中 sd 上的文件。我发现Android; using exec("bugreport") 解释了您不能在常规shell 中运行错误报告,并且您需要分别运行dumpstate、dumpsys 和logcat 以获得相同的结果。这很好,我明白这一点,但我无法让 dumpstate 或 dumpsys 写入文件。下面的方法可以很好地使用 logcat -d -f 编写 logcat,但不适用于其他两个。我已经尝试了 dumpstate -f 、 dumpstate -d -f 和 dumpstate > 让它工作,但仍然没有向文件写入任何内容。有什么我缺少的东西来完成这项工作吗?
这是我在 sd 上创建文件的地方

File folder = new File(Environment.getExternalStorageDirectory()+"/IssueReport/");
    if (folder.isDirectory() == false) {
        folder.mkdir();
    }
    log = new File(Environment.getExternalStorageDirectory()+"/IssueReport/log.txt");

这是我将文件写入该位置的地方

private void submit() {
    try {
       log.createNewFile(); 
       String cmd = "dumpstate "+log.getAbsolutePath();
       Runtime.getRuntime().exec(cmd);
    } catch (IOException e) {
    e.printStackTrace();
    }

【问题讨论】:

    标签: android adb dump bug-reporting


    【解决方案1】:

    我让它工作了。我找到了Running Shell commands though java code on Android? 并对其进行了修改,使其能够像我需要的那样工作。

    private void submit() {
        try {
             String[] commands = {"dumpstate > /sdcard/log1.txt"};
             Process p = Runtime.getRuntime().exec("/system/bin/sh -");
             DataOutputStream os = new DataOutputStream(p.getOutputStream());
                for (String tmpCmd : commands) {
                    os.writeBytes(tmpCmd+"\n");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
    

    如果有人需要,这就是我一起运行所有内容的方式。该应用程序需要附加一个错误报告,通过阅读Running Shell commands though java code on Android?,我看到没有办法运行错误报告,只有三个组件:dumpstate、dumpsys 和 log。我分别生成每个报告,然后将它们全部合并到一个文件中以附加到电子邮件中。

    private void submit() {
        try {
             String[] commands = {"dumpstate > /sdcard/IssueReport/dumpstate.txt", 
                                  "dumpsys > /sdcard/IssueReport/dumpsys.txt",
                                  "logcat -d > /sdcard/IssueReport/log.txt",
                                  "cat /sdcard/IssueReport/dumpstate.txt /sdcard/IssueReport/dumpsys.txt /sdcard/IssueReport/log.txt > /sdcard/IssueReport/bugreport.rtf" };
             Process p = Runtime.getRuntime().exec("/system/bin/sh -");
             DataOutputStream os = new DataOutputStream(p.getOutputStream());
                for (String tmpCmd : commands) {
                        os.writeBytes(tmpCmd+"\n");
                }
            } catch (IOException e) {
                e.printStackTrace();    
            }
    

    【讨论】:

    • 做这行代码 Process p = Runtime.getRuntime().exec("/system/bin/sh -");把所有日志放在一起?如果我创建一个空项目并执行 submit() 方法,它会写以前的应用程序粉碎报告吗??