정상에서 IT를 외치다

[Firebase Crashlytics] 안드로이드 에러 리포트 사용기 본문

안드로이드

[Firebase Crashlytics] 안드로이드 에러 리포트 사용기

Black-Jin 2019. 6. 20. 15:08
반응형

안녕하세요. 블랙진입니다.


이미지 출처


Firebase Crashlytics


먼저 Firebase Crashlytics 은 안드로이드 에러 리포트 입니다. 앱에서 충돌이 일어날때 실시간으로 데이터를 받아볼 수 있게 해주는 구글에서 제공해 주는 ARCA(Applicarion Crash Report For Android)입니다. 


Firebase Crashlytics 설치방법?


Firebase Crashlytics 시작하기

Firebase Crashlytics 구현 테스트


설치 방법은 위 페이지에 상세히 나와 있어 시작하는데는 큰 어려움은 없습니다. 그럼 Firebase Crashlytics 직접 사용해보고 테스트한 내용에 대해서 공유하겠습니다.



FireBase Crashlytics 오류 보고서 맞춤 설정



1. 커스텀 키 추가



비정상 종료로 이어지는 앱의 구체적인 상태를 커스텀 키 추가를 통해 확인할 수 있습니다.


Crashlytics.setString("user_name", "BlackJin")
Crashlytics.setInt("uuid", 1000)
Crashlytics.setString("mode", "릴리즈")


Crashlytics의 위 와같이 Key, Value 값을 설정해 주면 다른 곳에서 발생하는 모든 에러에 커스텀 키 값이 표시됩니다. 물론 중간에 값을 바꾸면 바뀐 값이 적용됩니다. 에러 리포트는 기기에 대한 정보만을 받아 볼 수 있는데 커스텀 키를 통해 로그인된 유저의 정보와 같은 앱의 구체적인 상태 값을 받아 올 수 있습니다.



에러에서 "키" 값을 선택화면 위와 같이 설정해준 커스텀 키값을 확인하실 수 있습니다.



2. 맞춤 로그 메시지 추가



맞춤 로그를 설정하면 어떻게 될까요? 저는 두가지 화면을 만들어서 테스트 해봤습니다. MainActivity, DetailActivity 그리고 Button 클릭시 크러시를 발생시켰습니다.


MainAcitivty init()

Crashlytics.log("메인 엑티비티 로그1")
Crashlytics.log(Log.DEBUG, "MyTag", "blackJinTest")


DetailAcitvity init()

Crashlytics.log("디테일 엑티비티 로그2");


DetailActivity Button()

Crashlytics.log("디테일 엑티비티 로그3");
Crashlytics.getInstance().crash(); // 크러시 발생


순서가 보이시나요? 

MainActivity -> DetailActivity -> Button Click -> Crash 입니다. 이렇게 발생시키고 찍힌 로그를 확인해 봤습니다.



에러의 로그 탭에서 확인할 수 있었습니다. 찍어둔 로그가 순서대로 찍힌것을 확인할 수 있습니다. 이렇게 로그 정보를 통해 이벤트에 대한 배경 정보를 보다 정확하게 알아낼 수 있습니다. 추가적으로 위 파랑 네모를 보면 MyTag 라고 적혀있습니다. 왜 여기는 다르게 표시된걸 까요?


// 로그를 비정상 종료 데이터에 연결하고 Firebase Console에 표시합니다.
Crashlytics.log("메인 엑티비티 로그1")

//오류 보고서 및 Log.println()에서도 로그를 표시하고 볼 수 있습니다.
Crashlytics.log(Log.DEBUG, "MyTag", "blackJinTest")


Crashlytics.log에 디버그 정보와 태그 정보를 입력하면 Log.d와 같이 디버그시에 콘솔에서 확인할 수 있습니다. 또한 이 로그는 디버그와는 상관없이 Crashlytics에 태그정보와 함께 저장되는 것을 확인했습니다.


3. 심각하지 않은 예외 로깅


try catch 구문을 사용해 catch 문으로 빠진 에러는 심각하지 않은 에러로 분류 할 수 있습니다.


try {
Crashlytics.getInstance().crash()
} catch (e: Exception) {
Crashlytics.logException(e)
}

위와 같이 코드를 적용해 실행한 결과 아래와 같은 결과를 확인할 수 있었습니다.


다른 에러와 달리 "심각하지 않음" 으로 표시됨을 확인했습니다.


또한 이벤트 유형을 "심각하지 않음"으로 필터링 해서 에러를 분류해서 볼 수 있습니다.


4. 보고 선택 옵션 


