
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 Native DevTools、Chrome DevTools、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メディアプレーヤーの多くを簡単に使用できます。今後のリリースでは、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ランタイムの仕組みと似ています。

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

