2015년 2월 17일 화요일

ACRA Essential

Crash Logger 관련 사용부분에 대하여 기존 정리된 문서가 있어서 공유합니다.

작성자: 전두일/서미정
  1. 개요



본 문서는 Android Application Crash Report Library ACRA(Application Crash Report for Android) 사용법에 대하여 설명하고자 작성한다.
[ ACRA Github에 설명이 잘 되어있어 실사용 관점에서 설명하고자한다. ]


  1. ACRA



ACRA 는 안드로이드 Application의 Crash 를 자동으로 보고해 주는 오픈소스 MIT  License의 라이브러리입니다.
(최초 Google Form 과 연동으로 작성되었으나 구글Docs 부하문제로 사용불가하게됨)



  1. ACRA 사용법 (Device)



    1. Android 설정방법



  1. 라이브러리 등록



  • Maven dependency
<dependency>
 <groupId>ch.acra</groupId>
 <artifactId>acra</artifactId>
 <version>4.5.0</version>
</dependency>


  • Gradle
dependencies {
   ...
   compile 'ch.acra:acra:4.5.0'
}


  • jar include
 Application Project add acra-4.5.0.jar


  1. Android Manifest.xml 수정

<manifest ...>
 <application ... android:name="MyApplication"> ⇐  3.Code 수정 에서 Override한 Application  
   ...
 </application>
 <uses-permission android:name="android.permission.INTERNET"> ⇐ Add Code  
 </uses-permission>
</manifest>


  1. Code 수정 : Application Override

import org.acra.*;
import org.acra.annotation.*;
@ReportsCrashes(
       formKey = "",
       formUri = "http://192.168.0.35:5984/crashlog",
       reportType = org.acra.sender.HttpSender.Type.JSON,
       httpMethod = org.acra.sender.HttpSender.Method.POST
       )                       ⇐ Add Code   3.2. ReportsCrash params  설명
public class MyApplication extends Application {
 @Override
 public void onCreate() {

   ACRA.init(this);  ⇐ Add Code
   super.onCreate();  
 }
}

    1. ReportCrash params

  • User interface

    • mode : 크래쉬발생시 UI
  • ReportingInteractionMode.SLENT
  • ReportingInteractionMode.NOTIFICATION
  • ReportingInteractionMode.TOAST
  • ReportingInteractionMode.DIALOG
*각 모드에 따라 추가되는  params  있음  ex( resDialogText/ resDialogIcon …)
[Toast/ Notification/ Dialog]


    • forceCloseDialogAfterToast : Crash Dialog 보여주기 여부
  • false
  • true : [Force Close] Dialog Show


  • Report Destination

    • formKey : 현재 사용하지는 않지만( GoogleDoc Form ID) 필수 입력항목 [“”]
    • mailTo : 크래쉬 내용이 Mail Intent로 실행됨
    • formUri : 크래쉬 데이터 전송할 Custom Server Uri
    • formUriBasicAuthLogin : 보낼 서버의 로그인 아이디
    • formUriBasicAuthPassword : 보낼 서버 로그인 패스워드
    • httpMethod : 데이터 전송 유형
  • org.acra.sender.HttpSender.Method.POST
  • org.acra.sender.HttpSender.Method.PUT
    • reportType : 데이터 전송 타입
  • org.acra.sender.HttpSender.Type.FORM
  • org.acra.sender.HttpSender.Type.JSON
* 그외  OwnSender 로 Interface를 만들어 사용하는 경우 도 있음
(3.3 OwnServer 에서 추가설명)


  • Report Contents

    • customReportContent : Report 항목을 설정 할 수 있음
5.1 ReportContent 참고
    • additionalSharedPreferences : SharedPreference정보 연동
    • sharedPreferencesName : Acra 설정값의 SharedPreferrnces의 Name 설정
  • arc.* 로 설정정보 get/set
acra.enable/ acra.disable : acra 사용여부
acra.syslog.enable : syslog 보내기여부
acra.deviceid.enable : deviceid 사용여부
acra.user.email : set send user email
acra.alwaysaccept : 보내기설정의 묻는창에서 항상  YES처리
… 소스코드 참고
    • includeDropBoxSystemTags : DropBoxManager 사용여부
  • false
  • true : 그외 참고
  • 설정

    • sharedPreferencesMode : Acra 설정값의 SharedPreferrnces의 Mode 설정
  • Context.MODE_PRIVATE
  • Context.MODE_WORLD_WRITEABLE
  • Context.MODE_WORLD_READABLE
    • sendReportsInDevMode: Signed application package 만 전송됨
  • true / false
    • deleteUnapprovedReportsOnApplicationStart
    • deleteOldUnsentReportsOnApplicationStart
    • connectionTimeout
    • socketTimeout
    • maxNumberOfRequestRetries
    • disableSSLCertValidation


  • Dynamic Configuration

: Configuration을 code 로수정가능 (v4.3)


import org.acra.ACRA;

