2014-04-10 12 views
9

मैं अपने एंड्रॉइड ऐप के लिए अपने Google एनालिटिक्स में बेजोड़ अपवाद के कारण क्रैश रिपोर्ट के बारे में अधिसूचना प्राप्त करना चाहता हूं। मैंने https://developers.google.com/analytics/devguides/collection/android/v4/exceptions#parsing में दिए गए चरणों का पालन किया लेकिन फिर भी मुझे कोई क्रैश रिपोर्ट नहीं मिली है। जब मेरा ऐप चलता है तो मेरे पास रनटाइम अपवाद था। मेरी analytics.xml मेंGoogle Analytics में क्रैश रिपोर्ट प्राप्त करें

सच

: मैं सच के रूप ga_reportUncaughtException के लिए कोड जोड़ा। क्या Google Analytics विश्लेषण में हिट करने के लिए मुझे कुछ और जोड़ने की ज़रूरत है। कृपया सहायता कीजिए! - गूगल एनालिटिक्स एकमात्र अपवाद के नाम और स्थान (कोड फ़ाइल की बचत होगी और

1) केवल बुनियादी जानकारी संग्रहीत किया जाता है:

+0

मुझे एक ही समस्या है। क्या आपको एक समाधान मिला? – Shmuel

+0

@ डेविड मुझे कोई समाधान नहीं मिला। इसलिए मैंने V3 – Anu

+0

का उपयोग नहीं किया, मुझे नहीं पता कि यह आपकी मदद करेगा, लेकिन मुझे लगता है कि मैंने गलती से यह किया है - ga_reportUncaughtException एक स्ट्रिंग जब यह एक बूल होना चाहिए true Shmuel

उत्तर

1

मेरे अनुभव से आप दुर्घटनाओं और अपवादों Google Analytics में के बारे में दो बातें समझने की जरूरत है लाइन नंबर) जहां अपवाद फेंक दिया गया था। इससे परे कोई जानकारी जीए पर आपके लिए उपलब्ध नहीं होगी। यह निश्चित रूप से आदर्श नहीं है और यदि आप अपने अपवादों (मुख्य रूप से कॉल स्टैक) की वास्तविक सामग्री को ट्रैक करना चाहते हैं, तो Google Play का उपयोग करें या अपना स्वयं का समाधान लागू करें।

2) अपवाद वास्तविक समय नहीं हैं। अपवाद जानकारी दिन में एक बार एकत्र और अद्यतन की जाती है, इसलिए यदि आप अपवादों के साथ प्रयोग कर रहे हैं और आप उन्हें तुरंत नहीं देखते हैं, तो बस समय दें।

+0

से ट्रैकर बनाने के लिए एप्लिकेशन को मजबूर करने के लिए कोड के उस टुकड़े की आवश्यकता होगी, इस मुद्दे पर चर्चा नहीं की जा रही है। हम जानते हैं कि केवल मूल जानकारी संग्रहीत की जाती है, और यह अपवाद वास्तविक समय में नहीं हैं। मुद्दा यह है कि वे कुछ दिनों के बाद भी लॉग इन नहीं किए जा रहे थे। – Shmuel

6

Analytics में एक खुली समस्या है। मैं एक ही व्यवहार का सामना कर रहा हूँ, लेकिन एपीआई 10 से वास्तविक उपकरणों पर 19.

https://code.google.com/p/analytics-issues/issues/detail?id=443

EDIT1: निकाला सवाल, बस सवाल वर्णित जवाब देने के लिए।

EDIT2: मैंने Analytics अपवाद बिल्डर का उपयोग करके अपवादों को पकड़ने और भेजने की कोशिश की, लेकिन यह काम नहीं किया।

ऐसा लगता है कि रिपोर्ट भेजी जाती है (कम से कम लॉगकैट दिखा रहा है कि क्रैश की सूचना दी गई है), लेकिन यह Analytics द्वारा संसाधित नहीं है।

जबकि Google इस मुद्दे का उत्तर देता है, तो मैं इस कार्यवाही का उपयोग कर रहा हूं। मुझे लगता है कि यह सबसे अच्छा समाधान नहीं है और कोड सुधार किया जा सकता है, लेकिन यह मेरे लिए काम करता है:

  1. मैं निम्नलिखित इस कदम https://support.google.com/analytics/answer/2709829?hl=en

  2. मेरे एप्लिकेशन में Analytics में एक कस्टम आयाम बनाया है, मेरे द्वारा बनाए गए Analytics अपवाद रिपोर्टर क्लास का उपयोग करते हुए एक कस्टम अपवाद हैंडलर। जब एक अपवाद पकड़ा जाता है, तो मुझे स्टैक ट्रेस मिलता है और इसे 150 बाइट्स तक छोटा कर दिया जाता है (असल में मुझे केवल स्टैक की पहली पंक्ति मिल रही है और इसे 150 वर्णों तक छीन लेती है। मुझे लगता है कि 1Char = 1 बाइट)। मुझे इसे छोटा करना है, क्योंकि यह कस्टम आयाम मान भेजते समय Analytics द्वारा अनुमत अधिकतम लेनगेट है। स्टैक ट्रेस भेजने के बजाए साझा वरीयता में संग्रहीत किया जाता है। मैंने इसे सीधे भेजने की कोशिश की, लेकिन ऐप क्रैश होने के बाद यह काम नहीं करता है।

    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; 
         } 
        } 
    } 
    
  3. MainActivity में जब onStart(), मैं जाँच अगर वहाँ साझा वरीयताओं में किसी भी संग्रहीत स्टैक ट्रेस है। यदि ऐसा है, तो मैं कस्टम आयाम भेजता हूं और साझा वरीयता को साफ़ करता हूं।

    @Override 
    protected void onStart() { 
        super.onStart(); 
        String exception = getExceptionFromSharedPreferences(this); 
        if(exception != null && !exception.isEmpty()) { 
         MainApplication.googleAnalyticsTracker.sendCustomDimension(1, exception); 
        } 
        clearExceptionFromSharedPreferences(this); 
    } 
    
  4. अंत में मैं एक कस्टम रिपोर्ट एनालिटिक्स

में

Custom report configuration in Google Analytics

संपादित 3 बनाया:

मैंने महसूस किया कि मैं केवल फ़ाइल नाम और LineNumber भेज रही थी, लेकिन अपवाद नाम और मेरे पैकेज में अपवाद की उत्पत्ति नहीं। मैंने उस जानकारी को भेजने के लिए कोड जोड़कर जवाब में सुधार किया है।

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 ""; 
} 
+0

इस उत्तर के लिए धन्यवाद, यह वास्तव में मेरी मदद की। और हाँ, यह सवाल का जवाब देता है। – ol0