WebAssembly in Android Apps 〜 WASMはJNIの夢を見るか
keiji_ariyamaC-LIS CO., LTD.
AndroidアプリでC/C++で書かれた既存資産(ネイティブライブラリ)を利用する際、長らく標準的な選択肢だった「JNI(Java Native Interface)」。しかし、画像コーデックなどの巨大で複雑なライブラリにおいては、ひとたび脆弱性を突かれるとアプリひいてはシステム全体を巻き込む深刻なセキュリティリスクを孕んでいます。 本セッションでは、JPEG2000デコーダー(OpenJPEG)のAndroid向け移植ライブラリ「jp2k-decoder-android」の開発事例を通じて、JNIに代わる新たな選択肢としての「WASM(WebAssembly)」の可能性を探ります。 Jetpack JavaScript Engineを利用してWASMを隔離されたサンドボックス環境で実行することで、「脆弱性を完全にゼロにする」のではなく「脆弱性があってもアプリを脅威に晒さない」という、セキュアで現実的なアーキテクチャをいかに構築したのか。 そして、プロセス間通信(IPC)の壁や、巨大な画像データの受け渡し(Base64 vs バイト配列)など、WASM化によって直面したパフォーマンストラブルとその最適化戦略をお話しします。 ## アジェンダ 1. なぜAndroidでWASMなのか? * 画像コーデックにおけるJNIのセキュリティリスクと限界 * WASMという現実解 2. アーキテクチャ * Jetpack JavaScript Engineを活用したWASMサンドボックス * C言語ライブラリ(OpenJPEG)をWASMへコンパイルし、アプリに組み込む「仕組み」作り 3. 課題とパフォーマンス最適化 * WASM自体の実行速度と、JS Engineとのプロセス間通信(IPC)がもたらすボトルネック * 大量データ転送におけるシリアライズコスト ## セッションに含まないこと 1. JPEG2000画像フォーマットの詳細な仕様 2. C/C++, OpenJPEGのソースコードレベルの解説 3. Jetpack JavaScript Engineの内部実装の詳細 ## 参加者が持ち帰れる知見 * NIによるネイティブコード実行のリスクと、WASMを用いたサンドボックス化によるセキュリティ向上アプローチ * Jetpack JavaScript Engineを用いて、Androidアプリ内でWASMを実用的に動作させるための実装イメージ * 大容量データをWASM/JS Sandbox間でやり取りする際のパフォーマンス最適化
対象者
* AndroidアプリでC/C++などのネイティブコード(NDK/JNI)を扱っている、または扱う予定がある人 * サードパーティ製ライブラリのセキュリティや脆弱性リスクに課題を感じている人 * Android環境におけるWASM(WebAssembly)やJetpack JavaScript Engineの実用性に興味がある人