앱에서 발생하는 크러시 수집을 중지하는 옵션입니다. 위 이미지와 같이 두가지 설정만 추가해 주면 됩니다. 필자는 개발시에만 에러를 전송시키지 않게 하기 위해 manifestPlaceholders 를 사용하여 디버그 모드에서는 크러시 전송을 막고 릴리즈 모드에서는 전송될 수 있게 했습니다. (관련 링크)


app/build

buildTypes {

debug {

...

// crashlytics 실행하지 않음

manifestPlaceholders = [enableCrashReporting:"false"]
}

release {

...


// crashlytics 실행

manifestPlaceholders = [enableCrashReporting:"true"]
}
}


AndroidManifest

<application
...>

...


<meta-data
android:name="firebase_crashlytics_collection_enabled"
android:value="${enableCrashReporting}"/>

</application>


manifestPlaceholders를 사용해 AndroidManifest의 값을 변경해 줄 수 있습니다. 이렇게 함으로써 코드 변경 없이 Build Variants의 값을 변경해 쉽게 적용할 수 있습니다.







개발을 할 때 빌드 속도는 중요합니다. 왜냐하면 더 빨라진 빌드 속도만큼 쉴 수 코딩을 할 수 있기 때문이죠! 위 제목 링크를 보면 빌드 속도를 높여주는 여러 방법이 있습니다. 그중에서 디버그시 Crashlytics를 비활성화 하여 빌드 속도를 개선할 수 있습니다.

바로 위에서 manifestPlaceholders를 사용해 Crashlytics 비활성화 했는데 이게 무슨소리냐고요?? 엄밀히 말하자면 플러그인을 비활성화하는 것입니다. 위에 방법과는 차이가 있습니다.

app/build

debug {

...


// crashlytics 실행하지 않음
manifestPlaceholders = [enableCrashReporting:"false"]

// crashlytics 플러그인을 사용하지 않음
ext.enableCrashlytics = false

}


ext.enablaCrashlytics = flase 를 추가해 줍니다. 그리고 실행하면 어떻게 될까요?


The Crashlytics build ID is missing. This occurs when Crashlytics tooling is absent from your app's build configuration. Please review Crashlytics onboarding instructions and ensure you have a valid Crashlytics account.


위 에러와 함께 앱이 죽어버립니다 :(


우리는 한가지 설정을 추가로 해줘야 됩니다. 디버그 빌드 시 런타임에 Crashlytics 키트를 비활성해 해줘야 됩니다. 위 방법은 플러그인을 비활성화 하기 때문에 Crashlytics 초기화 코드도 수정해 줘야 됩니다. 


Fabric.with(this, Crashlytics);


이렇게 Fabric를 초기화 했던 코드를 아래와 같이 수정해 줍니다.


// Initializes Fabric for builds that don't use the debug build type.
Crashlytics crashlyticsKit = new Crashlytics.Builder()
.core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build())
.build();

Fabric.with(this, crashlyticsKit);


디버그 시에넌는 Fabric을 비활성화 하겠다는 코드로 변경해 주면 에러 없이 정상적으로 돌아갑니다. 그리고 최종적으로 빌드 속도를 높이기 위해 한개를 더 추가해 줄 수 있습니다. Crashlytics가 빌드 ID를 업데이트 하는 것을 막아 줌으로써 빌드 속도를 높여 줄수 있습니다.


debug {

// ...

// crashlytics 실행하지 않음
manifestPlaceholders = [enableCrashReporting:"false"]

// crashlytics 플러그인을 사용하지 않음
ext.enableCrashlytics = false

// crashlytics 빌드 ID 업데이트 막기
ext.alwaysUpdateBuildId = false
}



에러 내용 공유하기


잦은 에러가 발생했을 때 이를 빠르게 알고 대처해야 합니다. 이를 위해서는 빈번하게 발생하는 에러를 실시간으로 확인 할 수 있는 방법이 필요합니다.



1. 이메일을 통한 에러 공유



파이어베이스 콘솔에서 사용자 및 권한으로 들어갑니다.



구성원을 추가해주면 심각한 에러가 발생하면 여러분의 이메일로 에러 내용을 보내줍니다.



2.  그외 에러 공유 방법



이번에는 사용자 및 권한 화면의 설정에서 "통합" 탭으로 이동해봅시다.



그러면 에러 공유를 위한 다양한 방법이 있습니다. 위 에러 공유에서 자신의 팀에 맞는 방법을 선택해서 사용하면 되겠죠?



마무리 


Firebase Crashlytics  최근에 사용하면서 좋았던 기능에 대해서 내용을 적어봤습니다. 사용한지 얼마 되지 않아 잘못된 내용이 있다면 언제든지 댓글 환영입니다. 혹은 이런식으로 사용하면 더 좋겠다는 의견이 있다면 공유 부탁드리겠습니다. 감사합니다.

반응형
Comments