検索
ニュース

Androidの開発へ「Rust」を導入、なぜなのかメモリ安全ではないバグを予防

GoogleはAndroidオープンソースプロジェクト(AOSP)が、「Android」の開発へ「Rust」導入を進めている。従来のようなC/C++とJavaを組み合わせた開発にはどのような問題があるのだろうか。

Share
Tweet
LINE
Hatena

 2021年4月6日(米国時間)、Googleは公式ブログでAndroidオープンソースプロジェクト(AOSP)がモバイルデバイス向けオープンソースOS「Android」の開発において、オープンソースのシステムプログラミング言語「Rust」の導入を進めていることを明らかにした。Googleは2021年2月に設立された独立非営利団体「Rust Foundation」にも加盟している。

 Androidはこれまで、「C」や「C++」といったシステムプログラミング言語を用いて開発されてきた。Android開発にRustを導入した目的は、メモリ安全性のバグを予防することにある。


メモリ安全性のバグを生み出す危険なコードとは 信頼できない入力を処理する(緑色)、安全性の低いC/C++で記述する(オレンジ色)、サンドボックスを使った分離を実行していない(青色)(出典:Google

 AOSPはこれまでもメモリ安全性のバグの検出や修正、軽減に注力してきたが、さらに予防を強化しようとしている。メモリ安全性を特徴とした言語の採用が、最も費用対効果の高い予防方法だとの認識から、Rustの導入に至った。

 Android開発に新しい言語を取り入れるのは大掛かりな取り組みであり、ツールチェーンや依存関係のメンテナンス、インフラやツールのアップデート、開発者のトレーニングが必要になる。

 AOSPは過去18カ月にわたってRust導入に取り組んできた。現在、幾つかの早期導入プロジェクトを進めており、数カ月後に成果を発表する計画だ。この取り組みを発展させ、Android開発にRustを本格的に活用するのは、数年がかりのプロジェクトになるとしている。

 GoogleはRustを導入した背景としてメモリ安全性バグの脅威が最大であることや、これまでのシステム開発言語では開発者にメモリのライフサイクルが任されていること、サンドボックス化ではメモリ安全性バグを除去できないことを挙げている。

厄介なメモリ安全性のバグ問題

 CやC++プログラムのメモリ安全性のバグは以前から、最も対処が困難な動作異常の原因だった。AOSPはメモリ安全性を原因とするバグの検出や修正、軽減に多大な労力やリソースを注ぎ、Androidへのバグの混入を数多く防いできた。それでも、メモリ安全性のバグは、システムの安定性を損なう最大の原因であり続けており、Androidにおける深刻度の高いセキュリティ脆弱(ぜいじゃく)性の最大70%を占めている。

システムプログラミング言語とRustの特徴

 Androidアプリケーションの開発では、「Java」や「Kotlin」のようなメモリ安全性を備えたマネージド言語が最適な選択肢となっている。これらの言語は使いやすさやポータビリティー、安全性を考慮して設計されており、Androidランタイム(ART)が開発者に代わってメモリを管理するからだ。

 OSとしてのAndroidはJavaを幅広く利用し、Androidプラットフォームの大部分をメモリバグから効果的に保護している。だが、JavaとKotlinは、Android自体の低レベルな開発には適さない。


アプリケーション開発に適したJavaと低レベル開発に適したC/C++の関係(出典:Google

 OSの低レベルの開発には、C、C++といったシステムプログラミング言語が必要になる。これらの言語は、低レベルのシステムリソースとハードウェアへのアクセスを可能にする。加えてリソース消費が少なく、パフォーマンスも予測しやすい。ただし、CとC++には課題もある。開発者自身がメモリのライフサイクルを管理しなければならないということだ。しかも管理は容易ではなく、ミスも発生しやすい。複雑なマルチスレッドのコードでは特にそうだ。

 Rustは、コンパイル時のチェックによるオブジェクトライフサイクル/所有権の強制や、ランタイムチェックによるメモリアクセスの有効性の確保を通じて、メモリ安全性を保証する。さらに、CやC++と同等のパフォーマンスも実現する。

サンドボックス化の限界

 CやC++では、Rustのような安全性を保証できないため、「強い分離」を必要とする。Androidの開発においては次のような制限がある。

Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る