
Layer cake of react native platforms. Vega OS supports multiple form factors of devices.
アーキテクチャの指針
同等性
Vega向けReact Nativeは、React Nativeのクロスプラットフォームの原則を取り入れ、RN APIや人気のあるライブラリと同等の機能を提供することを目指しています。RNVはRNのコアコンポーネントとAPIの80%以上をサポートしています。さらに、RNエコシステムで広く利用されている40以上のRNライブラリも移植済みです。このサポートにより、Vega OSとその他のOSプラットフォーム間でコードを再利用できます。また、RNVには、TVデバイスに固有のフォーカス管理機能とイベント処理機能をサポートするRN tvOSのAPIも含まれています。そのほか、RNVには必要に応じて特定のRNプラットフォーム専用のAPIも含まれています。これには、BackHandler(Android)やSafeAreaView(iOS)などがあります。
Vega SDKは一般的なRNツールと開発/テスト用のユーティリティもサポートし、アプリ開発を高速化するとともに、高性能なランタイム環境を提供します。React Dev Tools、Chrome Dev Tool、FlashlightなどのツールをRNVで使用できます。これらのツールで既存のワークフローを活用できるため、クロスプラットフォーム環境での作業が可能となります。
パフォーマンス
Amazonは、Amazonデバイスでのパフォーマンスが最適化されるようにVega向けReact Nativeを一から設計しました。アプリは、Vegaのパフォーマンスに関するKPIを満たす必要があります。 RNVはReact Nativeの新しいアーキテクチャで構築され、RNコアフレームワークのすべての改善点が取り入れられています。新しいアーキテクチャでは、次の機能がサポートされます。- 同期レイアウト/イベント
- 並列レンダリング
- JavaScriptの高速実行およびJSIによるネイティブコードの相互運用(ターボモジュールのサポートを含む)
マルチプロファイルとマルチモーダル
Vega向けReact Nativeは、テレビやスマートスピーカーなど、さまざまなAmazonデバイスをサポートし、柔軟なレイアウトを使用してさまざまな画面サイズにコンテンツをフィットさせます。Platform APIを使用して、実行時にさまざまなデバイスタイプに合わせてアプリを調整できます。また、Vegaのビルドツールを使用すれば、アプリのビルド段階で特定のデバイス向けに機能をカスタマイズすることもできます。 ユーザーは、音声、タッチ、リモコンなど、さまざまな方法でAmazonデバイスを制御できます。Vega向けReact Native(RNV)は、これらすべての制御方法を自動的にサポートします。RNVのコンポーネントは、タッチスクリーンとリモコンのD-Padの両方に対応しています。このフレームワークにはAlexa音声制御も含まれているため、ユーザーは音声コマンドでアプリを操作したりメディアを制御したりできます。特にテレビアプリに対しては、リモコンのナビゲーションとフォーカス管理を処理するための専用ツールが用意されています。標準への準拠
RNVでは、アプリ機能の構築にアプリ開発で広く採用されている標準規格を使用しています。React Nativeと同様のAPIを提供することを目標としつつ、コア機能にはW3C標準規格も取り入れています。たとえば、メディア再生にはW3C標準を採用しているため、既存のJavaScriptメディアプレーヤーの多くを簡単に使用できます。RNVの今後のリリースでは、ウェブ標準規格に基づくWebCryptoおよびWebWorkersもサポートされる予定です。これらの広く普及している標準規格を採用することで、RNVでは、ウェブブラウザ向けに作成された多くのJavaScriptライブラリをVegaアプリで容易に使用することができます。実装
Amazonは、Vega OSを実行するデバイスをサポートするため、React Nativeフレームワークのツリー外実装としてVega向けReact Nativeを構築しました。RNVは、React Common、Yoga、HermesなどのReact NativeソフトウェアスタックをVega OS向けに移植して、VegaのネイティブUIフレームワーク上で動作するようにしています。RNVはReact Nativeの新しいアーキテクチャを使用しており、JavaScriptとネイティブコードとのインターフェイスにはJSIのみをサポートします。新しいFabricレンダラーにも対応しており、同期レイアウトとエフェクト処理の改善、および並列レンダリングを実現します。さらにRNVは、Vegaプラットフォーム用のTurbo NativeモジュールとFabric Nativeコンポーネントを通じたネイティブ統合をサポートしています。
Layer cake for React Native for Vega out of tree implementation. RNV is integrated with Vega’s native UI framework, leveraging several of Vega’s middleware including graphics, application framework, etc.
OSへの組み込みと動的なリンク
RNVでは、React Nativeランタイム全体をVega OSにバンドルし、実行時にアプリに動的にリンクするという独自のアーキテクチャが採用されています。または、既存のVegaプラットフォームの場合、ランタイムをアプリバイナリに静的にリンクし、アプリコードとともにバンドルしています。
この独自のアプリアーキテクチャを採用することで、Vega OSを実行するデバイスで、オンディスクストレージ、起動とアプリの切り替えにかかる時間、メモリ使用量が最適化されます。React Nativeランタイムの削除により、アプリバンドルのサイズは10MB以上削減されます。また、OSからランタイムを読み込む方式にすることで、Vegaプラットフォームがプロセスプールを事前にウォームアップできるため、React Nativeアプリの起動時間が短縮されます。
RNVでは、スプリットバンドリングでメインのJavaScriptコードをReactとReact Nativeのライブラリから分離することもできます。スプリットバンドリングを使用すると、アプリのサイズを1~2メガバイト削減できるほか、デバイスのオペレーティングシステムでのアプリの動作も改善します。アプリ起動時には、これら分離されたReactおよびReact Nativeコンポーネントがアプリ本体のコードとともに読み込まれます。このアプローチは、標準的なReact Nativeランタイムの仕組みと似ています。

