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--

2015년 2월 16일 월요일

OMA-DS 절차

동기화 관련 국제 표준인 OMA-DS 절차 설명

2015년 2월 13일 금요일

Android permission의 capital 이슈


1. permission 등록
android manifest에 permission을 추가(선언)할 경우 
익히 알고 있듯이 아래와 같은 방법으로 등록을 한다.


2. permission name 이슈
위와 같은 permission 정의시,
소문자로 시작하는 permission name이 아닌 대문자로 시작하는 name을 정의하였을 때에는
console창과 logcat에서 에러를 확인 할 수 있다.
(컴파일/빌드는 문제 없으나, apk export시 error발생)



  • console창의 INSTALL_PARSE_FAILED_MANIFEST_MALFORMED 에러


  • logcat창의 bad class name 관련 Warning






3. 관련 자료 search
  • android 개발자 사이트 : manifest package name에 대한 rule
    => package명은 대소문자 모두 가능하다고 명시되어 있음

  • android 개발자 사이트 : manifest permission name에 대한 rule
    => permission name도 package name처럼 대문자에 대한 제약은 명시되어 있지 않다.

  • 위와 같이 android 개발자 사이트의 spec에는 대문자에 관한 제약이나 가이드가 없지만,
    실상은 대문자 permission name에 대한 오류가 발생하고 있고,
    2012년 부터 android issue tracker 및 기타 개발자 사이트에 제기되어 온 문제이다.

    현재까지 수정되었다는(수정될것이라는) 글은 발견하지 못했으며,
    개발과정에 있어서 name 명명시 이러한 부분을 고려하여야 한다.
    참고 : issue tracker(https://code.google.com/p/android/issues/detail?id=37658)




2015년 2월 3일 화요일

NavigationDrawer Tutorial

NavigationDrawer Tutorial



1. 개요

Android App에 Drawer Menu 기능을 간편하게 적용하게 위해 제공하는 라이브러리


2. Tutorial


1. 개발3팀 SVN에서 라이브러리 체크아웃한다.
2. 적용하고자 하는 앱의 프로젝트 속성에서 내려받은 라이브러리를 지정한다.




3. 메뉴 버튼이 있는 커스텀 타이틀바 구현을 위해 타이틀바 레이아웃을 생성한다.
   (버튼 부는 com.actionbarsherlock.view.CustomTitleBar에 디폴트로 구성)



4. Drawer Menu를 적용하고자 하는 액티비티의 상속을 SlidingActivity로 변경 해 주고,
   구현에 필요 한 변수를 선언한다.




5. onCreate()에 Drawer Menu 뷰를 붙여준다.




6. 액티비티가 로드되는 부분에 Navigation Drawer 초기 설정 로직을 구현 해 준다.
   (onCreate()에 구현해도 무관)
  • init( Context, 커스텀 타이틀 뷰 );
  • MenuListAdapter( Context, Group Item Array, Child Item Array )
  • Group Item Click Listener
  • Child Item Click Listener

7. Drawer Menu ListView를 제어하기 위한 Adapter를 구현한다.
   (Sample App에서 MenuListAdapter 클래스 복사 후 사용)
  • getGroupView 부분에서 Menu List의 Group Item을 제어하기 위한 로직을 구현한다.
  • 기본적으로 [아이콘 텍스트] 형태로 구성하였고, 커스터마이징하여 입맛대로 사용하도록 한다.


  • getChildView에서 Menu List의 Child Item을 제어하기 위한 로직을 구현한다.
  • 2depth 메뉴를 사용하지 않는다면 구현 할 필요는 없음



8. 빌드한다.


* 추가로 라이브러리 적용 시 xml 관련 에러가 발생한다면, 라이브러리 버전과 프로젝트 버전을 맞춰보도록 한다.


2015년 2월 2일 월요일

android pdf api

android os L (api level 21) 부터 지원하는 pdf document rendering 클래스

 // create a new renderer
 PdfRenderer renderer = new PdfRenderer(getSeekableFileDescriptor());

 // let us just render all pages
 final int pageCount = renderer.getPageCount();
 for (int i = 0; i < pageCount; i++) {
     Page page = renderer.openPage(i);

     // say we render for showing on the screen
     page.render(mBitmap, null, null, Page.RENDER_MODE_FOR_DISPLAY);

     // do stuff with the bitmap

     // close the page
     page.close();
 }

 // close the renderer
 renderer.close();


sample project download
https://developer.android.com/samples/PdfRendererBasic/index.html