SFU 서버를 아직 구축하지 않았기에 P2P 방식으로 WebRTC 영상 통화 방을 구현하는 예제를 따라하고자 한다. 아래의 유튜브 영상을 참고한다.
CodeWithKael:Android Video Call With WebRTC and Firebase
WebRTC는 실시간으로 네트워크 상의 음성, 영상, 데이터 교환을 할 수 있는 p2p(peer to peer) 기술이다.
서로 다른 네트워크 상의 두 디바이스들이 데이터를 주고 받으려면 각 디바이스의 위치를 찾는 방법과 미디어 포맷의 협의가 필요하다.
디바이스끼리 데이터를 교환할 수 있도록 네트워크 위치, 설정, 미디어 포맷등을 알아내는 과정을 시그널링이라 하며 시그널링 서버가 피어 간의 초기 연결을 돕는다.
(참고: 모질라 signalling and video calling)
WebRTC를 p2p로 연결하면 서버와 같은 중간자를 거치지 않는다. 하지만 시그널링 서버는 필요하다!
(1) Android application에 utils를 생성하고 HiltAndroidApp 도입
Hilt를 gradle에 추가하는 단계부터 시작한다.
다른 gradle 추가 예제와 내 android studio 내 표현 방식이 다르다. project, app 수준을 살펴보니 아래와 같다.
libs 객체는 libs.versions.toml에서 가져와 사용하는 것으로 보인다. (아래 참고)
공식 문서를 봐도 예전 구조로 보여서 서칭을 했다.
stackoverflow: how to add hilt dependecies on "libs.versions.toml
[versions]
...
kspVersion = "1.9.20-1.0.14"
hiltVersion = "2.50"
[libraries]
...
hilt-android = { group = "com.google.dagger", name = "hilt-android" , version.ref = "hiltVersion"}
hilt-compiler = { group = "com.google.dagger", name = "hilt-compiler" , version.ref = "hiltVersion"}
[plugins]
...
hiltAndroid = { id = "com.google.dagger.hilt.android", version.ref = "hiltVersion" }
kotlinAndroidKsp = { id = "com.google.devtools.ksp", version.ref = "kspVersion" }
// build.gradle.kts (project)
plugins {
alias(libs.plugins.androidApplication) apply false
alias(libs.plugins.jetbrainsKotlinAndroid) apply false
alias(libs.plugins.hiltAndroid) apply false
alias(libs.plugins.kotlinAndroidKsp) apply false
}
// build.gradle.kts (app)
plugins {
alias(libs.plugins.androidApplication)
alias(libs.plugins.jetbrainsKotlinAndroid)
alias(libs.plugins.hiltAndroid)
alias(libs.plugins.kotlinAndroidKsp)
}
dependencies {
...
implementation(libs.hilt.android)
ksp(libs.hilt.compiler)
}
Application 클래스를 상속받는 MyApplication을 생성했다. Application 클래스는 앱 전체의 생명주기를 관리하고, 앱 전역에서 접근할 수 있는 데이터나 상태를 관리한다.
(2) AndroidManifest.xml에 위를 추가하고, MainActivity를 LoginActivity로 rename하여 ui 폴더로 이동
// AndroidManifest.xml
<application
android:name=".utils.MyApplication"
... />
</application>
android:name은 앱이 실행될 때 가장 먼저 실행시키는 class가 된다. 단, Application을 상속받는 클래스여야 한다.
(3) LoginActivity refactor: AndroidEntryPoint
@HiltAndroidApp → Component 생성
@AndroidEntryPoint → Subcomponent 생성
여기까지 따라하며 Android Studio 라이브러리 추가 방법과 Hilt 라이브러리에 대한 개념을 다소 공부했다. 유튜브는 jetpack compose를 사용하지 않고 있다. ui를 포기하고 기능만 구현하면 상관 없을 것 같아 그대로 하려 했다. 하지만 jetpack compose를 사용하지 않으니 코드 구조가 달라져 여건 상 jetpack compose를 사용하는 예시를 찾아 따라하는 게 낫겠다고 판단했다. (현재 kotlin 기초 공식 강의 일부만 본 상태, 프로젝트 진행이 시급하다.)
앞 부분 library 관련 내용은 추후에도 사용할 것 같으니 기록을 남겨둔다!