銀行や SIM 登録用の本人確認アプリでは、なりすましやディープフェイクを検出するために、鮮明で高解像度の顔画像が必要です。ライブネス チェックやなりすまし防止チェックに十分な鮮明さのフレームを、メモリの少ないデバイスをクラッシュさせることなくキャプチャすることは、Android カメラ デベロッパーにとって共通の課題です。
アフリカを代表する本人確認 SDK である SmileID にとって、この課題は多様なハードウェア エコシステムによってさらに複雑になっています。Android は、SmileID の対象デバイスのマーケット シェアの 85% を占めています。これには、プロセッサが非常に制限されたエントリーレベルのスマートフォン、あまり知られていない地域モデル、堅牢なカスタム POS 端末が含まれます。
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,000 万件以上の本人確認を処理 |
課題: ハードウェアの断片化とレガシー API の問題
ユーザーが本人であることを確認するために、SmileID の SDK は、デバイス上のライブネス チェックとクラウドベースのディープフェイク検出のために、高解像度の自撮りフレームをキャプチャする必要があります。
従来の Camera1 と低レベルの Camera2 API の実装では、いくつかの理由から、これを一貫して実現することは困難でした。
- OEM のカスタマイズと不具合: メーカーによって、デバイスが報告する物理的なカメラセンサーの向きが異なり、プレビューが回転したり、顔のキャプチャの向きが間違ったりしていました。
- アスペクト比の歪み: 低価格帯のデバイスで特定のフレームサイズをリクエストすると、カメラのプレビューが縦または横に引き伸ばされ、ユーザーの顔が歪んで生体認証が機能しなくなることがよくありました。
- メモリ不足(OOM)によるクラッシュ: RAM が少ない(多くの場合 1 GB 以下)デバイスで高解像度の RAW 画像を処理すると、メモリ割り当ての致命的なクラッシュが頻繁に発生していました。
これらの摩擦点により、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 は、切り抜いた顔領域をデバイス上で圧縮することで、ネットワーク アップロード サイズを以前のシステムと同じに保ちました。このアーキテクチャにより、ユーザーのモバイルデータ通信コストを増やすことなく、ML モデルのデータをより鮮明にすることができました。
CameraX がハードウェアの違いを解決する方法
CameraX を標準として採用したことで、SmileID は 2 つのレイヤの互換性エンジニアリングを利用して、デバイス間で SDK の安定性を維持できるようになりました。
1. Google のカメラおよびメディアテストラボ
CameraX の互換性は、継続的な物理ハードウェア検証によって裏付けられています。Google の専用のカメラとメディアのテストラボでは、190 以上の Android デバイスモデルの膨大なローテーション マトリックス全体で、自動テストスイートが毎日実行されています。これには、さまざまなチップセット、OS バージョン、ハードウェア機能を備えたデバイスが含まれます。
一般的なデバイス間で動作の一貫性を高めるため、Google の Camera and Media Test Lab は、ライブラリの回帰が本番環境のコードに影響する前に自動的に検出します。
2. デバイスの不具合に対する自動回避策
Android デバイスによって物理的な制限は異なります。カスタム露出設定を設定できない場合や、特定のアスペクト比を使用すると画像データが反転して表示される場合があります。デベロッパーがデバイスのメーカーやモデルに基づいて複雑な条件ブロックをコードベースに追加するのを防ぐため、CameraX は、camera-camera2(DeviceQuirksLoader.kt)で DeviceQuirks や CameraQuirks などの内部デバイス クアーク クラスを維持しています。CameraX は、既知の問題があるデバイスを検出すると、カスタマイズされた回避策を自動的に挿入します。SmileID の場合、SDK が 18,000 種類以上の Android デバイスで確実に動作し、コードベースにデバイス固有のパッチを適用する必要がなくなりました。
1 億 6,000 万件以上の検証にスケールアップ
CameraX に移行することで、SmileID は外部アプリ デベロッパー向けの SDK 統合を簡素化しました。
アスペクト比の歪み、プレビューの遅延、突然の OOM クラッシュを排除したことで、SDK を使用するサービスの検証合格率が 20% 向上しました。アフリカ全土の金融機関やモバイルマネー アプリにとって、合格率が 20% 向上するということは、何十万人もの正規ユーザーが離脱することなく、オンボーディングに成功することを意味します。
デベロッパーはこれに注目しました。CameraX ベースの SDK は統合が容易なため、最初の 1 年で導入数が 15 倍に急増し、2 年目には 20 倍に達しました。SmileID はこれまでに、CameraX を使用して 1 億 6, 000 万件以上の本人確認を処理しています。
CameraX スキルで互換性ストーリーを構築する
カメラ向けの開発は、必ずしも難しいものではありません。SmileID が使用したのと同じ CameraX パターンをチームが採用できるように、Android は AI コーディング エージェント向けの CameraX Skill をリリースしました。
開発環境で CameraX Skill を使用すると、Gemini などの AI コーディング エージェントが、移行、ライフサイクル バインディング、ConcurrentCamera、MlKitAnalyzer に現在の CameraX パターンを適用します。デュアルカメラ フィードの設定、PreviewView または CameraXViewfinder を使用したプレビューの設定、リアルタイムの ML 分析の管理など、CameraX スキルはエージェントをガイドして、正確でプロダクション レディなコードを生成します。
- CameraX スキルを試す: Android デベロッパー スキル ディレクトリにアクセスするか、Android CLI で
android skills add cameraxを実行して、AI コーディング ツールにスキルを追加します。 - CameraX を使ってみる: CameraX の公式ドキュメントを参照して、どこでもカメラ エクスペリエンスを実行できるようにします。
-
事例紹介Grab は、東南アジアを代表するスーパーアプリです。1 つのアプリで、8 か国の数百万人のユーザーにデリバリー、モビリティ、金融サービスを提供しています。
Ajesh Pai, Nguyen Van Minh, Tracy Agyemang • 所要時間: 5 分 -
事例紹介チームは、元の実装よりも 50% 小さい AI ネイティブの UI コードベースを構築し、AI エージェントの実行時間を 35% 短縮、エンジニアとエージェントのやり取りを 32% 削減、トークン費用を 33% 削減しました。
Pavlo Stavytskyi, Rebecca Franks • 所要時間: 11 分 -
事例紹介WhatsApp は世界最大のメッセージ プラットフォームであり、世界中の数十億人のユーザーにサービスを提供しています。さまざまな地域のユーザーがデフォルトのコミュニケーション ツールとして使用しており、プライベートで信頼性が高く、安全なメッセージングを通じてユーザー同士をつなげています。
Niharika Arora, Tracy Agyemang, Mayank Jain • 所要時間: 8 分
Android 開発に関する最新の分析情報を毎週メールでお届けします。