Android uygulamamdan kilitlenme verilerini nasıl edinebilirim?


737

Android uygulamamdan kilitlenme verilerini (en azından yığın izlerini) nasıl alabilirim? En azından kendi cihazımda çalışırken kabloyla alınırken, ideal olarak uygulamanızın vahşi ortamda çalışan herhangi bir örneğinden, böylece geliştirebiliyorum ve daha sağlam hale getirebiliyorum.



Bunun raporu uzak bir sunucuya gönderdiğini görüyorum. İstisna yerel bir dosyaya da kaydedilebilir mi?

1
Android için Uygulama Kilitlenme Raporu code.google.com/p/acra
gdonald

Bu daha sağlam görünüyor, ya tüm yeniden denemelerden sonra raporlama yüklenemezse, daha sonra dosya veya sqlite db kaydedebilir?
JPM

Yanıtlar:


354

ACRA (Android için Uygulama Kilitlenme Raporu) kitaplığını deneyebilirsiniz :

ACRA, Android Uygulamasının kilitlenme raporlarını otomatik olarak bir GoogleDoc formuna göndermesini sağlayan bir kütüphanedir. Android uygulama geliştiricilerine, kilitlendiklerinde veya hatalı davrandıklarında uygulamalarından veri almalarına yardımcı olmak için hedeflenir.

Uygulamanıza kurulumu kolaydır, son derece yapılandırılabilir ve herhangi bir yerde bir sunucu komut dosyası barındırmanızı gerektirmez ... raporlar bir Google Doküman e-tablosuna gönderilir!


8
Bu kurulumu ve kullanımı kolaydır. Pazar öncesi yer kullanımı için ve hatta muhtemelen sonra önerilir.
mxcl

1
Kullanmaya başladım ve Flurry'de daha önce sahip olduğum hata bildirimi veya başladığım ev yapımı olandan daha iyi bir şekilde daha iyi. Şimdiye kadar, "acra" üzerine stoklandım.
Adrian Spinei

8
Acra'nın en büyük avantajı, verileri kolayca analiz etmek ve görselleştirmek için Google API'larını kullanma olasılığıdır , bunun nasıl yapılacağıyla ilgili bir örnek için bkz. Jberkel.github.com/sms-backup-plus/acra-analysis .
Jan Berkel

3
Benim için çok kararsız görünüyor. ACRA kendisi çöktü ve ilgili uygulama çökmesi değil kendisi hakkında çökme raporu gönderdi. -1
Sandor

19
Arka uç olarak Google Dokümanlar artık desteklenmiyor
eliocs

305

Örnek uygulamalar ve hata ayıklama amacıyla, yığın izlemesini aygıtın sd kartına yazmamı ve / veya bir sunucuya yüklememi sağlayan basit bir çözüm kullanıyorum. Bu çözüm Project android-remote-stacktrace'dan (özellikle cihaza kaydet ve sunucuya yükle parçaları) esinlenmiştir ve bence Soonil tarafından bahsedilen sorunu çözmektedir. Optimal değil, ama çalışıyor ve bir üretim uygulamasında kullanmak istiyorsanız onu geliştirebilirsiniz. Stacktraces sunucuya yüklemeye karar verirseniz, görüntülemek için bir php komut dosyası ( index.php) kullanabilirsiniz. İlgileniyorsanız, aşağıdaki tüm kaynakları bulabilirsiniz - uygulamanız için bir java sınıfı ve yüklenen yığın izlemelerini barındıran sunucu için iki isteğe bağlı php komut dosyası.

Bir Bağlamda (örn. Ana Etkinlik),

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");
?>

9
Bunun bazı eyaletlerde / ülkelerde yasal sorunlara neden olacağını düşünüyorum
setzamora

5
NOT: HttpPost httpPost = new HttpPost(url);Honeycomb veya daha yenisini hedefliyorsanız, zaman uyumsuz bir görevde (veya işleyici ... ayrı bir iş parçacığında) olmalıdır
Bryan Denny

4
@Joset, ne tür yasal konular ve neden?
varevarao

2
@varevarao Yasal sorunlar (belki de), bu kodun Sunucuya Gönder özelliğini kullanarak kullanıcının izni olmadan hassas cihaz bilgilerini gönderdiğiniz için.
caw

