我的Android应用程序中的数据?

我如何从我的Android应用程序获取崩溃数据(至少是堆栈跟踪)? 至少在通过电缆检索我自己的设备时,理想情况下是在我的应用程序的任何实例上运行,这样我可以改进它并使其更加稳定。


您可以尝试ACRA(Android应用程序崩溃报告)库:

ACRA是一个使Android应用程序能够将其崩溃报告自动发布到GoogleDoc表单的库。 它的目标是android应用程序开发人员帮助他们在应用程序崩溃或行为错误时从其获取数据。

它很容易安装在您的应用中,可高度配置,并且不需要您在任何地方托管服务器脚本......报告发送到Google Doc电子表格!


对于示例应用程序和调试目的,我使用了一个简单的解决方案,它允许我将堆栈跟踪写入设备的SD卡并/或上传到服务器。 这个解决方案受到了项目android-remote-stacktrace的启发(具体来说,保存到设备和上传到服务器的部分),我认为它解决了Soonil提到的问题。 这不是最优的,但它可以工作,如果你想在生产应用中使用它,你可以改进它。 如果您决定将堆栈跟踪上传到服务器,则可以使用php脚本( index.php )来查看它们。 如果你有兴趣,你可以在下面找到所有的源代码 - 为你的应用程序提供一个java类,为托管上传的stacktraces的服务器提供两个可选的php脚本。

在上下文中(例如主Activity),调用

if(!(Thread.getDefaultUncaughtExceptionHandler() instanceof CustomExceptionHandler)) {
    Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler(
            "/sdcard/<desired_local_path>", "http://<desired_url>/upload.php"));
}

CustomExceptionHandler

public class CustomExceptionHandler implements UncaughtExceptionHandler {

    private UncaughtExceptionHandler defaultUEH;

    private String localPath;

    private String url;

    /* 
     * if any of the parameters is null, the respective functionality 
     * will not be used 
     */
    public CustomExceptionHandler(String localPath, String url) {
        this.localPath = localPath;
        this.url = url;
        this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
    }

    public void uncaughtException(Thread t, Throwable e) {
        String timestamp = TimestampFormatter.getInstance().getTimestamp();
        final Writer result = new StringWriter();
        final PrintWriter printWriter = new PrintWriter(result);
        e.printStackTrace(printWriter);
        String stacktrace = result.toString();
        printWriter.close();
        String filename = timestamp + ".stacktrace";

        if (localPath != null) {
            writeToFile(stacktrace, filename);
        }
        if (url != null) {
            sendToServer(stacktrace, filename);
        }

        defaultUEH.uncaughtException(t, e);
    }

    private void writeToFile(String stacktrace, String filename) {
        try {
            BufferedWriter bos = new BufferedWriter(new FileWriter(
                    localPath + "/" + filename));
            bos.write(stacktrace);
            bos.flush();
            bos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void sendToServer(String stacktrace, String filename) {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);
        List<NameValuePair> nvps = new ArrayList<NameValuePair>();
        nvps.add(new BasicNameValuePair("filename", filename));
        nvps.add(new BasicNameValuePair("stacktrace", stacktrace));
        try {
            httpPost.setEntity(
                    new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
            httpClient.execute(httpPost);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

upload.php

<?php
    $filename = isset($_POST['filename']) ? $_POST['filename'] : "";
    $message = isset($_POST['stacktrace']) ? $_POST['stacktrace'] : "";
    if (!ereg('^[-a-zA-Z0-9_. ]+$', $filename) || $message == ""){
        die("This script is used to log debug data. Please send the "
                . "logging message and a filename as POST variables.");
    }
    file_put_contents($filename, $message . "n", FILE_APPEND);
?>

index.php

<?php
    $myDirectory = opendir(".");
    while($entryName = readdir($myDirectory)) {
        $dirArray[] = $entryName;
    }
    closedir($myDirectory);
    $indexCount = count($dirArray);
    sort($dirArray);
    print("<TABLE border=1 cellpadding=5 cellspacing=0 n");
    print("<TR><TH>Filename</TH><TH>Filetype</th><th>Filesize</TH></TR>n");
    for($index=0; $index < $indexCount; $index++) {
        if ((substr("$dirArray[$index]", 0, 1) != ".") 
                && (strrpos("$dirArray[$index]", ".stacktrace") != false)){ 
            print("<TR><TD>");
            print("<a href="$dirArray[$index]">$dirArray[$index]</a>");
            print("</TD><TD>");
            print(filetype($dirArray[$index]));
            print("</TD><TD>");
            print(filesize($dirArray[$index]));
            print("</TD></TR>n");
        }
    }
    print("</TABLE>n");
?>

您也可以尝试BugSense。 BugSense收集和分析所有崩溃报告,并为您提供有意义的可视化报告。 它是免费的,它只有1行代码才能集成。

免责声明:我是联合创始人

链接地址: http://www.djcxy.com/p/15093.html

上一篇: data from my Android application?

下一篇: Best way to invoke gdb from inside program to print its stacktrace?