W usłudze Analytics występuje otwarty problem. Mam przeżywa ten sam problem, ale na prawdziwych urządzeniach z API 10 do 19.
https://code.google.com/p/analytics-issues/issues/detail?id=443
Edit1: usunięto pytanie, wystarczy odpowiedzieć na pytanie opisany.
EDIT2: Próbowałem przechwycić i wysłać wyjątki za pomocą modułu Analytics ExceptionBuilder, ale nie zadziałało.
Wygląda na to, że raport został wysłany (przynajmniej LogCat pokazuje, że nastąpiła awaria), ale nie jest przetwarzany przez Analytics.
Podczas gdy Google odpowiada na problem, używam tego obejścia. Myślę, że nie jest to najlepsze rozwiązanie, a kod można poprawić, ale to działa na mnie:
stworzyłem niestandardowy wymiar w Analytics po to kroki https://support.google.com/analytics/answer/2709829?hl=en
w moim app, stworzyłem niestandardową procedurę obsługi wyjątków, korzystając z klasy Analytics ExceptionReporter. Gdy zostanie wychwycony wyjątek, otrzymuję ślad stosu i obcina go do 150 bajtów (w rzeczywistości otrzymuję tylko pierwszą linię stosu i obcina ją do 150 znaków, zakładam, że 1Char = 1 Bajt). Muszę go skrócić, ponieważ jest to maksymalna długość dozwolona przez Analytics przy wysyłaniu wartości niestandardowych wymiarów. Śledzenie stosu jest przechowywane we współużytkowanej preferencji, a nie wysyłane. Próbowałem wysłać go bezpośrednio, ale nie działa, gdy aplikacja się zawiesiła.
package com.company.package;
import java.lang.Thread.UncaughtExceptionHandler;
import android.content.Context;
import com.google.android.gms.analytics.ExceptionParser;
import com.google.android.gms.analytics.ExceptionReporter;
import com.google.android.gms.analytics.GoogleAnalytics;
import com.google.android.gms.analytics.HitBuilders;
import com.google.android.gms.analytics.Tracker;
public class GoogleAnalyticsTracker {
private static Tracker mTracker;
private static GoogleAnalytics mGa;
private Context mContext;
public GoogleAnalyticsTracker(Context context, int resource) {
mContext = context;
mGa = GoogleAnalytics.getInstance(context);
mTracker = getTracker(resource);
Thread.setDefaultUncaughtExceptionHandler(new AnalyticsExceptionReporter(mTracker,
Thread.getDefaultUncaughtExceptionHandler(), context));
}
synchronized Tracker getTracker(int xmlResource) {
return mGa.newTracker(xmlResource);
}
public void sendScreenLabel(String screenLabel) {
mTracker.setScreenName(screenLabel);
mTracker.send(new HitBuilders.AppViewBuilder().build());
}
public void sendCustomDimension(int index, String value) {
mTracker.send(new HitBuilders.AppViewBuilder().setCustomDimension(index, value).build());
}
private class AnalyticsExceptionReporter extends ExceptionReporter {
public AnalyticsExceptionReporter(Tracker tracker, UncaughtExceptionHandler originalHandler, Context context) {
super(tracker, originalHandler, context);
setExceptionParser(new AnalyticsExceptionParser());
}
@Override
public void uncaughtException(Thread t, Throwable e) {
String exceptionDescription = getExceptionParser().getDescription(t.getName(), e);
//Add code to store the exception stack trace in shared preferences
super.uncaughtException(t, e);
}
}
private class AnalyticsExceptionParser implements ExceptionParser {
@Override
public String getDescription(String arg0, Throwable arg1) {
StringBuilder exceptionFirsLine = new StringBuilder();
for (StackTraceElement element : arg1.getStackTrace()) {
exceptionFirsLine.append(element.toString());
break;
}
//150 Bytes is the maximum allowed by Analytics for custom dimensions values. Assumed that 1 Byte = 1 Character (UTF-8)
String exceptionDescription = exceptionFirsLine.toString();
if(exceptionDescription.length() > 150)
exceptionDescription = exceptionDescription.substring(0, 149);
return exceptionDescription;
}
}
}
W główną działalność gdy OnStart(), to sprawdzić, czy istnieje jakikolwiek ślad stosu przechowywane we wspólnych upodobań. Jeśli tak, wysyłam niestandardowy wymiar i usuwam udostępnione preferencje.
@Override
protected void onStart() {
super.onStart();
String exception = getExceptionFromSharedPreferences(this);
if(exception != null && !exception.isEmpty()) {
MainApplication.googleAnalyticsTracker.sendCustomDimension(1, exception);
}
clearExceptionFromSharedPreferences(this);
}
końcu stworzył raport niestandardowy w Analytics
EDIT 3:
zdałem sobie sprawę, że wysyłał tylko nazwę pliku i LineNumber, ale nie ExceptionName i pochodzenie wyjątku w moim pakiecie. Poprawiłem odpowiedź, dodając kod, aby również wysłać te informacje.
private class AnalyticsExceptionParser implements ExceptionParser {
@Override
public String getDescription(String arg0, Throwable arg1) {
String exceptionDescription = getExceptionInfo(arg1, "", true) + getCauseExceptionInfo(arg1.getCause());
//150 Bytes is the maximum allowed by Analytics for custom dimensions values. Assumed that 1 Byte = 1 Character (UTF-8)
if(exceptionDescription.length() > 150)
exceptionDescription = exceptionDescription.substring(0, 150);
return exceptionDescription;
}
}
//#endregion
//#region PRIVATE METHODS
private String getCauseExceptionInfo(Throwable t) {
String causeDescription = "";
while(t != null && causeDescription.isEmpty()) {
causeDescription = getExceptionInfo(t, "com.myPackageName", false);
t = t.getCause();
}
return causeDescription;
}
private String getExceptionInfo(Throwable t, String packageName, boolean includeExceptionName) {
String exceptionName = "";
String fileName = "";
String lineNumber = "";
for (StackTraceElement element : t.getStackTrace()) {
String className = element.getClassName().toString().toLowerCase();
if(packageName.isEmpty() || (!packageName.isEmpty() && className.contains(packageName))){
exceptionName = includeExceptionName ? t.toString() : "";
fileName = element.getFileName();
lineNumber = String.valueOf(element.getLineNumber());
return exceptionName + "@" + fileName + ":" + lineNumber;
}
}
return "";
}
Mam ten sam problem. Znalazłeś rozwiązanie? – Shmuel
@ David nie dostałem żadnego rozwiązania. Więc użyłem V3 – Anu
Nie wiem, czy to ci pomoże, ale stwierdziłem, że popełniłem błąd - ga_reportUncaughtException ciąg znaków, gdy powinien być boolem true –
Shmuel