2
DefaultExceptionHandler, Activity rekreasyonunda devam ediyor gibi görünüyor. Cevabı, yalnızca özel bir işleyici önceden ayarlanmadıysa varsayılanı ayarlamak için güncelledim. Onsuz, her işleyici bir öncekini tutar ve orijinal olana kadar çağırır. Bu, yinelenen günlüğe kaydetme ve bellek sızıntısı sorunlarına neden olur.
Dave McClelland

57

Ayrıca [BugSense] Sebep: Spam Yönlendirmesini başka bir URL'ye de deneyebilirsiniz . BugSense, tüm kilitlenme raporlarını toplar ve analiz eder, size anlamlı ve görsel raporlar verir. Ücretsizdir ve entegrasyon için sadece 1 kod satırı vardır.

Feragatname: Kurucu ortaklardan biriyim


4
BugSense ve onun harika denedim. Basit ve taze kullanıcı arayüzü, çok hızlı da. Aptal özellik şişmesi yok. En sık çökmeleri görmek ve ayrıca yığın izini kazmak kolaydır.
vidstige

Son zamanlarda sadece Crash raporlamasından çok daha fazlasını yapıyoruz, ancak bu yeni özellikler vb. Hakkında konuşmak için doğru yer değil.
PanosJee

Denedim. Stacktrace çok tam olmasa da hatalar çalıştı, gerçek zamanlı kilitlenme verileri gelmedi. Hata ayıklama modu çalışmadı. Uygulama sınıfından ilk kez başlat yoluna gittim (çoğu durumda mantıklı olan şey budur). BugSense, inanılmaz bir gösterge panosuna sahiptir, öyle bir utanç ki, herhangi bir nedenle kilitlenme raporları işe yaramıyor ve sembolizasyon ücretsiz katmanda değil. GetSentry'yi yüklemek için bana 5 dakika sürdü ve bu genel amaçlı istemciyle Android için kutudan çıktı: github.com/joshdholtz/Sentry-Android
albertpeiro

3
BugSense basit ve entegrasyonu kolaydır. AMA ÇOK PAHALI. Flurry analytics ve Parse kullanarak aynı hata algılama işlevlerini elde edebiliriz. Her ikisi de ücretsiz ve entegrasyonu kolaydır.
venkat

44

Android 2.2'de Android Market Uygulamalarından otomatik olarak Kilitlenme Raporları almak mümkün:

Android Market uygulamaları için yeni hata raporlama özelliği, geliştiricilerin kullanıcılarından kilitlenme ve donma raporları almasını sağlar. Raporlar, yayıncı hesaplarına giriş yaptıklarında kullanılabilir olacaktır.

http://developer.android.com/sdk/android-2.2-highlights.html


Bence sadece 2.2 değil, sadece google'ın sunduğu yeni bir pazar özelliği. Birkaç gün önce bir kaza raporu aldım ve benim app kullanarak bir froyo cihazı olmamalıdır.
Janusz

1
@Janusz Emin misin? bir süredir Froyo'yu çalıştıran Google çalışanlarını saymadan, zaten Nexus One için Froyo sürümleri var.
pupeno

En azından telefonun versiyonunda bir güncelleme olmalı, hatta sadece bir revizyon olmalı, ancak bu nasıl çalışmalı?
RoflcoptrException

Raporların daha önce Google'a gönderilip gönderilmediğini bilmiyorum. Rapor biraz garip, çünkü google videolarını göndermek için bir kullanıcı arayüzü gösteriyor ve bu sadece pazarda değil işletim sisteminde bir değişiklik olmalı. Ancak şunu söylüyor: Platformlar 1 raporları haftada rapor ediyor ve droid froyoda olmamalı.
Janusz

1
"Rapor" düğmesi kodu bir süredir AOSP'de ve Romain Guy (belirsiz) burada birkaç ay önce bu konuda bir soru yanıtladı.
Christopher Orr

30

Bu istisnaları ele almak mümkündür Thread.setDefaultUncaughtExceptionHandler(), ancak bu Android'in istisnaları ele alma yöntemiyle karıştırıyor gibi görünüyor. Bu tür bir işleyici kullanmaya çalıştım:

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");
    }
}

Ancak, istisnaları yeniden yazarken bile, istenen davranışı elde edemedim, yani Android'in hala gerçekleştiği bileşeni kapatmasına izin verirken istisna kaydedemedim, bu yüzden bir süre sonra vazgeçtim.