図: 通常のJSバンドルをビルドする場合と、Vega向けReact Nativeで分割バンドルビルドを行う場合のビルド手順の違い。最終的なアプリvpkgにパッケージ化されるのは、App Bundleのみです。
APIとABIの安定性
React NativeをVegaオペレーティングシステムに組み込むことには、いくつかの課題が伴います。重要な変更を含むReact Nativeの新しいバージョンがリリースされると、アプリが正しく動作しなくなる可能性があります。また、Hermes(JavaScriptエンジン)によるコードの処理方法が変わるため、新しいリリースごとにJavaScriptコードを再コンパイルする必要があります。React Nativeを使用する他のプラットフォームでは、React Nativeランタイムを各アプリとともにパッケージ化することで、これらの問題を回避しています。ランタイムは、アプリのビルド時に使っていたバージョンを必ず使用するようにします。 現在のVegaオペレーティングシステムはReact Nativeバージョン0.72を使用していますが、近日中により新しいバージョンへの更新を予定しています。対象のVegaデバイスで利用可能なReact Nativeバージョンを確認し、それに応じてアプリを設定する必要があります。正しいバージョンを確認することにより、古いバージョンとの互換性を維持しながら、現在と将来どちらのVegaデバイスでもアプリが正しく動作することを保証できます。 RNVは、互換性の問題を処理するために以下の2つの主要なソリューションを提供しています。- デュアルバンドルパッケージ:RNVには、各アプリにコンパイル済みJavaScriptコードとコンパイル前のJavaScriptコードの両方が含まれています。そのため、デバイスが新しいバージョンのJavaScriptエンジン(Hermes)で更新された場合、Amazonアプリストアはインストール中にアプリのコードを自動的に再コンパイルできます。
- バージョン管理システム:アプリの依存関係について、必要最小バージョンと推奨バージョンの両方を指定できます。このバージョン管理により、アプリストアはどのデバイスでアプリを実行できるかを判断できます。RNVには、あるデバイスで依存関係の特定のバージョンを使用できるかどうかを確認するための
isPresentOnOSというツールも用意されています。

