안드로이드 애플리케이션에서 충돌 데이터를 가져오려면 어떻게 해야 합니까?
안드로이드 애플리케이션에서 충돌 데이터(적어도 스택 추적)를 가져오려면 어떻게 해야 합니까?적어도 케이블을 통해 검색되는 자체 장치에서 작업할 때는 이상적인 방법이지만, 애플리케이션을 개선하고 보다 견고하게 만들 수 있도록 하는 것이 좋습니다.
ACRA(Application Crash Report for Android) 라이브러리를 사용해 보십시오.
ACRA는 Android 응용 프로그램이 Google Doc 양식에 충돌 보고서를 자동으로 게시할 수 있는 라이브러리입니다.이는 안드로이드 애플리케이션 개발자들이 충돌하거나 잘못 행동할 때 애플리케이션에서 데이터를 얻는 데 도움을 주기 위한 것입니다.
애플리케이션에 쉽게 설치할 수 있고 구성이 용이하며 어디서든 서버 스크립트를 호스팅할 필요가 없습니다.보고서가 Google Doc 스프레드시트로 전송됩니다!
샘플 애플리케이션 및 디버깅을 위해 스택 추적을 장치의 sd 카드에 기록하거나 서버에 업로드할 수 있는 간단한 솔루션을 사용합니다.이 솔루션은 Project roid-remote-stack trace(구체적으로 Save-to-device 및 Upload-to-server 부품)에서 영감을 얻었으며, 순일이 언급한 문제를 해결한다고 생각합니다.최적은 아니지만 작동하고 프로덕션 애플리케이션에서 사용하려면 개선할 수 있습니다.스택 추적을 서버에 업로드하기로 결정한 경우 php 스크립트를 사용할 수 있습니다.index.php을하여 확인합니다.를 클릭하여 확인합니다.당신이 관심이 있다면, 당신은 아래의 모든 소스를 찾을 수 있습니다 - 당신의 애플리케이션을 위한 하나의 자바 클래스와 업로드된 스택 추적을 호스팅하는 서버를 위한 두 개의 선택적인 php 스크립트.
컨텍스트(예: 주 활동)에서 통화
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");
?>
시도해 볼 수도 있습니다.
[버그센스] Reason: Spam Redirect to another urlBugSense는 모든 충돌 보고서를 수집하고 분석하여 의미 있고 시각적인 보고서를 제공합니다.이것은 무료이며 통합하기 위해 코드 한 줄만 사용할 수 있습니다.
고지 사항:나는 공동 설립자입니다.
Android 2.2에서는 이제 Android Market Applications에서 Crash Reports를 자동으로 가져올 수 있습니다.
Android Market 앱을 위한 새로운 버그 보고 기능을 통해 개발자는 사용자로부터 충돌 및 동결 보고서를 수신할 수 있습니다.보고서는 게시자 계정에 로그인할 때 사용할 수 있습니다.
http://developer.android.com/sdk/android-2.2-highlights.html
는 다을사이예처수있리다습니로 처리할 수.Thread.setDefaultUncaughtExceptionHandler()그러나 이것은 Android의 예외 처리 방법을 방해하는 것으로 보입니다.다음과 같은 유형의 핸들러를 사용하려고 했습니다.
private class ExceptionHandler implements Thread.UncaughtExceptionHandler {
@Override
public void uncaughtException(Thread thread, Throwable ex){
Log.e(Constants.TAG, "uncaught_exception_handler: uncaught exception in thread " + thread.getName(), ex);
//hack to rethrow unchecked exceptions
if(ex instanceof RuntimeException)
throw (RuntimeException)ex;
if(ex instanceof Error)
throw (Error)ex;
//this should really never happen
Log.e(Constants.TAG, "uncaught_exception handler: unable to rethrow checked exception");
}
}
하지만 예외를 다시 적용해도 원하는 동작, 즉 안드로이드가 구성 요소를 종료하도록 허용하면서 예외를 기록할 수 없었기 때문에 잠시 후에 이를 포기했습니다.
질문이 너무 오래된 것 같아서 제 답변이 같은 문제를 가진 다른 사람들에게 도움이 되길 바랍니다.
크래시리틱스를 시도해 보십시오.응용 프로그램이 있는 모든 장치의 모든 충돌에 대한 자세한 정보를 제공하고 이메일로 알림을 보냅니다.그리고 가장 좋은 점은 완전히 자유롭게 사용할 수 있다는 것입니다.
네, 저는 runn과 soonil에서 제공한 샘플을 보고 오류 처리를 망치지 않는 솔루션을 찾았습니다.
사용자 지정 수정ExceptionHandler는 새 스레드와 연결된 스레드에서 원본 UncaughtExceptionHandler를 저장합니다.새로운 "uncaughtException"-Method 저장된 UncaughtExceptionHandler를 사용하여 이전 함수를 호출합니다.
기본값으로ExceptionHandler 클래스 다음과 같은 것이 필요합니다.
public class DefaultExceptionHandler implements UncaughtExceptionHandler{
private UncaughtExceptionHandler mDefaultExceptionHandler;
//constructor
public DefaultExceptionHandler(UncaughtExceptionHandler pDefaultExceptionHandler)
{
mDefaultExceptionHandler= pDefaultExceptionHandler;
}
public void uncaughtException(Thread t, Throwable e) {
//do some action like writing to file or upload somewhere
//call original handler
mStandardEH.uncaughtException(t, e);
// cleanup, don't know if really required
t.getThreadGroup().destroy();
}
}
http://code.google.com/p/android-remote-stacktrace 의 코드를 수정하면 웹 서버 또는 sd-card에 필드에 로그인할 수 있습니다.
Google Play Developers Console은 실제로 충돌하여 보고서를 보낸 앱의 스택 추적을 제공합니다. 또한 아래 예를 참조하여 정보를 볼 수 있도록 매우 유용한 차트를 제공합니다.