Neden yalnızca denetlenmeyen istisnaları yeniden atıyorsunuz? Bana öyle geliyor ki tüm istisnaları tekrar atmalısın.
MatrixFrog

Birisi yaklaşımınızı başardı gibi görünüyor: jyro.blogspot.com/2009/09/crash-report-for-android-app.html
MatrixFrog

1
Hile, önceki varsayılan UncaughtExceptionHandler'ı almak ve istisnayı bildirmeyi bitirdikten sonra istisnayı o nesneye işlemektir.
Tom

Constants.TAGAndroid çerçevesinin bir parçası mı ? İlk kez görüyorum. Bulamýyor gibiyim.
Haroun Hajem

1
@HarounHajem Kendimizi tanımlamamız gerekiyor.
KYHSGeekCode

22

Sorunun çok eski olduğunu görüyorum ve cevabımın aynı sorunu yaşayan başkaları için yararlı olacağını umuyorum ...

Ver Crashlytics bir deneyin. Uygulamanıza sahip tüm cihazlarda tüm çökmelere derinlemesine bilgi verecektir ve e-posta yoluyla size bir bildirim gönderecektir .. Ve en iyi kısmı tamamen ücretsizdir ..


21

Tamam, iyi rrainn ve Soonil sağlanan örnekleri baktı ve ben hata işleme berbat etmeyen bir çözüm buldum.

CustomExceptionHandler değiştirdim böylece orijinal UncaughtExceptionHandler iş parçacığından yeni bir tane ilişkilendirmek. Yeni "uncaughtException" - Yöntem sonunda Ben sadece depolanan UncaughtExceptionHandler kullanarak eski işlevi çağırır.

DefaultExceptionHandler sınıfında sth gerekir. bunun gibi:

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 adresindeki kodda yapılan bu değişiklikle, web sunucunuza veya sd kartınıza giriş yapmak için iyi bir çalışma tabanınız olur.


19

Google Play Developers Console aslında size kilitlenen ve raporları gönderen uygulamalardan Stack izlerini verir, ayrıca bilgileri görmenize yardımcı olacak çok iyi grafiklere sahiptir, aşağıdaki örneğe bakın:

resim açıklamasını buraya girin


2
Kullanıcıların raporları nasıl göndermesini sağladınız veya uygulamanız oyun deposunda değilse bu nasıl çalışır? Bunu test amacıyla yapabilir misiniz?
Lion789

Çökme raporlarını halka açık herhangi bir açık kaynaklı Android projesi olduğunu biliyor musunuz?
Justin Civi

1
Bu, yalnızca kullanıcıların rapor etmeyi seçtiği ANR kilitlenmelerini gösterecektir
sojin

Evet, her neyse, büyük bir kullanıcı tabanına sahip olduğunuzda, bildirilen tüm çökmelerin çok fazla olasılığınız var ve ayrıca çökmeler ve burada bildirilen ANR'ler en önemlileri olacak, çünkü insanlar onları daha fazla rapor edecek, böylece filtreleyin ve bunları bu önceliğe göre düzeltin (daha fazla rapor = daha önemli hata) (rapor yok = kritik hata değil).
Eefret

18

Crittercism'i Android ve iOS uygulamalarım için kullanıyorum - bunları techcrunch'ta duydum. Şimdiye kadar onlarla oldukça mutlu!


Bilginize: NDK tarafındaki kilitlenme raporları temel planın bir parçası değildir ve "Genişletilmiş Kilitlenme Raporlaması" altındadır. Bkz: crittercism.com/pricing
ahash

1
NDK'nin Twitter'ın Fabric.io Crashlytics raporlamasını test ettim ... oldukça harika (kullanımın 1. gününde), haritalamayı sistemlerine koymak için serbest bıraktığımda ekstra izler gerekiyordu, böylece yığın izleri iyi görünüyor, ama çivilenmiş c ++ boyunca stratejik olarak bir "abort ();" çağrısı sınamak için kullandığım NDK hatası ve sınama için bir yığın izlemesi sağladı
Hunter-Orionnoir


11

istisna ayrıntılarını yakalamak için bunu kullanın:

String stackTrace = Log.getStackTraceString(exception); 

bunu veritabanında saklayın ve günlüğü koruyun.


Bu Veri tabanına nasıl erişilir, bana herhangi bir örnek verir misiniz? lütfen eğer yapabilirsen. advacne
Rajendra Verma

