[Android] Firebase Analytics 멀티 모듈 구성

covy·2024년 5월 18일

서론

현재 프로젝트를 진행하면서, 사용자 행동을 분석하기 위해 analytics와 비정상 종료를 분석하기 위해 Crashlytics를 도입하려고 한다.
app 모듈단에서는 쉽게 적용 가능하였지만 멀티 모듈을 적용하면서 에러들을 만나 가이드를 보고 천천히 따라 해보려고 한다.

파이어베이스 문서

본론

왜 app 모듈에서 쓰지 않는가?

  • 멀티모듈로 구성된 앱에서, 각 feature의 사용자 행위를 캐치하기 어렵다.
  • UI단외에 데이터 레이어에서 로깅을 하기 위해 (버그 분석을 위한 로깅)

이런 문제점을 타파하고자 호기롭게 analytics 모듈을 만들어 분리하였다.
다만 빌드 오류가 너무 많이 나서.. 해결 과정을 기록하고자 한다

적용 방법

  1. Firebase 모듈을 분리한다. (나는 analytics 모듈로 변경)
  2. google-service.json 다운로드 받아서 app, analytics 모듈에 모두 추가한다. (Firebase 프로젝트 설정 -> 앱 추가 -> Firebase 모듈 경로로 추가하면 된다) 추가하면 google-service.json을 다운로드할 때 모든 모듈의 정보를 포함하여 추출된다.
  3. project 수준 build.gradle에 firebase 플러그인 추가
plugins {
	// Make sure that you have the Google services Gradle 	plugin dependency
	id("com.google.gms.google-services") version "4.4.0" apply false
	// Add the dependency for the Crashlytics Gradle plugin
	id("com.google.firebase.crashlytics") version "2.9.9" apply false
}
  1. app 수준 모듈에 플러그인 추가 및 analytics(firebase) 프로젝트 의존성 추가 한다
plugins {
    id("com.google.gms.google-services")
    id("com.google.firebase.crashlytics")
}
...
dependencies {
    implementation(project(":core:analytics"))
}
  1. firebase 모듈에서는 아래 의존성을 추가해준다.
plugins {
    id("com.google.gms.google-services")
    id("com.google.firebase.crashlytics")
}
...
dependencies {
	implementation(platform("com.google.firebase:firebase-bom:32.7.1"))
    implementation("com.google.firebase:firebase-crashlytics")
    implementation("com.google.firebase:firebase-analytics")
}

트러블 슈팅

싱글톤 컴포넌트로 Hilt 주입을 하려고 했는데, composable(화면)단에서 Inject를 할 수 있는 좋은 방법이 생각이 안났다.

선택지

구글링 하였을 때, 3가지 방안이 있었는데,
1. Hilt의 EntryPoints 활용
2. CompositionLocal
3. (처음 생각) object로 선언해서 사용한다

3. object로 선언

싱글톤 방식으로 작동가능하게 만들 수 있다.
이 경우 test 하기 어려운 구조이고, object는 의존성 주입을 제공하지 않아 확장성이 떨어질 것이라고 생각했다.

1,2 비교

NowInAndroid에서 2번 방식을 채택하고 있었다.

내 생각은 조금 달랐는데, 그 이유로 1번을 선택하면 아래와 같은 장점이 있었다.

  1. MainActivity 주입 코드를 줄일 수 있는 장점이 있다.
  2. HiltScope에 벗어난 관리를 줄일 수 있다.
  3. Analytics에서 compose 의존성이 없어질 수 있다.

NowInAndroid 제안

그래서 한 번 1번 방식으로 제안을 해보았다.

Now in android PR

결론은 2번 구조인 Now In Android 구조가 낫다라는 결론이다.

한 분이 내가 제안한 방식에 대해서 질문을 주셨는데 이를 명쾌한 해답을 낼 수 없었다.

  1. EntryPoint로 Hilt 객체를 꺼내올 때의 비용이 발생한다. 어떻게 해결할 수 있나?

  2. Compose Preview에서 DI 객체를 쓰기 어렵다 어떻게 해결할 수 있나?

    • 콜백으로 해결 가능해 보이나, 그럴거면 viewModel에서 콜백을 받아 처리해도 될 것 같았다. (상태 호이스팅의 불편함)

결론

CompositionLocal을 통해서 FirebaseAnalytics 객체를 관리하여 쓰자
Now In Android Analytics 패키지

0개의 댓글