루피도 코딩한다

[Android] Product Flavor 사용환경에서 Crashlytics 적용하기 (feat. slack 알림 연동) 본문

Android

[Android] Product Flavor 사용환경에서 Crashlytics 적용하기 (feat. slack 알림 연동)

xiaolin219 2023. 6. 1. 17:43

얼마 전 HAVIT이라는 앱을 출시하고 홍보를 시작했다.
생각보다 빠른 시간 내에 700명 정도의 유저를 달성했는데, Google Play Console에서 제공해 주는 에러 레포팅이 불편했다.
첫째, 실시간이 아니라 하루 지났을 때 즈음 로그가 업데이트되기에, 대응하기 쉽지 않다.
둘째, 크래시가 나는 상황을 정확하게 파악하기 어렵다.
기본적인 휴대폰 기종, 앱 버전은 보여주지만, 앱이 background상태였는지 루팅 때문에 발생한 문제인지 판별하기는 쉽지 않았다.
이 문제를 해결하기 위해서는 Crashlytics의 도입이 절실해졌다.
 
Crashlytics는 본래 Twitter에서 개발한 건데 google에 인수되었다고 한다!

 

1. Crashlytics란?

Crashlytics는 실시간으로 비정상 종료를 감지하고 레포팅 해주는 기능을 제공해 준다.
비슷한 유형의 에러는 묶어서 보여주며,
자주 발생하는 에러에 대해서는 이메일로 노티 해주는 기능까지 제공한다.
 
 

2. Android에 Crashlytics 구현하는 방법

이 단계는 크게 3가지로 구현된다
 

 1️⃣ 앱 연결

Firebase Console에서 Firebase 프로젝트를 생성하고, 앱에 google-services.json 파일을 추가해주어야 한다.
FCM(Firebase Cloud Messaging)을 이미 활용하고 있던 앱이라면, 이 작업은 생략 가능하다.
 
✅ 안드로이드 프로젝트에서 Product Flavor를 활용해 여러 개의 Build버전을 가지고 있다면!?
Android Build 버전이 어려 개더라도, Firebase Project가 하나라면 아래 설명은 skip 해도 좋다.
단, Firebase Project도 여러 개 가지고 있다면, 여러 개의 google-services.json을 추가해주어야 한다.
 
 

 2️⃣ SDK 추가

안드로이드에서 build.gradle(app-level)에 아래 코드를 추가한다.
(아래 코드는 2023.06.01일 기준이며, BoM의 최신 버전은 공식문서🔗에서 확인 가능하다)

dependencies {
    // Import the BoM for the Firebase platform
    implementation platform('com.google.firebase:firebase-bom:32.1.0')

    // Add the dependencies for the Crashlytics and Analytics libraries
    // When using the BoM, you don't specify versions in Firebase library dependencies
    implementation 'com.google.firebase:firebase-crashlytics-ktx'
    implementation 'com.google.firebase:firebase-analytics-ktx'
}

 
 
build.gradle(project-level)에서는 아래 코드를 추가해 준다.
이 또한 SDK의 최신버전을 확인하고 추가하자!

buildscript {
    repositories {
      // Make sure that you have the following two repositories
      google()  // Google's Maven repository
      mavenCentral()  // Maven Central repository
    }

    dependencies {
        ...
        classpath 'com.android.tools.build:gradle:7.2.0'

        // Make sure that you have the Google services Gradle plugin dependency
        classpath 'com.google.gms:google-services:4.3.15'

        // Add the dependency for the Crashlytics Gradle plugin
        classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.5'
    }
}

 
사실 여기까지가 끝이다.
그래도.. 우리 Crashlytics를 적용했다면, 정상작동하는지 체크는 해야 하니..!
마지막으로 정상작동 하는지 확인만 하면 끝이다!
 
 

3️⃣ Test Crash 강제로 발생시키고, 정상 작동 확인하기

1, 2번까지 잘 추가하고 Firebase Console에 접속하면 아래와 같은 화면이 뜰 것이다.

 
 
자 이제 다시 안드로이드 스튜디오로 돌아온다.
아무 화면이나, onClickListerner 등에 아래와 같은 코드를 추가해 준다

   throw RuntimeException("Test Crash")

 
그리고 다시 Firebase Console의 Crashlytics 화면으로 돌아오면,
위 화면에서 아래 화면으로 바뀌어있는 것을 볼 수 있을 것이다!
그리고 하단의 '문제' 부분에, 우리가 강제로 일으킨 RuntimeException에 대한 로그가 남아있음을 확인할 수 있을 것이다.
(아래 이미지의 빨간 박스에 해당하는 부분이며, 에러 메시지는 다를 수 있음)
 
 

 
 

3. Slack 연동

우리 팀에서는 Slack을 활용해 소통하고 있다.
Slack - Crashlytics 연동을 해두면, 사용자의 폰에서 Crash가 감지될 때  바로 slack으로 알림을 받아볼 수 있다.
 
Crashlytics slack 연동이라고 구글링 하면 많은 자료가 있으니 참고하면 좋을 것 같다!
 
까먹을만하면 한 번씩 Crashlytics가 알림을 보내준다ㅋㅋ (아래 이미지)
 

Slack이 Crashlytics의 알림을 보여주는 모습~!

 

 

4. 여기서부터는 셀프 회고 타임이다~

Crashlytics를 적용할까 말까 고민하시는 분만 봤으면 좋겠다.
 
사실 Crashlytics를 적용하는 건 하나도 여렵지 않은데, 적용 후 버그에 대응해 나가는 과정이 상당히 흥미롭고 재밌다.
개발할 때는 고려하지 못했던 문제를 많이 마주하고 있으며, 깊게 공부해 볼 수 있는 좋은 기회이다.
 
인상 깊었던 사례로는.. 
1) 루팅 한 유저의 폰에서는 Fcm Token을 못 가져오는 것
    별거 없는 앱이지만, 루팅 유저를 막기로 결정했다!
 
2) Google SDK의 본질적인 버그 (내 잘못 아님)
    에러 메시지를 구글링 해보면, Google의 'Google Issue Tracker'로 연결되는 경우가 상당수 있다.
    Google 오픈소스 뭐 대단한 건 줄 알았는데 살짝 실망했다
 
3) 버전대응에 대한 이슈
    Android SDK 26에서는, 투명배경의 Activity의 방향을 지정할 수 없음🤯
   그리고 Kotlin 버전을 업데이트하면서, 특정 함수 지원이 안 되는 문제 등..!
 
위 에러에 대응한 사례들은, 차차 블로그에 기록해야지~ (다짐만 백번 째)
 

 

끝.

Comments