8

Bunun için yalnızca kütüphane yerine bütün (basit) bir hizmeti de kullanabilirsiniz. Şirketimiz sadece bunun için bir hizmet yayınladı: http://apphance.com .

5 dakika içinde ekleyip entegre ettiğiniz basit bir .jar kütüphanesine (Android için) sahiptir ve daha sonra kütüphane sadece kilitlenme bilgilerini değil, aynı zamanda çalışan uygulamanın günlüklerini toplar ve test cihazlarınızın sorunları doğrudan cihazdan bildirmesine izin verir - tüm bağlam (bir kablosuz ağa bağlı olsun veya olmasın, cihaz döndürme ve daha fazlası). Günlükleri, uygulamanız, oturumlarınız, günlükleriniz, istatistikleriniz ve daha fazlası ile oturumları izleyebileceğiniz çok güzel ve kullanışlı bir web paneli kullanarak görüntüleyebilirsiniz. Hizmet şimdi kapalı beta test aşamasında, ancak erişim talep edebilirsiniz ve size çok hızlı bir şekilde veriyoruz.

Feragatname: Ben Polidea'nın CTO'su ve hizmetin ortak yaratıcısıyım.


7

StackoverflowBu cevabı bulmama yardım eden mevcut kaynaklar .

Sen bulabilirsiniz e-posta içine doğrudan uzaktan Android çökme raporları . Mecbur remmember CustomExceptionHandler sınıf içinde e-posta koymak .

public static String sendErrorLogsTo = "tushar.pandey@virtualxcellence.com" ;

Gerekli adımlar:

1) tarihinde etkinliğinizin oluşturulmasında kodunuzun bu bölümünü kullanın.

    if(!(Thread.getDefaultUncaughtExceptionHandler() instanceof CustomExceptionHandler)) {
        Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler(this));
    }   

2.) benim phpscript göre, CustomRceptionHandler sınıfı (rrainn) geçersiz kılınmış bu sürümünü kullanın.

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();

    }
}


5

Bu çok kaba, ama her yerde logcat çalıştırmak mümkündür, bu yüzden hızlı ve kirli bir kesmek herhangi bir catch bloğuna eklemek getRuntime().exec("logcat >> /sdcard/logcat.log");


Bu, tüm uygulamaların günlük çıktısını verecektir. Uygulama tagname tarafından filtreleme iyi olabilir, ancak girişlerin birikimli olabileceği için bunun iyi bir yol olacağını düşünmeyin. Her yazma işleminden sonra logcat çıktısını temizlemek bu sorunu çözebilir.
bschandramohan

5

Fabric adlı bir araç var, bu uygulama canlı olarak dağıtıldığında ve geliştirme sırasında çökme raporları almanızı sağlayacak bir çarpışma analitik aracıdır. Bu aracı uygulamanıza eklemek de basitti .. Uygulama çöktüğünde, çökme raporunuz fabric.io kontrol panelinden görüntülenebilir. Bu rapor otomatik olarak yakalandı. kullanıcıdan izin istemez. Hata / kilitlenme raporu göndermek isteyip istemediği. Ve bu tamamen ücretsiz ... https://get.fabric.io/


5

Google Firebase , telefonunuzda kilitlenme / hata verileri sağlamanın Google'ın en son (2016) yoludur. Build.gradle dosyanıza ekleyin:

compile 'com.google.firebase:firebase-crash:9.0.0'

Ölümcül çökmeler, kullanıcı girişi gerektirmeden otomatik olarak günlüğe kaydedilir ve ayrıca ölümcül olmayan çökmeleri veya bunun gibi diğer olayları da kaydedebilirsiniz:

try
{

}
catch(Exception ex)
{
    FirebaseCrash.report(new Exception(ex.toString()));
}

5

Sherlock adında bir android kütüphanesi var. . Cihaz ve uygulama bilgileriyle birlikte size tam kilitlenme raporunu verir. Bir kilitlenme meydana geldiğinde, bildirim çubuğunda bir bildirim görüntüler ve bildirime tıklandığında kilitlenme ayrıntılarını açar. Kilitlenme ayrıntılarını e-posta veya diğer paylaşım seçenekleri aracılığıyla başkalarıyla da paylaşabilirsiniz.

Kurulum

android {
    dataBinding {
      enabled = true
    }
}

compile('com.github.ajitsing:sherlock:1.0.0@aar') {
    transitive = true
}

