금융 및 SIM 등록을 위한 본인 인증 앱은 스푸핑과 딥페이크를 감지하기 위해 선명한 고해상도 얼굴 캡처가 필요합니다. 메모리가 부족한 기기를 다운시키지 않으면서 생체 인식 및 스푸핑 방지 검사에 충분히 선명한 프레임을 캡처하는 것은 Android 카메라 개발자에게 일반적인 과제입니다.
아프리카의 선도적인 본인 인증 SDK인 SmileID의 경우 다양한 하드웨어 생태계로 인해 이 문제가 두 배로 커집니다. Android는 프로세서가 매우 제한된 보급형 스마트폰, 잘 알려지지 않은 지역 모델, 견고한 맞춤형 판매 시점(POS) 단말기를 포함하여 SmileID의 대상 기기 시장 점유율의 85%를 차지합니다.
CameraX를 채택하기 전에 SmileID는 늘어난 미리보기 피드, 회전된 센서 방향, 메모리 부족(OOM) 비정상 종료, 맞춤 OEM 버그와 같은 일반적이지만 까다로운 카메라 엔지니어링 장애물에 직면했습니다. SmileID는 핵심 Android SDK를 CameraX로 이전하여 이러한 문제를 주요 비즈니스 이점으로 전환했습니다.
SmileID에 따르면 Android SDK를 CameraX로 이전한 결과 다음과 같은 성과를 거두었습니다.
| 측정항목 | CameraX 이전의 영향 |
|---|---|
| SDK 채택 증가율 | 2년 차에 20배(CameraX 이전에는 2~3배) |
| 인증 통과율 | SmileID의 SDK를 사용하는 앱의 경우 20% 증가 |
| 캡처 해상도 | 네트워크 오버헤드 없이 셀카/생체 인식 픽셀 4배 증가 |
| 기기 모델 호환성 | 18,000개 이상의 Android 기기 유형 지원 |
| 확장된 총 인증 수 | 1억 6천만 건 이상의 신원 인증 처리 |
과제: 파편화된 하드웨어 및 기존 API의 문제
사용자의 신원을 확인하기 위해 SmileID의 SDK는 기기 내 생체 인식 확인 및 클라우드 기반 딥페이크 감지를 위해 고해상도 셀카 프레임을 캡처해야 합니다.
기존 Camera1 및 하위 수준 Camera2 API 구현에서는 다음과 같은 여러 이유로 이를 일관되게 달성하기가 어려웠습니다.
- OEM 맞춤설정 및 특이사항: 제조업체마다 기기의 물리적 카메라 센서 방향을 다르게 보고하여 미리보기가 회전되거나 얼굴 캡처 방향이 잘못되는 문제가 발생했습니다.
- 가로세로 비율 왜곡: 저가형 기기에서 특정 프레임 크기를 요청하면 카메라 프리뷰가 세로 또는 가로로 늘어나 사용자의 얼굴이 왜곡되고 생체 인식 인증이 무용지물이 되는 경우가 많았습니다.
- 메모리 부족(OOM) 비정상 종료: RAM이 부족한 기기(보통 1GB 이하)에서 고해상도 원시 이미지를 처리하면 치명적인 메모리 할당 비정상 종료가 자주 발생했습니다.
이러한 문제점으로 인해 SmileID의 전년 대비 SDK 채택 증가율은 2~3배로 제한되었으며, 많은 인증이 실시간 기기 내 생체 인식 검사를 실행하는 대신 지연 시간이 긴 REST API를 통해 정적 사진을 업로드하는 방식으로 대체되어야 했습니다.
해결책: CameraX를 사용한 일관된 파이프라인
SmileID는 CameraX를 사용하여 모바일 SDK를 처음부터 다시 설계했습니다. CameraX는 기본 기기 생태계의 복잡성을 추상화하고 일관된 기본 수명 주기 인식 개발자 인터페이스를 제공하도록 특별히 빌드되었습니다.
SmileID는 CameraX의 핵심 사용 사례(특히 Preview 및 ImageAnalysis)를 사용하여 강력한 이중 목적 카메라 파이프라인을 구축했습니다.
- 미리보기: 카메라 피드의 비율이 완벽한 실시간 미리보기를 렌더링하여 사용자를 안내합니다.
- ImageAnalysis: 로컬에서 실시간으로 프레임을 지속적으로 처리하여 자동화된 활성 및 프레임 내 얼굴 감지를 실행하고 인증된 셀피 프레임을 추출합니다.
SmileID는 OOM 비정상 종료를 일으키지 않고 딥페이크 감지를 위해 매우 선명한 세부정보를 캡처하기 위해 CameraX의 최신 ResolutionSelector API를 ImageAnalysis 구성에 직접 추가했습니다. 이를 통해 개발자는 타겟 해상도를 요청하고 기기가 정확한 크기를 지원하지 않는 경우 대체 규칙을 선택할 수 있습니다. 예를 들어 다음 다이어그램과 샘플 구성은 ResolutionSelector가 1200x900 타겟 주변의 후보 크기를 평가하는 방법을 보여줍니다.
다음은 자체 앱에서 ResolutionSelector를 STRATEGY_KEEP_ONLY_LATEST와 페어링하는 방법을 보여주는 샘플 코드입니다(FALLBACK_RULE_CLOSEST_HIGHER_THEN_LOWER를 사용하여 선명도에 우선순위를 지정하거나 FALLBACK_RULE_CLOSEST_LOWER_THEN_HIGHER를 사용하여 메모리 사용량을 제한).
import android.util.Size import androidx.camera.core.CameraSelector import androidx.camera.core.ImageAnalysis import androidx.camera.core.Preview import androidx.camera.core.resolutionselector.AspectRatioStrategy import androidx.camera.core.resolutionselector.ResolutionSelector import androidx.camera.core.resolutionselector.ResolutionStrategy import androidx.camera.lifecycle.ProcessCameraProvider import androidx.lifecycle.LifecycleOwner fun configureCameraX(cameraProvider: ProcessCameraProvider, lifecycleOwner: LifecycleOwner, surfaceProvider: Preview.SurfaceProvider, executor: java.util.concurrent.Executor, analyzer: ImageAnalysis.Analyzer) { // 1. Define a resolution strategy requesting high quality (for example, 1200x900px) // and selecting the closest higher (or, if unavailable, lower) resolution. val resolutionSelector = ResolutionSelector.Builder() .setResolutionStrategy( ResolutionStrategy( Size(1200, 900), ResolutionStrategy.FALLBACK_RULE_CLOSEST_HIGHER_THEN_LOWER ) ) .setAspectRatioStrategy(AspectRatioStrategy.RATIO_4_3_FALLBACK_AUTO_STRATEGY) .build() // 2. Configure the ImageAnalysis use case with the resolution selector // and a backpressure strategy that keeps the UI responsive on slow processors. val imageAnalysis = ImageAnalysis.Builder() .setResolutionSelector(resolutionSelector) // Drops older frames if the device's CPU is still busy analyzing the previous one .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST) .build() // 3. Set up the preview stream and attach the Analyzer and SurfaceProvider imageAnalysis.setAnalyzer(executor, analyzer) val preview = Preview.Builder().build().also { it.surfaceProvider = surfaceProvider } // 4. Bind both use cases concurrently to the lifecycle provider try { cameraProvider.unbindAll() cameraProvider.bindToLifecycle( lifecycleOwner, CameraSelector.DEFAULT_FRONT_CAMERA, preview, imageAnalysis ) } catch (exc: Exception) { // Handle binding failure safely } }
SmileID는 고밀도 픽셀 프레임을 요청하고 로컬에서 처리하여 캡처된 셀카 해상도를 4배 높였습니다. 또한 SmileID는 기기에서 잘린 얼굴 영역을 압축하여 네트워크 업로드 크기를 이전 시스템과 동일하게 유지했습니다. 이 아키텍처는 사용자의 모바일 데이터 비용을 늘리지 않으면서 머신러닝 모델에 더 정확한 데이터를 제공했습니다.
CameraX가 하드웨어 차이를 해결하는 방법
CameraX를 표준으로 사용함으로써 SmileID는 두 가지 호환성 엔지니어링 레이어를 사용하여 여러 기기에서 SDK를 안정적으로 유지할 수 있었습니다.
1. Google의 카메라 및 미디어 테스트 실험실
CameraX의 호환성은 지속적인 물리적 하드웨어 인증을 통해 지원됩니다. Google의 전용 카메라 및 미디어 테스트 실험실에서는 190개가 넘는 실제 Android 기기 모델의 대규모 순환 매트릭스에서 자동화된 테스트 모음이 매일 실행됩니다. 여기에는 다양한 칩셋, OS 버전, 하드웨어 기능을 나타내는 기기가 포함됩니다.
인기 기기에서 더 일관된 동작을 구현하기 위해 Google의 카메라 및 미디어 테스트 실험실에서는 라이브러리 회귀가 프로덕션 코드에 영향을 미치기 전에 자동으로 포착합니다.
2. 기기 특이사항에 대한 자동 해결 방법
Android 기기마다 물리적 제한이 다릅니다. 일부는 맞춤 노출 설정을 설정하지 못할 수 있고, 일부는 특정 가로세로 비율을 사용할 때 반전된 이미지 데이터를 보고할 수 있습니다. 개발자가 기기 제조업체 및 모델에 따라 복잡한 조건부 블록으로 코드베이스를 오염시키지 않도록 CameraX는 camera-camera2(DeviceQuirksLoader.kt)에서 DeviceQuirks 및 CameraQuirks와 같은 내부 기기 특이사항 클래스를 유지합니다. CameraX는 알려진 문제가 있는 기기를 감지하면 맞춤 해결 방법을 자동으로 삽입합니다. SmileID의 경우 코드베이스에 기기별 패치를 적용하지 않고도 18,000개 이상의 Android 기기 유형에서 SDK가 안정적으로 작동할 수 있었습니다.
최대 1억 6천만 건 이상의 인증으로 확장
SmileID는 CameraX로 이전하여 외부 앱 개발자를 위한 SDK 통합을 간소화했습니다.
가로세로 비율 왜곡, 미리보기 지연, 갑작스러운 OOM 비정상 종료를 제거함으로써 SDK를 사용하는 서비스의 인증 통과율이 20% 증가했습니다. 아프리카 전역의 금융 기관과 모바일 머니 앱의 경우, 통과율이 20% 증가하면 수십만 명의 합법적인 사용자가 이탈하지 않고 성공적으로 온보딩할 수 있습니다.
개발자들도 주목했습니다. CameraX 기반 SDK를 쉽게 통합할 수 있게 되면서 첫해에 채택률이 15배 급증했고 2년 차에는 채택률이 20배로 증가했습니다. 현재까지 SmileID는 CameraX를 사용하여 1억 6천만 건 이상의 본인 인증을 성공적으로 처리했습니다.
CameraX 기술로 호환성 스토리 구축하기
카메라 개발은 어렵지 않습니다. 팀에서 SmileID가 사용한 것과 동일한 CameraX 패턴을 채택할 수 있도록 Android는 AI 코딩 에이전트를 위한 CameraX Skill을 출시했습니다.
개발 환경에서 CameraX Skill을 사용하면 Gemini와 같은 AI 코딩 에이전트가 마이그레이션, 수명 주기 결합, ConcurrentCamera, MlKitAnalyzer에 현재 CameraX 패턴을 적용합니다. 듀얼 카메라 피드를 설정하든, PreviewView 또는 CameraXViewfinder로 미리보기를 구성하든, 실시간 머신러닝(ML) 분석을 관리하든, CameraX Skill은 에이전트가 정확하고 프로덕션에 즉시 사용 가능한 코드를 생성하도록 안내합니다.
- CameraX 기술 살펴보기: Android 개발자 기술 디렉터리를 방문하거나 Android CLI로
android skills add camerax를 실행하여 AI 코딩 도구에 기술을 추가합니다. - CameraX 시작하기: 공식 CameraX 문서를 살펴보고 어디서나 카메라 환경을 실행하세요.
-
우수사례Grab은 동남아시아의 선도적인 슈퍼 앱으로, 하나의 앱을 통해 8개 국가의 수백만 명의 사용자에게 배송, 모빌리티, 금융 서비스를 제공합니다.
Ajesh Pai, Nguyen Van Minh, Tracy Agyemang • 읽는 데 5분 소요 -
우수사례이 팀은 원래 구현보다 50% 작은 AI 기반 UI 코드베이스를 구축하는 동시에 AI 에이전트 실행 시간을 35% 단축하고, 엔지니어와 에이전트 간의 상호작용을 32% 줄이고, 토큰 비용을 33% 절감했습니다.
Pavlo Stavytskyi, Rebecca Franks • 읽는 데 11분 소요 -
우수사례WhatsApp은 전 세계 수십억 명의 사용자에게 서비스를 제공하는 세계 최대 규모의 메시지 플랫폼입니다. WhatsApp은 다양한 지역의 사용자가 비공개적이고 안정적이며 안전한 메시지를 통해 소통할 수 있는 기본 커뮤니케이션 도구입니다.
Niharika Arora, Tracy Agyemang, Mayank Jain • 읽는 데 8분 소요
Android 개발 관련 최신 정보를 이메일로 받아 보세요.