2012-10-21 2 views
7

ACRA 자체가 이상한 문제에 충돌되어도서관 프로젝트에서 ACRA를 사용할 수 있습니까?

IllegalStateException: Cannot access ErrorReporter before ACRA#init

나는 완벽하게 작동 ACRA 4.3.0 응용 프로그램을 가지고있다. 전체 응용 프로그램을 라이브러리로 변경하여 사소한 변형을 만들 수 있습니다. 매니페스트가 아닌 완전히 새로운 새 프로젝트를 만들고이 새 라이브러리에 연결됩니다. AcraApplication.java에서 이것을 시도하는 다른 사용자는 "resToastText = R.string.crash_toast_text"라인을 제거하고 Acra.init (이) 아래에 새로운 라인을 추가해야합니다.

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

이 프로젝트는 잘 빌드 및 디버그에 나는 ACRA.init (이) 확인했습니다; 내 주 프로그램 코드 이전에 오류가 발생하기 전에 실행됩니다. 주요 프로그램에서 시점에서 우리는 몇 가지 사용자 정의 데이터 설정 여기서 그것은 충돌이 발생

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

을 (또는 더 정확하게, ACRA 자체가 오류가 발생합니다) 더 ACRA 보고서가 생성되지 않습니다.

어떤 아이디어를 다음에 시도해보아야합니까? ACRA는 라이브러리와 호환되지 않을 수 있습니다.이 경우 라이브러리를 다르게 처리 할 수는 있지만 일종의 라이브러리 목적에 어긋납니다.


솔루션 :

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

ACRA.init(this); 

참고이 단지 V4.3.0에서 작동 이상 : 대신 Acra.init(this); 아래의 라인을 추가하는 초기화 라인 이전에 다음 세 줄을 추가합니다.

답변

1

나는 동일한 문제가 있었는데, 그것은 proguard 난독 화 때문에 발생했습니다.

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

    super.onCreate(); 
    } 
다음 ACRA.init()가 처음에 유지해야

참고 :

이 솔루션은 파일을 proguard.cfg하기 위해 아래의 정의를 추가하는 것입니다 (ACRA 위키 페이지 here에서 촬영)

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

안녕을 작동합니다 내 proguard.cfg에서, 나는 여전히 내 릴리스에서 "NoSuchFieldError : SILENT"를 얻습니다. 나는 그것을 이해할 수 없다. – Arnaud

1

가 있는지 확인하십시오 당신이 매니페스트 파일

을에 추가 한
<application 
    android:name="com.test.MyApp" 

당신은 내가 @ReportCrashes의 설정을 잃어버린 내 경우

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

를 다음을 수행 응용 프로그램 클래스가 ... 희망이도이 라인,

@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 

) 
관련 문제