2012-10-21 12 views
7

ACRA jest upaść z nieparzystej problemu:Czy ACRA może być używana w projekcie bibliotecznym? Sam

IllegalStateException: Cannot access ErrorReporter before ACRA#init

Mam app z Acra 4.3.0, który działa doskonale. Zmieniłem całą aplikację na bibliotekę, dzięki czemu mogę tworzyć drobne warianty. Stworzyłem nowy projekt, który jest całkowicie pusty, inny niż manifest i łączy się z tą nową biblioteką. Dla każdego, kto próbuje to zrobić, w AcraApplication.java musisz usunąć linię "resToastText = R.string.crash_toast_text" i dodać nową linię poniżej Acra.init (this);

ACRA.getConfig().setResToastText(R.string.crash_toast_text);

Projekt buduje grzywny i debugowania Mam potwierdzone ACRA.init (this); jest uruchamiany przed moim głównym kodem programu i zanim wystąpi błąd. W programie głównym, w miejscu, gdzie możemy ustawić niektóre niestandardowe dane:

ACRA.getErrorReporter().putCustomData("Orientation", "L");

powoduje katastrofę (lub bardziej precyzyjnie, sam ACRA powoduje błąd) i nie jest generowany raport ACRA.

Wszelkich pomysłów, co do spróbowania dalej lub wskazówek, gdzie szukać? Być może ACRA jest niekompatybilna z bibliotekami, co w takim przypadku mogę inaczej poradzić sobie z tą biblioteką.


Rozwiązanie: Zamiast dodawania linię poniżej Acra.init(this); dodać te trzy linie przed linią Init:

ACRAConfiguration config = ACRA.getNewDefaultConfig(this); 
config.setResToastText(R.string.crash_toast_text); 
ACRA.setConfig(config); 

ACRA.init(this); 

Uwaga To działa tylko w wersji 4.3.0 lub nowszej.

Odpowiedz

1

Miałem ten sam problem, spowodowany został przez ukrywanie progu.

Rozwiązaniem jest dodanie poniższych dostosowań do proguard.cfg plik (zaczerpnięte z Acra stronie wiki here):

nocie że ACRA.init() powinna pozostać na początku:

@Override 
    public void onCreate() { 
    ACRA.init(this); 
    ACRA.getErrorReporter().setReportSender(new MySender()); 

    super.onCreate(); 
    } 

proguard.cfg:

#ACRA specifics 
# we need line numbers in our stack traces otherwise they are pretty useless 
-renamesourcefileattribute SourceFile 
-keepattributes SourceFile,LineNumberTable 

# ACRA needs "annotations" so add this... 
-keepattributes *Annotation* 

# keep this class so that logging will show 'ACRA' and not a obfuscated name like 'a'. 
# Note: if you are removing log messages elsewhere in this file then this isn't necessary 
-keep class org.acra.ACRA { 
    *; 
} 

# keep this around for some enums that ACRA needs 
-keep class org.acra.ReportingInteractionMode { 
    *; 
} 

-keepnames class org.acra.sender.HttpSender$** { 
    *; 
} 

-keepnames class org.acra.ReportField { 
    *; 
} 

# keep this otherwise it is removed by ProGuard 
-keep public class org.acra.ErrorReporter 
{ 
    public void addCustomData(java.lang.String,java.lang.String); 
    public void putCustomData(java.lang.String,java.lang.String); 
    public void removeCustomData(java.lang.String); 
} 

# keep this otherwise it is removed by ProGuard 
-keep public class org.acra.ErrorReporter 
{ 
    public void handleSilentException(java.lang.Throwable); 
} 
+0

Hi, nawet z tych linii w moim proguard.cfg nadal pojawia się "NoSuchFieldError: SILENT" w moim wydaniu. Nie mogę tego rozgryźć – Arnaud

1

Upewnij się, że zostały dodane w pliku manifestu

<application 
    android:name="com.test.MyApp" 

i masz klasę aplikacji, które mają następujące

import org.acra.ACRA; 
import org.acra.ReportField; 
import org.acra.ReportingInteractionMode; 
import org.acra.annotation.ReportsCrashes; 

import android.app.Application; 

@ReportsCrashes(formKey = "", mailTo = "your_email_address", customReportContent = { 
      ReportField.APP_VERSION_CODE, ReportField.APP_VERSION_NAME, 
      ReportField.ANDROID_VERSION, ReportField.PHONE_MODEL, 
      ReportField.CUSTOM_DATA, ReportField.STACK_TRACE, ReportField.LOGCAT }, mode = ReportingInteractionMode.TOAST, resToastText = R.string.crash_toast_text) 
    public class MyApp extends Application 
    { 
     @Override 
     public void onCreate() 
     { 
      super.onCreate(); 
      ACRA.init(this); 
     } 
    } 
1

W moim przypadku brakowało @ReportCrashes config ... Nadzieję, że to będzie działać

@ReportsCrashes(
    formUri = "uploadurl", 
    reportType = HttpSender.Type.JSON, 
    httpMethod = HttpSender.Method.POST, 
    formUriBasicAuthLogin = "llenigingeneyederrownlys", 
    formUriBasicAuthPassword = "1a35b13f9f54271d23a9aed988451182e5b97211", 
    formKey = "", // This is required for backward compatibility but not used 
    customReportContent = { 
      ReportField.APP_VERSION_CODE, 
      ReportField.APP_VERSION_NAME, 
      ReportField.ANDROID_VERSION, 
      ReportField.PACKAGE_NAME, 
      ReportField.REPORT_ID, 
      ReportField.BUILD, 
      ReportField.STACK_TRACE 
    }, 
    mode = ReportingInteractionMode.TOAST, 
    resToastText =R.string.msg 

) 
Powiązane problemy