OpenHarmonyのutilsコンポーネントは、各業務サブシステムおよび上位アプリケーションから利用可能であり、チップ側のファイルシステム実装に依存している。具体的には、チッププラットフォームがファイルのオープン・クローズ、読み書き、サイズ取得などの基本機能を提供する必要がある。
HALインタフェースの要件
OpenHarmonyのファイルシステムを移植するには、以下のHAL(Hardware Abstraction Layer)インタフェースを実装する必要がある。
ファイルのオープン・クローズ
| インタフェース名 | 説明 |
|---|---|
| HalFileOpen | 既存ファイルを開く、または新規ファイルを作成する。 |
| HalFileClose | ファイルを閉じる。 |
ファイル操作関連インタフェース
| インタフェース名 | 説明 |
|---|---|
| HalFileRead | ファイルからデータを読み込む。 |
| HalFileWrite | ファイルにデータを書き込む。 |
| HalFileDelete | ファイルを削除する。 |
| HalFileStat | ファイルのメタ情報を取得する。 |
| HalFileSeek | ファイル内の位置を移動する。 |
これらのインタフェースの定義は、OpenHarmonyの以下パスに存在する:
//utils/native/lite/file
├── BUILD.gn
└── src
└── file_impl_hal
└── file.c # ファイル操作のラッパー実装
//utils/native/lite/hals
└── file
└── hal_file.h # HALインタフェースのヘッダ
対応するBUILD.gnの内容は以下の通りである:
import("//build/lite/config/component/lite_component.gni")
static_library("native_file") {
sources = [
"src/file_impl_hal/file.c",
]
include_dirs = [
"//utils/native/lite/include",
"//utils/native/lite/hals/file",
]
deps = ["$ohos_vendor_adapter_dir/hals/utils/file:hal_file_static"]
}
lite_component("file") {
features = [ ":native_file" ]
}
この設定から、ベンダーによるHAL実装は$ohos_vendor_adapter_dir/hals/utils/file配下に置かれ、そのBUILD.gnでhal_file_staticという静的ライブラリとして定義される必要があることがわかる。
移植アプローチの選択肢
- フラッシュ直接アクセス方式:RAWフラッシュ領域に対して直接読み書きを行い、ファイル操作をエミュレートする。
- 軽量ファイルシステムの利用:littlefsやFatFsなどの軽量ファイルシステムを用いて実装する。OpenHarmonyの
//third_partyディレクトリにはFatFsの参考実装が含まれている。 - 既存ファイルシステムの統合:ベンダーがすでに搭載しているファイルシステムを再利用し、HALインタフェースにマッピングする。
実際の移植手順
1. config.jsonへのコンポーネント追加
製品設定ファイル(例:vendor/MyVendorCompany/MyProduct/config.json)にutilsサブシステムのfileコンポーネントを追記する:
{
"subsystem": "utils",
"components": [
{ "component": "file", "features": [] }
]
}
2. HAL実装の配置
config.json内でvendor_adapter_dirが以下のように定義されている場合:
"vendor_adapter_dir": "//device/MyDeviceCompany/MyBoard/adapter"
このディレクトリ配下にHAL実装を配置する:
device/MyDeviceCompany/MyBoard/adapter/hals/utils/file/
├── BUILD.gn
└── src
└── hal_file.c
対応するBUILD.gnの内容は以下のようになる:
import("//build/lite/config/component/lite_component.gni")
static_library("hal_file_static") {
sources = [ "src/hal_file.c" ]
include_dirs = [
"//utils/native/lite/hals/file",
]
}
これにより、OpenHarmonyのファイル操作APIがベンダー固有のファイルシステムと接続され、utilsコンポーネントが正常に動作するようになる。