gösteri

resim açıklamasını buraya girin


5

Bu sayfadaki cevapların çoğu yararlı olsa da, güncelliğini yitirmesi kolaydır. AppBrain web sitesi, güncel olan en popüler kilitlenme çözümünü bulmanıza olanak tanıyan istatistikleri toplar:

Android kilitlenme rapor kitaplıkları

uygulama beyin web sitesi

Bu resmi yüklerken Crashlytics'in uygulamaların% 5.24'ünde ve kurulumların% 12.38'inde kullanıldığını görebilirsiniz.


4

Şirket içinde yetiştirilen sistemimizi kullanıyoruz ve bize çok iyi hizmet ediyor. Raporları alan ve bazı analizler yapan sunucuya ve sunucuya kilitlenme raporları gönderen bir android kütüphanesi. Sunucu istisnaları istisna adı, yığın izlemesi, iletiye göre gruplandırır. Düzeltilmesi gereken en kritik sorunların belirlenmesine yardımcı olur. Hizmetimiz artık herkesin deneyebilmesi için herkese açık beta sürümündedir. Http://watchcat.co adresinde hesap oluşturabilir veya http://watchcat.co/reports/index.php?demo demo erişimini kullanarak nasıl çalıştığına bir göz atabilirsiniz .


3

Hemen cevap almak isterseniz logcat'i kullanabilirsiniz

$adb shell logcat -f /sdcard/logoutput.txt *:E

Günlüğünüzde şu anda çok fazla önemsiz varsa, önce temizlemeyi deneyin.

$adb shell logcat -c

Ardından uygulamanızı çalıştırmayı deneyin ve sonra tekrar oturum açın.


Bu yine de cihazı bir PC'ye bağlamanızı gerektirmiyor mu (örn. Kablo ile)?
Gerard

3

Hata raporlarını izlemek için bir harika web uygulaması daha buldum.

https://mint.splunk.com/

Yapılandırılacak az sayıda adım.

  1. Giriş yapın veya kayıt olun ve yukarıdaki bağlantıyı kullanarak yapılandırın. Bir uygulama oluşturduktan sonra, aşağıdaki gibi yapılandırmak için bir hat sağlayacaktır.
Mint.initAndStartSession(YourActivity.this, "api_key");
  1. Aşağıdakileri uygulamanın build.gradl dosyasına ekleyin.
android {
...
    repositories {
        maven { url "https://mint.splunk.com/gradle/"}
    }
...
}

dependencies {
...
    compile "com.splunk.mint:mint:4.4.0"
...
}
  1. Yukarıda kopyaladığımız kodu ekleyin ve her etkinliğe ekleyin.

    Mint.initAndStartSession (YourActivity.this, "api_key");

Bu kadar. Giriş yapın ve uygulama kontrol paneline gidin, tüm hata raporlarını alacaksınız.

Umarım birine yardımcı olur.


Ne kadar ediyor?
user2966445

2

Alternatif bir çökme raporlama / istisna izleme servisi için Raygun.io'ya göz atın - uygulamanıza takarken iyi kullanıcı deneyimi de dahil olmak üzere Android çökmelerini ele almak için bir sürü güzel mantık var (ana Faaliyetinizde iki satır kod ve birkaç XML satırları AndroidManifest'e yapıştırıldı).

Uygulamanız çöktüğünde, yığın izini, sabit / yazılım için ortam verilerini, kullanıcı izleme bilgilerini, belirttiğiniz özel verileri vb. Otomatik olarak yakalar. API'ya eşzamansız olarak gönderir, böylece UI iş parçacığını engellemez ve önbelleğe alır. ağ yoksa diske dönüştürün.

Yasal Uyarı: Android sağlayıcıyı oluşturdum :)


1

Google Forms'ı arka uç olarak kullanarak ACRA https://github.com/ACRA/acra kullanmaya başladım ve kurulumu ve kullanımı çok kolay, varsayılan.

AMA Google Formlar'a rapor gönderme kullanımdan kaldırılacak (daha sonra kaldırılacak): https://plus.google.com/118444843928759726538/posts/GTTgsrEQdN6 https://github.com/ACRA/acra/wiki/Notice-on-Google -form-Çizelge kullanımı

