ドライブレコーダー アプリは、AAOS と統合して、安全性とセキュリティの強化のためドライバーに動画録画機能を提供することを目的とするものです。このガイドでは、技術要件、統合手順、および実装を確実に成功させるためのおすすめの方法について説明します。
前提条件
まず、次の前提条件を満たしていることをご確認ください。
SDK:
- SDK 31 以降が必要です。
ハードウェア:
- AAOS 対応の EVS または Camera2 カメラ。
- 動画の録画に利用可能な、保存容量が十分にある内部ストレージまたはリムーバブル外部ストレージのサポート。
ソフトウェア要件:
- バンドルされていないアプリのサポート。詳しくは、バンドルされていないアプリをご覧ください。
- 権限。ドライブレコーダーにはシステム権限が必要です。
ソースコードを取得する
ソースコードは次の場所にあります(Android ソースコード検索をご利用ください)。
ソースコードは次の 3 つのモジュールで提供されます。
- Dashcam Service。ストリーミング、録画、トリガーのロジック。
- Dashcam Manager。Dashcam Service に接続して、安定版 API をクライアントに公開
- Dashcam App。Dashcam Manager API を使用してドライブレコーダー アプリを参照
ドライブレコーダーをビルドする
ドライブレコーダーのビルドには Soong または Gradle を使用します。
Soong
Soong からビルドする前に、.cxx
ディレクトリを必ずクリーンアップしてください。
Soong の場合:
mma DashcamService DashcamManager-lib DashcamApp
APK の場所: out/target/product/[lunch-target]/system/priv-app/
Gradle
Gradle の場合:
./gradlew :dashcam-app:assemble
./gradlew :dashcam-manager:assemble
./gradlew :dashcam-service:assemble
APK の場所: out/aaos-apps-gradle-build/
Gradle でドライブレコーダーをビルドする詳しい手順は、README
ファイルに記載されています。
権限
Dashcam Service と Dashcam App には、いくつかのシステム権限が必要です。
必要な権限を付与する最も簡単な方法は、Blueprint または Make を使用して事前ビルドのセットアップに権限を含めることです。
Blueprint の場合:
Android.bp
android_app_import {
name: "DashcamApp-prebuilt",
apk: "DashcamApp.apk",
privileged: true,
certificate: "platform",
required: ["allowed_privapp_com.android.car.dashcam"],
}
Make の場合:
dashcam.mk
PRODUCT_PACKAGES += \
DashcamApp
PRODUCT_COPY_FILES :=\
vendor/[path-to-vendor-prebuilts]/apps/CarCatApp/allowed_privapp_com.android.car.dashcam:$(TARGET_COPY_OUT_PRODUCT)/etc/permissions/com.android.car.dashcam.xml \
allowed_privapp_com.android.car.dashcam.xml
という名前の権限ファイルを作成します。
<permissions>
<privapp-permissions package="com.android.car.dashcam.service">
<permission name="" />
</privapp-permissions>
<privapp-permissions package="com.android.car.dashcam.app">
<permission name="" />
</privapp-permissions>
</permissions>
マニフェストからこの権限ファイルに権限を追加します。
詳しくは、システム イメージへの事前ビルドをご覧ください。
サイドローディング
権限ファイルはサイドローディングすることもできます。事前ビルドのドライブレコーダーが設定されていない場合は、この方法を使用してください。
事前ビルドのセクションで作成した権限ファイルを使用して、次のコマンドを実行します。
adb root
adb remount
adb push allowed_privapp_com.android.car.dashcam.xml /etc/permissions/allowed_privapp_com.android.car.dashcam.xml
adb shell chmod 644 /etc/permissions/allowed_privapp_com.android.car.dashcam.xml
オーバーレイを設定する
Dashcam Service にはオーバーレイ可能な構成があります。
サービス構成
dashcam-service/res/values/config.xml
このファイルにサービスの構成が含まれています。
allow_internal_storage
: 内部ストレージへの録画を許可save_location
: 録画を保存するディレクトリ名(デフォルトは dashcam)max_storage_mb
: ドライブレコーダーに使用を許可する保存容量max_age_days
: ファイルへの保存期間(この期間を過ぎると枝刈りが行われます)boot_startup_enabled
: デバイスの起動時に Dashcam Service 始動notifications_on
: 録画の開始時に通知を表示native_recorder
: NDK API を使用(デフォルトは Java API)native_renderer
: NDK API を使用(デフォルトは Java API)default_app_component
: デフォルトのドライブレコーダー アプリ(このアプリにはグローバルな録画アクセス権とグローバルなトリガー アクセス権が付与されている)recording_module
: IRecordingModule 実装の ComponentNamestreaming_module
: IRecordingModule 実装の ComponentNametrigger_module
: IRecordingModule 実装の ComponentName
トリガーを設定する
構成をトリガーするには、次のコマンドを実行します。
dashcam-service/src/assets/config.xml
このファイルに、録画トリガーの構成が含まれています。トリガーは次の 2 つの部分から構成されます。
プレロール ID。EVS または Camera2(サポートに応じて異なる)のカメラの ID。
prerollLengthMs
: イベントごとに保存されるプレロールの長さ。
<Preroll>
<Camera
ID="0"
prerollLengthMs="10000" />
</Preroll>
この例では、カメラ ID は 0 で、プレロールは 10 秒です。
name
: 一意のトリガー名camera
: EVS または Camera2(サポートに応じて異なる)のカメラの IDsensorPropertyID
: センサーの IDdescription
: UI に表示されるトリガーの説明recordingLengthMs
: イベントの後の録画時間(ミリ秒単位)sensorType
: センサーの種類(VHAL
またはSENSOR_MANAGER
)sensorValueType
: センサーで生成されるデータ型(INT
、INT_ARRAY
、FLOAT
、FLOAT_ARRAY
、BOOLEAN, STRING
のいずれか)thresholdType
: センサーの値の評価方法(AVERAGE
、BOOLEAN
、EQUALS
、LEAP
、LEAP_AVERAGE
、LEAP_OVER
、PEAK
、PEAK_HOLD
のいずれか)thresholdValue
: センサーの値と比較するしきい値の種類の値thresholdExtra
:AVERAGE
の範囲など、一部のしきい値の種類に必要となる追加の値triggerCooldown
: この種類の別のイベントを発生させるまでのクールダウン(ミリ秒単位)
<EventTriggers>
<EventTrigger
name="AEB"
camera="1 2"
sensorPropertyID="289411073"
description="Automatic Emergency Braking"
recordingLengthMs="20000"
sensorType="VHAL"
sensorValueType="INT"
thresholdType="EQUALS"
thresholdValue="2"
triggerCooldown="5000"/>
</EventTriggers>
この例に示す VHAL センサーで生成される整数値を利用して、equality をしきい値と比較します。equality の条件を満たしていると、トリガーがカメラ 1 と 2 で録画します。
<EventTrigger
name="SPEED"
camera="1 2 3 4"
sensorPropertyID="291504648"
description="Over speed"
recordingLengthMs="10000"
sensorType="VHAL"
sensorValueType="FLOAT"
thresholdType="AVERAGE"
thresholdValue="20.0"
thresholdExtra="1000"
triggerCooldown="2000"/>
この例に示す VHAL センサーで生成される浮動小数点数値を利用して、サンプルの範囲の平均をしきい値に照らして比較します。サンプルの範囲は thresholdExtra
で設定されます。
モジュール
Dashcam Service は次の 3 つのモジュールで構成されています。
Stream には、カメラからのストリーミングを処理するためのロジックが含まれます。
Recording には、録画を処理するためのロジックが含まれます。
Trigger には、センサーデータから録画をトリガーするためのロジックが含まれます。 モジュール API は、対応するインターフェースの
IStreamModule
、IRecorderModule
、ITriggerModule
で定義され、DashcamServiceAPI
を介して Dashcam Manager に公開されます。
モジュールをオーバーレイする
Dashcam Service は dashcam-service/res/values/config.xml
を使用してモジュールの実装場所を判断します。各モジュールにはデフォルトの実装が用意されていますが、各モジュールは、対応する構成値でコンポーネントを設定することでオーバーレイできます。
IRecorderModule
の OEM 実装コンポーネント名をrecording_module
に設定します。IStreamModule
の OEM 実装コンポーネントを Stream モジュールに設定します。ITriggerModule
の OEM 実装コンポーネント名をtrigger_module
に設定します。実行時に、Dashcam Service は各モジュールの
config.xml
で設定されているコンポーネント名をインスタンス化します。
アプリ デベロッパー ガイド
ドライブレコーダーは、プロダクション レディであると同時にカスタマイズ可能なドライブレコーダー ソリューションでもあります。ドライブレコーダーは Dashcam service
との通信に Dashcam Manager API を使用します。この Dashcam Manager API は IDashcamManager
にあります。必要な権限があれば、どのアプリでも Dashcam Manager を使用できます。
権限
Camera2 と EVS がサポートされています。
事前ビルド
必要な権限を付与する最も簡単な方法は、Blueprint または Make を使用して事前ビルドのセットアップに権限を含めることです。
OverlayUI
アプリはランタイム リソース オーバーレイでカスタマイズできます。詳しくは、ランタイム リソース オーバーレイをご覧ください。オーバーレイ可能な要素の一覧については、overlayable.xml をご覧ください。
トリガーを拡張する
トリガーは、DashcamManager.addTrigger()
呼び出しで、現在のセッションに対して拡張できます。追加されたトリガーは、現在のセッションに対してのみ保持されます。
自動スタート
録画の自動スタートはサポートされていませんが、手動トリガーは onBoot
で DashcamManager.startRecording()
呼び出しによって開始できます。
おすすめの方法
ストレージ。リムーバブル外部ストレージの使用を強くおすすめします。
ユーザー エクスペリエンス。ドライブレコーダー アプリの UI は直感的に操作できるユーザー フレンドリーなものにし、AAOS デザイン ガイドラインに沿ってデザインしてください。
パフォーマンスの最適化。リソース使用量を最小限に抑え、AAOS でスムーズに操作できるよう、アプリのパフォーマンスを最適化してください。
トラブルシューティング
カメラの接続性に関する問題。EVS または Camera2 がサポートされ、AAOS IVI で利用できる必要があります。
ストレージ エラー。ストレージの空き容量を確認し、録画を管理してください。 外部ストレージの使用を強くおすすめします。内部ストレージを使用すると、ストレージが予定より早くなくなる可能性があります。