열심히 개발한 앱을 플레이스토어에 배포했다고 가정해보자.
나름 열심히 예외처리도 했을 것이다.
사용자가 어떤 행동을 할 지 모르고, 어떤 예외가 발생하여 앱이 죽을지 모른다.
그리고 앱이 죽었을 때 이유조차 알기 어려운 경우가 있다. 물론, 구글 플레이 콘솔에서 확인할 수 있기도 하다.
하지만 이런 크래쉬를 좀 더 세세하고 보기좋게 확인할 수 있는 서비스가 Firebase의 Crashlytics이다.
1. Crashlytics 활성화
Firebase 콘솔로 이동하여 "출시 및 모니터링"의 "Crashlytics"로 이동한다.
그리고 "Crashlytics 사용 설정" 을 누른다.
그럼 아마 이런 화면으로 바뀔것이다. 문구를 잘 읽어보면, 앱을 빌드하고 비정상 종료하라고 가이드하고 있다.
이제 Crashlytics를 연동하고 비정상 종료를 해 보자.
2. 앱에 Crashlytics 연동하기
우선 앱에서 Crashlytics에 오류를 보고하기 위해 거쳐야 할 절차가 몇가지 있다.
firebase.google.com/docs/crashlytics/get-started?platform=android&authuser=1#add-sdk
문서를 참고하는 것도 좋다.
buildscript {
...
repositories {
...
}
dependencies {
...
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.4.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
...
우선 프로젝트 레벨의 build.gradle로 이동하여 dependencies에 "com.google.firebase:firebase-crashlytics-gradle:2.4.1" 를 추가해준다.
plugins {
...
id 'com.google.firebase.crashlytics'
}
android {
...
}
dependencies {
...
implementation platform('com.google.firebase:firebase-bom:26.1.1')
implementation 'com.google.firebase:firebase-crashlytics'
... // other firebase services
}
그리고 앱 레벨의 build.gradle로 이동하여 "com.google.firebase.crashlytics" 플러그인을 추가하고
dependencies에 "implementation 'com.google.firebase:firebase-crashlytics" 를 추가한다.
3. 앱을 강제로 비정상종료 하기
class MainActivity : AppCompatActivity() {
...
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
...
binding.btnGoogle.setOnClickListener {
throw IllegalStateException("Firebase Crashlytics Test")
// signInWithGoogle()
}
...
}
...
}
간단하게 버튼을 클릭하면 Exception을 throw 하도록 하였다.
연동을 위해 강제로 하는 것이니, 편한대로 하면 된다.
Crashlytics에 리포트가 제대로 안 될 수도 있고, 반영되는데 시간이 오래걸릴 수 있다. 크래쉬를 발생시키고 몇 분정도 기다린 후 리포트가 안되었다면 다시 시도해보자.
성공하면 아래와 같은 화면을 볼 수 있다.
종합적인 비정상 종료의 수와 영향을 받은 사용자를 알 수 있다.
그리고 어느 부분에서 비정상 종료가 발생했는지, 각 비정상 종료마다 얼마나 발생되었고 얼마나 많은 사용자에게 발생했는지도 알 수 있다.
하단 목록에서 특정 크래쉬를 선택하면 더 자세하게 볼 수 있다.
어떤 버전에서 발생했고 기기는 무엇이고 OS는 무엇인지.
그리고 Exception 로그까지 확인할 수 있다.
4. 커스텀 로그 삽입하기
firebase.google.com/docs/crashlytics/customize-crash-reports?hl=en&platform=android
문서를 참고하는게 더 좋을 수 있다.
class MainActivity : AppCompatActivity() {
...
private val crashlytics: FirebaseCrashlytics by lazy {
FirebaseCrashlytics.getInstance()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
...
crashlytics.run {
setUserId("SomeUserId")
setCustomKey("userKey", 123456789)
setCustomKey("customKey", "customValue")
}
crashlytics.log("Firebase Crashlytics Custom log!")
binding.btnGoogle.setOnClickListener {
throw IllegalStateException("Firebase Crashlytics Custom logging Test")
}
...
}
...
}
FirebaseCrashlytics 객체를 얻어온 후 setUserId 혹은 setCustomKey를 통해 크래쉬 로그에서 확인하고자 하는 값을 세팅한다. 특정 유저에 대한 로그를 확인하거나 앱에서 사용하는 값의 상태를 추적하고자 할 때 편리하게 사용할 수 있겠다.
또한 특정 부분에 로그를 기록하게 하여 크래쉬 시에 로그를 추적하면서 어떤 단계들을 거쳤는지 확인할 수도 있다.
리포트 된 크래쉬에서 키, 로그, 데이터 부분에서 직접 삽입한 내용을 확인할 수 있다.
이러한 데이터들을 활용하면 크래쉬를 해결하는 데 더 수월할 것이다.
5. 크래쉬 리포트 중단하기
상용버전이 아닌 개발버전, 테스트버전인 경우 굳이 리포트를 할 필요가 없을수도 있다.
그럴때 리포트를 비활성화할 수 있는 방법을 제공한다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
...
<application
...
<activity android:name=".MainActivity">
...
</activity>
<meta-data
android:name="firebase_crashlytics_collection_enabled"
android:value="false" />
</application>
</manifest>
AndroidManifest.xml 파일로 이동하여 application 태그 내에 meta-data를 추가 해주면 된다.
name과 value는 위 코드를 참고하면 된다.
활성화를 원한다면 value에 true를, 원하지 않는다면 false를 주면 된다.
meta-data가 없다면 디폴트로 활성화된다.
앱의 안정성은 항상 중요하다.
앱이 이유도 모른 채 죽어서 데이터가 날아간다던가, 심지어 그게 잦고 많은 사용자에게 일어난다면 리뷰 점수는 물론이고 사용자들은 등을 돌릴 것이다.
Firebase Crashlytics를 활용하여 크래쉬를 확인하여 더 안정적인 앱을 만들어보자.
'개발 > Android' 카테고리의 다른 글
[Android] Kotlin + MVVM + AAC 로 Todo 앱 만들기 - 6 (ViewBinding, DataBinding) (0) | 2021.01.20 |
---|---|
[Android] Firebase - 6. FCM(Firebase Cloud Messaging) 으로 알림을 보내보자! (0) | 2020.12.19 |
[Android] Firebase - 4. Remote Config 사용해보기 (0) | 2020.12.10 |
[Android] Firebase - 3. Google로 로그인 구현 (0) | 2020.12.08 |
[Android] Firebase - 2. Firebase 프로젝트 생성 및 앱 추가 (0) | 2020.12.06 |