Her neyse, kendi göndereni tanımlamak mümkündür https://github.com/ACRA/acra/wiki/AdvancedUsage#wiki-Implementing_your_own_sender , örneğin gönderene e-posta göndermeyi deneyebilirsiniz.

Minimum çaba ile bugsense'e rapor göndermek mümkündür: http://www.bugsense.com/docs/android#acra

Not Bugsense ücretsiz hesabı ayda 500 raporla sınırlıdır


1

Partinin sonlarına doğru, ACRA'nın en iyisi olduğunu düşünüyorum ve inanıyorum. Kurulumu ve yapılandırması kolaydır. ACRA'yı kullanarak kilitlenme raporunu almak ve MandrillAp'ı kullanarak e-posta adresime postalamak için her yerden girişler içeren ayrıntılı bir rehber oluşturdum.

Paylaşmak için bağlantı: https://androidician.wordpress.com/2015/03/29/sending-crash-reports-with-acra-over-email-using-mandrill/

Github'daki örnek projeye bağlantı: https://github.com/ayushhgoyal/AcraSample


1

Ben tam da bu amaçla tasarladığımız Bugsnag'ın kurucularından biriyim . Bugsnag, Android uygulamalarında işlenmeyen istisnaları otomatik olarak yakalar ve bunları kontrol panelimize gönderir; burada düzeltmelere öncelik verebilir ve teşhis bilgilerine dalabilirsiniz.

Bazı kod snippet'leriyle birlikte bir kilitlenme bildirim sistemi seçerken veya oluştururken göz önünde bulundurmanız gereken bazı önemli noktalar şunlardır:

  • İşlenmeyen istisnaları otomatik olarak algılar ( örnek kod )
  • Bellek kullanımı, cihaz bilgisi vb. Gibi teşhis verilerini toplar ( örnek kod )
  • Kilitlenmeleri kök nedene göre etkili bir şekilde gruplandırır
  • Yeniden üretime yardımcı olması için kullanıcının her kilitlenmeden önce gerçekleştirdiği işlemleri izlemenizi sağlar ( örnek kod )

Android'de kaza işleme / raporlama hakkında en iyi uygulamaları görmek istiyorsanız, Bugsnag'ın tamamen açık kaynak olan çökme raporlama kitaplığı için tam kaynak koduna göz atabilir, bunu ayırmaktan ve kendi uygulamalarınızda kullanmaktan çekinmeyin!


0

Uygulamanız başka kişiler tarafından indiriliyorsa ve uzak cihazlarda kilitleniyorsa, bir Android hata raporlama kütüphanesine ( bu SO gönderisinde referansta bulunur) bakmak isteyebilirsiniz . Yalnızca kendi yerel cihazınızdaysa, LogCat'i kullanabilirsiniz. Kilitlenme meydana geldiğinde cihaz bir ana makineye bağlanmamış olsa bile, cihazı bağladıysanız ve bir adb logcat komutu yayınlamak tüm logcat geçmişini indirecektir (en azından genellikle bir günlük verisi döngüsüne dönüştürülen arabellekte , sonsuz değil). Bu seçeneklerden herhangi biri sorunuza cevap veriyor mu? Değilse, biraz daha aradığınızı netleştirmeye çalışabilir misiniz?



0

Google, ne kadar kilitlenme raporu aldığınızı değiştirdi. Daha önce yalnızca elle bildirilen hata raporlarınız vardı.

Son geliştirici konferansından ve Android Vitals'ın tanıtımından bu yana, teşhis verilerini paylaşmayı etkinleştiren kullanıcılardan çökme raporları da alırsınız.

Kullanıcıları, kullanım ve teşhis verilerini otomatik olarak paylaşmayı seçen Android cihazlardan toplanan tüm kilitlenmeleri görürsünüz. Veriler önceki iki aya ait.

Kilitlenme ve uygulama yanıt vermeme (ANR) hatalarını görüntüleme


logcat, /data/user/0/com.<myappname>/cache/WebView/Crash Report / <GUUID> .dmp dosyasında bir çıktı kilitlenme bilgi döküm dosyası olduğunu söylüyor, ancak cihaz köklü değil ve anlayamıyorum bu dosyaya nasıl erişeceğinizi öğrenin!
Michael

0

Bunu doğrudan Android Studio'da yapabilirsiniz. Sadece telefonunuzu bağlayın, uygulamayı çalıştırın, çökmesine izin verin ve yığın izini doğrudan Android Studio'da görüntüleyebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.