저는 제 안드로이드와 iOS 앱을 위해 크리터칼리즘을 사용해왔습니다. 테크크런치에서 그들에 대해 들었습니다.지금까지 그들과 함께해서 꽤 행복합니다!
저는 여기서 저만의 버전을 만들었습니다: http://androidblogger.blogspot.com/2009/12/how-to-improve-your-application-crash.html
기본적으로 동일하지만 보고서를 보내기 위해 http 연결이 아닌 메일을 사용하고 있으며, 더 중요한 것은 응용 프로그램 버전, OS 버전, 전화 모델 또는 사용 가능한 메모리와 같은 정보를 보고서에 추가했습니다.
이를 통해 예외 세부 정보를 가져옵니다.
String stackTrace = Log.getStackTraceString(exception);
데이터베이스에 저장하고 로그를 유지합니다.
또한 라이브러리만 사용하는 것이 아니라 전체(단순) 서비스를 사용할 수 있습니다.우리 회사는 그것만을 위한 서비스를 막 출시했습니다: http://apphance.com .
5분 안에 추가 및 통합할 수 있는 간단한 .jar 라이브러리(Android용)가 있습니다. 그러면 라이브러리는 충돌 정보뿐만 아니라 실행 중인 응용 프로그램에서 로그도 수집할 수 있을 뿐만 아니라 테스터가 전체 컨텍스트(장치 회전, WiFi 연결 여부 등)를 포함하여 장치에서 직접 문제를 보고할 수 있습니다.애플리케이션, 충돌, 로그, 통계 등의 세션을 추적할 수 있는 매우 유용한 웹 패널을 사용하여 로그를 볼 수 있습니다.서비스는 현재 비공개 베타 테스트 단계에 있지만 액세스를 요청할 수 있으며 매우 신속하게 제공합니다.
고지 사항:저는 Polidea의 CTO이자 서비스의 공동 제작자입니다.
요즘 Firebase Crash 보고서는 매우 인기가 많고 사용하기 쉽습니다.자세한 내용은 다음 링크를 참조하십시오.파이어베이스 충돌 보고
도움이 되길 바랍니다.
에 있는 .Stackoverflow제가 이 답을 찾는 것을 돕는 것.
원격 Android 충돌 보고서를 이메일에서 직접 찾을 수 있습니다.이메일을 커스텀 안에 넣어야 한다는 것을 기억하세요.예외 처리기 클래스입니다.
public static String sendErrorLogsTo = "tushar.pandey@virtualxcellence.com" ;
필요한 단계:
첫 번째) 활동 만들기에서 코드의 이 섹션을 사용합니다.
if(!(Thread.getDefaultUncaughtExceptionHandler() instanceof CustomExceptionHandler)) {
Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler(this));
}
2번째) 이 재정의된 버전의 사용자 지정 사용내 php스크립트에 따라 (runn)의 예외 처리기 클래스.
package com.vxmobilecomm.activity;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.Thread.UncaughtExceptionHandler;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.BufferedHttpEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.AsyncTask;
import android.util.Log;
public class CustomExceptionHandler implements UncaughtExceptionHandler {
private UncaughtExceptionHandler defaultUEH;
public static String sendErrorLogsTo = "tushar.pandey@virtualxcellence.com" ;
Activity activity;
public CustomExceptionHandler(Activity activity) {
this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
this.activity = activity;
}
public void uncaughtException(Thread t, Throwable e) {
final Writer result = new StringWriter();
final PrintWriter printWriter = new PrintWriter(result);
e.printStackTrace(printWriter);
String stacktrace = result.toString();
printWriter.close();
String filename = "error" + System.nanoTime() + ".stacktrace";
Log.e("Hi", "url != null");
sendToServer(stacktrace, filename);
StackTraceElement[] arr = e.getStackTrace();
String report = e.toString() + "\n\n";
report += "--------- Stack trace ---------\n\n";
for (int i = 0; i < arr.length; i++) {
report += " " + arr[i].toString() + "\n";
}
report += "-------------------------------\n\n";
report += "--------- Cause ---------\n\n";
Throwable cause = e.getCause();
if (cause != null) {
report += cause.toString() + "\n\n";
arr = cause.getStackTrace();
for (int i = 0; i < arr.length; i++) {
report += " " + arr[i].toString() + "\n";
}
}
report += "-------------------------------\n\n";
defaultUEH.uncaughtException(t, e);
}
private void sendToServer(String stacktrace, String filename) {
AsyncTaskClass async = new AsyncTaskClass(stacktrace, filename,
getAppLable(activity));
async.execute("");
}
public String getAppLable(Context pContext) {
PackageManager lPackageManager = pContext.getPackageManager();
ApplicationInfo lApplicationInfo = null;
try {
lApplicationInfo = lPackageManager.getApplicationInfo(
pContext.getApplicationInfo().packageName, 0);
} catch (final NameNotFoundException e) {
}
return (String) (lApplicationInfo != null ? lPackageManager
.getApplicationLabel(lApplicationInfo) : "Unknown");
}
public class AsyncTaskClass extends AsyncTask<String, String, InputStream> {
InputStream is = null;
String stacktrace;
final String filename;
String applicationName;
AsyncTaskClass(final String stacktrace, final String filename,
String applicationName) {
this.applicationName = applicationName;
this.stacktrace = stacktrace;
this.filename = filename;
}
@Override
protected InputStream doInBackground(String... params)
{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(
"http://suo-yang.com/books/sendErrorLog/sendErrorLogs.php?");
Log.i("Error", stacktrace);
try {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(
6);
nameValuePairs.add(new BasicNameValuePair("data", stacktrace));
nameValuePairs.add(new BasicNameValuePair("to",sendErrorLogsTo));
nameValuePairs.add(new BasicNameValuePair("subject",applicationName));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity1 = response.getEntity();
BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(
entity1);
is = bufHttpEntity.getContent();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return is;
}
@Override
protected void onPostExecute(InputStream result) {
super.onPostExecute(result);
Log.e("Stream Data", getStringFromInputStream(is));
}
}
// convert InputStream to String
private static String getStringFromInputStream(InputStream is) {
BufferedReader br = null;
StringBuilder sb = new StringBuilder();
String line;
try {
br = new BufferedReader(new InputStreamReader(is));
while ((line = br.readLine()) != null) {
sb.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return sb.toString();
}
}
Google Firebase는 Google의 최신(2016) 방식으로 사용자의 전화기에 충돌/오류 데이터를 제공합니다.build.gradle 파일에 포함합니다.
compile 'com.google.firebase:firebase-crash:9.0.0'
치명적인 충돌은 사용자 입력 없이 자동으로 기록되며 치명적이지 않은 충돌이나 다음과 같은 다른 이벤트도 기록할 수 있습니다.
try
{
}
catch(Exception ex)
{
FirebaseCrash.report(new Exception(ex.toString()));
}
셜록이라는 안드로이드 도서관이 있습니다.장치 및 응용 프로그램 정보와 함께 충돌에 대한 전체 보고서를 제공합니다.충돌이 발생할 때마다 알림 표시줄에 알림이 표시되고 알림을 클릭하면 충돌 세부 정보가 열립니다.또한 전자 메일 또는 다른 공유 옵션을 통해 다른 사람과 충돌 세부 정보를 공유할 수 있습니다.
설치
android {
dataBinding {
enabled = true
}
}
compile('com.github.ajitsing:sherlock:1.0.0@aar') {
transitive = true
}
데모
이 페이지의 많은 답변은 유용하지만 오래된 답변이 되기 쉽습니다.AppBrain 웹 사이트는 최신의 가장 인기 있는 충돌 보고 솔루션을 찾을 수 있도록 통계를 집계합니다.
이 사진을 게시할 당시 앱의 5.24%와 설치의 12.38%에서 Crashlytics가 사용되고 있음을 알 수 있습니다.
이것은 매우 잔인하지만, 어디서든 logcat을 실행할 수 있기 때문에 빠르고 더러운 해킹은 모든 캐치 블록에 추가됩니다.getRuntime().exec("logcat >> /sdcard/logcat.log");
패브릭이라는 도구가 있습니다. 이 도구는 충돌 분석 도구입니다. 이 도구를 사용하면 애플리케이션이 실시간으로 배포되었을 때와 개발 중에 충돌 보고서를 얻을 수 있습니다.애플리케이션에 이 도구를 추가하는 것도 간단했습니다.응용 프로그램 충돌이 발생하면 fabric.io 대시보드에서 충돌 보고서를 볼 수 있습니다. .thw 보고서가 캡처되었습니다. automatically.it 는 사용자에게 권한을 요청하지 않습니다.버그/충돌 보고서를 보낼지 여부.그리고 이건 완전히 무료야...https://get.fabric.io/
우리는 회사 내부에서 자체 개발한 시스템을 사용하고 있으며 매우 유용합니다.이것은 보고서를 받고 분석을 하는 서버와 서버에 충돌 보고서를 보내는 안드로이드 라이브러리입니다.예외 이름, 스택 추적, 메시지별 서버 그룹 예외수정해야 하는 가장 중요한 문제를 식별하는 데 도움이 됩니다.저희 서비스는 현재 공개 베타 버전이므로 누구나 이용해 볼 수 있습니다.http://watchcat.co 에서 계정을 생성하거나 데모 액세스 http://watchcat.co/reports/index.php?demo 을 사용하여 계정이 어떻게 작동하는지 확인할 수 있습니다.
만약 당신이 즉시 답을 원한다면, 당신은 logcat를 사용할 수 있습니다.
$adb shell logcat -f /sdcard/logoutput.txt *:E
로그에 정크가 너무 많은 경우 먼저 로그를 삭제해 보십시오.
$adb shell logcat -c
그런 다음 앱을 실행하고 로그캣을 다시 실행해 보십시오.
오류 보고서를 추적할 수 있는 훌륭한 웹 애플리케이션을 하나 더 찾았습니다.
구성할 단계 수가 적습니다.
- 위 링크를 사용하여 로그인하거나 등록 및 구성합니다.응용프로그램을 만들면 아래와 같이 구성할 줄이 제공됩니다.
Mint.initAndStartSession(YourActivity.this, "api_key");
- 응용 프로그램의 build.gradl에 다음을 추가합니다.
android { ... repositories { maven { url "https://mint.splunk.com/gradle/"} } ... } dependencies { ... compile "com.splunk.mint:mint:4.4.0" ... }
- 위에 복사한 코드를 추가하여 모든 활동에 추가합니다.
Mint.initAndStartSession(사용자 활동).이 "api_key";";
바로 그겁니다.로그인하고 애플리케이션 대시보드로 이동하면 모든 오류 보고서가 표시됩니다.
누군가에게 도움이 되길 바랍니다.
대체 충돌 보고/사고 추적 서비스는 Raygun.io 을 확인하십시오. 앱에 연결할 때의 적절한 사용자 경험(기본 활동에 코드 두 줄과 Android Manifest에 붙여넣은 XML 몇 줄)을 포함하여 Android 충돌을 처리하는 데 유용한 논리를 많이 제공합니다.
앱이 손상되면 자동으로 스택 추적, 하드/소프트웨어 환경 데이터, 사용자 추적 정보, 지정한 사용자 지정 데이터 등을 가져옵니다.UI 스레드가 차단되지 않도록 비동기식으로 API에 게시하고 사용 가능한 네트워크가 없으면 디스크에 캐시합니다.
고지 사항:안드로이드 제공자를 만들었습니다 :)
방금 구글 양식을 백엔드로 사용하는 ACRA https://github.com/ACRA/acra 을 사용하기 시작했으며 설정 및 사용이 매우 쉬우며 기본값입니다.
그러나 Google 양식으로 보고서를 보내는 것은 더 이상 권장되지 않습니다(그 후 삭제됨). https://plus.google.com/118444843928759726538/posts/GTTgsrEQdN6 https://github.com/ACRA/acra/wiki/Notice-on-Google-Form-Spreadsheet-usage
어쨌든 자신의 발신인 https://github.com/ACRA/acra/wiki/AdvancedUsage#wiki-Implementing_your_own_sender 을 정의할 수 있습니다. 예를 들어 이메일 발신인을 시도할 수 있습니다.
최소한의 노력으로 bugsense에 보고서를 보낼 수 있습니다. http://www.bugsense.com/docs/android#acra
NB Bugsense 무료 계정은 보고서/월 500개로 제한됩니다.
파티에 늦은 저는 ACRA가 그 중에서도 가장 좋은 선택이라고 생각하고 지지합니다.설정 및 구성이 쉽습니다.저는 ACRA를 사용하여 충돌 보고서를 가져오고 MandrillAp를 사용하여 제 이메일 주소로 같은 내용을 메일로 보내기 위해 모든 곳에서 입력된 세부 가이드를 만들었습니다.
게시물 링크: https://androidician.wordpress.com/2015/03/29/sending-crash-reports-with-acra-over-email-using-mandrill/
github의 샘플 프로젝트 링크: https://github.com/ayushhgoyal/AcraSample
저는 우리가 이 목적을 위해 설계한 벅스내그의 설립자 중 한 명입니다.Bugsnag는 Android 앱에서 처리되지 않은 예외를 자동으로 캡처하여 대시보드로 전송합니다. 대시보드에서 수정 사항의 우선순위를 지정하고 진단 정보를 자세히 살펴볼 수 있습니다.
다음은 충돌 보고 시스템을 선택하거나 구축할 때 고려해야 할 몇 가지 중요한 사항과 일부 코드 스니펫입니다.
- 처리되지 않은 예외를 자동으로 탐지합니다(예: 코드).
- 메모리 사용량, 장치 정보 등의 진단 데이터(예: 코드)를 수집
- 근본 원인별로 충돌을 효과적으로 그룹화
- 각 충돌 전에 사용자가 수행한 작업을 추적하여 재현할 수 있습니다(예: 코드).
Android에서 충돌 처리/보고와 관련된 몇 가지 모범 사례를 보려면 완전히 오픈 소스인 Bugsnag의 충돌 보고 라이브러리의 전체 소스 코드를 확인할 수 있습니다. 이것을 찢어서 자신의 애플리케이션에 사용하세요!
구글은 당신이 실제로 받는 충돌 보고서의 양을 변경했습니다.이전에는 수동으로 보고된 버그 보고서만 받았습니다.
마지막 개발자 회의와 Android Vitals의 소개 이후 진단 데이터를 공유할 수 있는 사용자로부터 충돌 보고서도 받습니다.
사용자가 사용 및 진단 데이터를 자동으로 공유하도록 선택한 Android 장치에서 수집된 모든 충돌을 볼 수 있습니다.지난 두 달 동안 데이터를 사용할 수 있습니다.
다른 사람이 앱을 다운로드하고 원격 장치에서 충돌하는 경우 Android 오류 보고 라이브러리(이 SO 게시물 참조)를 조사하는 것이 좋습니다.로컬 장치에만 있는 경우 LogCat을 사용할 수 있습니다.충돌이 발생했을 때 장치가 호스트 시스템에 연결되지 않은 경우에도 장치를 연결하고 adb logcat 명령을 실행하면 전체 로그 기록이 다운로드됩니다(최소한 버퍼링되는 정도까지는 보통 로그 데이터가 대량이지만 무한하지 않습니다).두 옵션 중 하나가 질문에 대답합니까?그렇지 않다면 무엇을 더 찾고 있는지 좀 더 명확하게 설명해 주시겠습니까?
Flurry 분석은 충돌 정보, 하드웨어 모델, 안드로이드 버전 및 라이브 앱 사용 통계를 제공합니다.새로운 SDK에서는 http://www.flurry.com/flurry-crash-analytics.html 에서 보다 자세한 충돌 정보를 제공하는 것으로 보입니다.
Android Studio에서 직접 수행할 수 있습니다.휴대폰을 연결하고 앱을 실행한 후 크래시하면 Android Studio에서 바로 스택 추적을 볼 수 있습니다.
언급URL : https://stackoverflow.com/questions/601503/how-do-i-obtain-crash-data-from-my-android-application
'programing' 카테고리의 다른 글
| iOS 애플리케이션에서 n분마다 백그라운드 위치 업데이트를 받으려면 어떻게 해야 합니까? (0) | 2023.06.01 |
|---|---|
| 일치하는 줄 뒤에서 시작하여 파일의 모든 줄을 삭제하려면 어떻게 해야 합니까? (0) | 2023.06.01 |
| 스토어를 여는 데 사용된 모델이 스토어를 만드는 데 사용된 모델과 호환되지 않습니다. (0) | 2023.06.01 |
| Node.jsfs.readdir 재귀 디렉터리 검색 (0) | 2023.06.01 |
| HTML 페이지에서 스크롤 막대 숨기기 (0) | 2023.06.01 |