...
ACRA.getConfig().setHttpMethod(org.acra.sender.HttpSender.Method.POST);
...


    1. Send exception

: catch 된 exception보내기


try {
serverPort = Integer.parseInt("a");
 }
catch (NumberFormatException e) {
ACRA.getErrorReporter().handleSilentException(e);
}
* handleException()  Toast/Dlg/Notification 있음


    1. OwnSender

: Sender를 생성하여 사용
public class OwnSender implements ReportSender {

public OwnSender()
{
}
@Override
public void send(CrashReportData arg0) throws ReportSenderException {
// TODO Auto-generated method stub
Log.d("OwnSender","STACK_TRACE:" + arg0.getProperty(ReportField.STACK_TRACE) );
}
}


    1. 추가 라이브러리

      1. ANR

: [ANR-WatchDog] 추가 라이브러리로 주기적 모니터링을 통해 ACRA 로 보고할수 있다


      1. Native Code error (JNI C/ C++)

:  [Native-Crash-Handler] 추가 라이브러리로 Native Code의 error를 ACRA 로 보고할수 있다.


  1. ACRA 사용법 (Server)

    1. CouchDB

ACRA연동 소개 페이지에서는 iriscouch.com의 ‘cloud couchDB’를 통한 연동을 소개한다.
 하지만 가격 정책이 있고 향후 확장성을 고려하여 이를 배제하고, 일반 couchDB에 구성을 하여 동일하게 동작하도록 구성한다.
      1. CouchDB 설치

      1. CouchDB 구성

  • DB 생성(ex. crashlog db 생성) : admin > ‘create Database’ 클릭
  • Restful API 배포
    couchDB는 Restful API를 기본 기능으로 제공한다.
    위 예제와 같이 crashlog로 DB를 구성한 경우 아래와 같이 클라이언트에 API를 배하면 된다.
    http://192.168.0.35:5984/crashlog
  • DB 내용 확인
    futon admin에서 ‘crashlog’ DB를 클릭하면, 클라이언트에서 전송된 crashlog를 확인 할수 있다.

<그림. DB에 저장된 데이터(2건)>
<그림. 데이터 상세 내역>
      1. 데이터 분석
        https://github.com/ACRA/acralyzer/wiki/manual-setup
        위 setup 가이드를 통해 4.3 viewer 구성 가능
        하지만 커스터마이징을 위해서 관련 라이브러리/소스 분석 작업이 필요하다.
        <그림. iriscouch 연동을 통한 분석 결과 화면>


acralyzer를 이용하지 않고 couchDB의 데이터를 직접 추출하여 화면을 구성하는 방법도 가능하다.
* 참고사항
acra lib에 의해 생성된 json-body에 포함된 crash발생 시각은 단말 기준 시간이다.
    1. R-DBMS

저장 DB(couchDB, R-DBMS)의 종류에 상관없이 연동 규격은 동일하게 구성할 것을 추천한다.
단말은 서버의 DB종류에 상관없이 crashlog수집 및 전송을 위해 acra lib을 사용한다.
서버는 동일한 연동 규격(4.1 couchDB에 소개된 restful API)을 제공한다.


단말로부터 전달받는 정보는 http post방식의 json data이므로
R-DBMS구성을 json data규격을 고려하여 구성할 것을 추천한다.
(acra lib에서 추출되는 json data를 모두 전송할 것인지는 논의 필요)


HTTP연동방식, DB구성, JSON 파싱 등에 제약사항은 없으며, 일반적인 웹 프로젝트 구성에 준해서 진행하도록 한다.


    1. Viewer



  1. 맺음

    1. Report Contents

: 내용이 방대하여 필요부분만 뽑아 전송
ANDROID_VERSION
APP_VERSION_CODE
APP_VERSION_NAME
APPLICATION_LOG
AVAILABLE_MEM_SIZE
BRAND
BUILD
CRASH_CONFIGURATION
CUSTOM_DATA ??
DEVICE_FEATURES
DEVICE_ID
DISPLAY
DROPBOX
DUMPSYS_MEMINFO
ENVIRONMENT
EVENTSLOG
FILE_PATH
INITIAL_CONFIGURATION
INSTALLATION_ID
IS_SILENT
LOGCAT
MEDIA_CODEC_LIST
PACKAGE_NAME
PHONE_MODEL
PRODUCT
RADIOLOG
REPORT_ID
SETTINGS_GLOBAL
SETTINGS_SECURE
SETTINGS_SYSTEM
SHARED_PREFERENCES
STACK_TRACE
THREAD_DETAILS
TOTAL_MEM_SIZE
USER_APP_START_DATE
USER_COMMENT
USER_CRASH_DATE
USER_EMAIL

    1. 분류기준

: 크래쉬 분석시 분류기준으로 잡아야할 사항에 대한 정의 필요
- AppVersion
- Crash Type
- Crash Address  : STACK_TRACE 로 잡으면 되나 내용이 방대함
- Device Type
- Android Version
- Catched Exception / uncatched Exception
-- End of Document--