©2018 Wantedly, Inc. 2018-03-20 shibuya.apk #23 @cattaka_net
Camera API 1と2が混在するプロダクトの開発で
泣いたこととそのワークアラウンド
20.Mar.2018 – Takao Sumitomo
ページタイトルページサブタイトル
©2018 Wantedly, Inc.©2018 Wantedly, Inc. 2018-03-20 shibuya.apk #23 @cattaka_net
自己紹介
●
住友 孝郎(Takao Sumitomo)
– Wantedly 所属
– Androidアプリを主担当
●
こんなアプリ作ってます
– Wantedly People
– 名刺管理アプリ
– リアルタイムに名刺を認識して取り込むアプリ
©2018 Wantedly, Inc. 2018-03-20 shibuya.apk #23 @cattaka_net
今回はCamera API 1 / 2についてのお話です
ページタイトルページサブタイトル
©2018 Wantedly, Inc.©2018 Wantedly, Inc. 2018-03-20 shibuya.apk #23 @cattaka_net
おさらい
ページタイトルページサブタイトル
©2018 Wantedly, Inc.©2018 Wantedly, Inc. 2018-03-20 shibuya.apk #23 @cattaka_net
新旧2つのAPI
● Camera API 1
– プレビューを表示して、シャッターを切る
– 一般的なカメラを意識したインターフェースで制限が多い
● Camera API 2
– カメラの内部イベントをJava層に引っ張り出したようなインターフェース
– 自由度は高いけど扱いが難しい
ページタイトルページサブタイトル
©2018 Wantedly, Inc.©2018 Wantedly, Inc. 2018-03-20 shibuya.apk #23 @cattaka_net
なんで混在させたか?
ページタイトルページサブタイトル
©2018 Wantedly, Inc.©2018 Wantedly, Inc. 2018-03-20 shibuya.apk #23 @cattaka_net
理由
●
当時は4.xを切るわけに行かなかった
– 市場で数割はマーケティング費用に換算すると大きい
●
Camera API 2でもLegacyモードのデバイスはパフォーマンスが悪い
●
Camera API 1はプレビューの解像度がFHDが上限
良いとこ取りをしたい!
ページタイトルページサブタイトル
©2018 Wantedly, Inc.©2018 Wantedly, Inc. 2018-03-20 shibuya.apk #23 @cattaka_net
混在させる実装アプローチ
ページタイトルページサブタイトル
©2018 Wantedly, Inc.©2018 Wantedly, Inc. 2018-03-20 shibuya.apk #23 @cattaka_net
抽象化したらいいやん?
ICameraEngine
CameraEngine1 CameraEngine2
Camera API 1 Camera API 2
アプリからは
これだけを意識する
ページタイトルページサブタイトル
©2018 Wantedly, Inc.©2018 Wantedly, Inc. 2018-03-20 shibuya.apk #23 @cattaka_net
茨の道でした
ページタイトルページサブタイトル
©2018 Wantedly, Inc.©2018 Wantedly, Inc. 2018-03-20 shibuya.apk #23 @cattaka_net
どちらもコールバックで
フレームを受け取るが、、、
● Camera API 1
–コールバックは原則UIThreadで呼ばれる
● Camera API 2
–コールバックのスレッドを選べる
UIThreadで重い処理をしたくない
ページタイトルページサブタイトル
©2018 Wantedly, Inc.©2018 Wantedly, Inc. 2018-03-20 shibuya.apk #23 @cattaka_net
フレームをRxJavaで
ストリームにしたら行けるでしょ?
http://reactivex.io/documentation/operators/backpressure.html より
ページタイトルページサブタイトル
©2018 Wantedly, Inc.©2018 Wantedly, Inc. 2018-03-20 shibuya.apk #23 @cattaka_net
簡単には行かない!
●
フレームのサイズが大きすぎる
–FHD:1920x1080x32bit ≒ 8.3MB
–QHD:3840x2160x32bit ≒ 33.2MB
ページタイトルページサブタイトル
©2018 Wantedly, Inc.©2018 Wantedly, Inc. 2018-03-20 shibuya.apk #23 @cattaka_net
OOMの危険
●
認識ロジックは時間が掛かるので、詰まると即OOMになる
●
RxJavaのBackpressureも考えたが、緻密な制御が必要なので怖い
ページタイトルページサブタイトル
©2018 Wantedly, Inc.©2018 Wantedly, Inc. 2018-03-20 shibuya.apk #23 @cattaka_net
結局、バッファとセマフォで
制御をフルスクラッチした
ページタイトルページサブタイトル
©2018 Wantedly, Inc.©2018 Wantedly, Inc. 2018-03-20 shibuya.apk #23 @cattaka_net
つまり筋力でカバー
©2018 Wantedly, Inc. 2018-03-20 shibuya.apk #23 @cattaka_net
機種依存をどうやって確認するか?
ページタイトルページサブタイトル
©2018 Wantedly, Inc.©2018 Wantedly, Inc. 2018-03-20 shibuya.apk #23 @cattaka_net
クラウドテストが使えない
●
リモートでテストできるけど触れない...
–Firebase Test Lab
–Amazon Device Farm
–etc
操作感の確認は実機を触るしか無い
ページタイトルページサブタイトル
©2018 Wantedly, Inc.©2018 Wantedly, Inc. 2018-03-20 shibuya.apk #23 @cattaka_net
気合で実機でテスト
●
シェア上位の60機種をリストアップ
●
検証センターに篭った
ページタイトルページサブタイトル
©2018 Wantedly, Inc.©2018 Wantedly, Inc. 2018-03-20 shibuya.apk #23 @cattaka_net
それでも出てくる機種依存
●
CameraCharacteristicsで確認してるのに、組み合わせで駄目なデバイスがある
– 駄目な場合に「何もしない」にフォールバックするデバイス
●
コアバリューに影響する
– AutoFocusやAutoWhiteBalanceが動かない
●
android.os.Build を見て個別に対応を入れた
ページタイトルページサブタイトル
©2018 Wantedly, Inc.©2018 Wantedly, Inc. 2018-03-20 shibuya.apk #23 @cattaka_net
つまり筋力でカバー
©2018 Wantedly, Inc. 2018-03-20 shibuya.apk #23 @cattaka_net
まとめ
ページタイトルページサブタイトル
©2018 Wantedly, Inc.©2018 Wantedly, Inc. 2018-03-20 shibuya.apk #23 @cattaka_net
ギリギリの環境はフルスクラッチしかない
ページタイトルページサブタイトル
©2018 Wantedly, Inc.©2018 Wantedly, Inc. 2018-03-20 shibuya.apk #23 @cattaka_net
機種依存の確認はひたすら実機で検証
ページタイトルページサブタイトル
©2018 Wantedly, Inc.©2018 Wantedly, Inc. 2018-03-20 shibuya.apk #23 @cattaka_net
つまり筋力でカバー
ページタイトルページサブタイトル
©2018 Wantedly, Inc.©2018 Wantedly, Inc. 2018-03-20 shibuya.apk #23 @cattaka_net
筋トレしていこう
ページタイトルページサブタイトル
©2018 Wantedly, Inc.©2018 Wantedly, Inc. 2018-03-20 shibuya.apk #23 @cattaka_net
ご清聴ありがとうございました

Camera API 1と2が混在するプロダクトの開発で 泣いたこととそのワークアラウンド