ビルドの合間にQuakeを少しだけ詰め込む?もう無理:FacebookがJavaコンパイルツールを強化

Table of Contents

ビルドの合間にQuakeを少しだけ詰め込む?もう無理:FacebookがJavaコンパイルツールを強化

Facebook のシニア ソフトウェア エンジニアである Jonathan Keljo 氏は、ソーシャル ネットワークのスピードに対するニーズを挙げ、同社の開発者ツール グループが、オープンソース ビルド ツールである Buck が Java コードをコンパイルする方法を再検討し、さらに高速化したと述べています。

そのため、プログラマーが取得して操作できるように、ソフトウェアの新しいバージョンが本日リリースされました。これは、source_only ABI 生成モードです。

2012 年に開発され、2013 年にオープンソース化された Buck は、Android のビルド時間を短縮するために作成され、その後 iOS でも動作するように適応されました。

「当時Androidで利用できるツールは、私たちの作業を遅らせていました」とケルジョ氏はThe Register紙との電話インタビューで語った。「そこで、その問題を解決するためにBuckが開発されました。」

コードのコンパイルには時間がかかることがあり、 The Registerに提供されたブログ記事の下書きの中で Keljo 氏が遅いビルド サイクルを「疲れ果てて魂を殺すようなフラストレーションの泉」に例えるほど時間がかかることもあります。

Javaコンパイラを待つために何時間も無駄に過ごすことになるのかと問われると、ケルジョ氏は、時間の節約は数秒単位だと答えた。「もしビルドが数時間単位だったら、激しい非難を浴びるだろう」と彼は言い、ビルド時間は編集・実行・コンパイルのサイクルを中断させると指摘した。

ウェブ開発者は、オンライン訪問者が退屈して離れていくのを恐れて、ページの読み込み時間を数秒短縮するようにサイトを調整していることを考えると、Facebook の高速化への熱狂はおそらくもっと理解しやすいだろう。

Facebook は長年最適化に注力してきたため、その短縮はほんの数秒にすぎないかもしれないが、Java にあまり精通していないユーザーであれば、数分、あるいは数時間を取り戻せるかもしれない。

翻訳済み

Android アプリ チームや Java プログラムを作成する他のチームがソース コードが JAR ファイルに変換されるのを待たなくて済むように、Keljo 氏と同僚は最近 Buck の動作方法にいくつかの変更を加えました。

FacebookのAndroidアプリはサイズが大きくなりすぎたため、何らかの変更が必要になりました。そこで開発ツールチームは、BuckのExopackage機能を修正しました。これにより、コード変更のたびにアプリを完全にリロードする必要がなくなりました。

Exopackage は最小限の Java コードでアプリ ファイル (.apk) を作成し、残りのコードを別の .dex ファイルに格納します。そのため、変更を加えた後にのみ、Android アプリが実行されているモバイル デバイスに移動できます。

Exopackage の最新の改良点には、Android のリソースとアセットのサイドローディングのサポートが含まれます。これにより、以前のバイナリと同様に、Exopackage は画像などを変更された場合にのみ転送できるようになりました。

「Buck は、アプリを小さなモジュールに分割し、それらの関連性を Buck に説明することを推奨しています」と Keljo 氏は語ります。

Buckは、開発者が提供するビルドルールを通じてビルドを最適化し、コンパイルに関するよりスマートな判断を可能にします。また、より効率的なコード処理のために、JARファイルの簡略化されたバージョンであるスタブJARを使用します。

このプロセスは、モジュール内の Java クラスを評価し、変更されたクラスに依存するモジュールのみを再コンパイルする Java クラス使用状況追跡の追加によって改善されました。

ケルジョ氏によると、この変更によりビルドルールが35%削減されたという。この変更にかかる時間については具体的な数値は示さなかったが、「ビルドをしなくても済むのが最速のビルドだ」と付け加えた。

Buck は、制限された形式の並列処理を通じて Java ビルド パイプラインも改善します。

依存関係

コンパイルプロセスの一部は逐次的に実行する必要がありますが、Buckは依存関係ルールを通じて十分な情報を取得し、依存関係のないルールを特定します。そして、他のルールの処理と同時に、それらのルールをJARファイルにビルドすることができます。

「Javaコンパイラは、処理の途中で、スタブJARを作成するために必要な情報をすべて取得していることが判明しました」とケルジョ氏は述べた。「ルールは相互に依存しているため並列化できないように見えますが、実際には並列化しています。」

JavaOne '17 でのジョルジュ・サーブ

オラクル副社長:「次の10年はJava第一、Java常勝を目指します」

続きを読む

最後に、Buck は、パッケージ名は通常小文字であり、クラス名は大文字で始まるなどの規則に基づいて、情報に基づいた推測を通じてさらなる最適化を組み込みます。

以前は、ルールを JAR ファイルに組み込む前に、ビルド ツールはスタブ JAR ファイルで依存関係をチェックし、次にそれらの依存関係をまとめたスタブ JAR をチェックして、接続されたコードの完全なグラフが作成されるまでチェックしていました。

しかし、モジュールの Java インターフェースはモジュールのソースから推測できることが多いため、これらのグラフ接続の多くは不要です。

「ルールを構築する前に依存関係を構築する必要がなければ、簡単に削減できるということに私たちは気づいたのです」とケルジョ氏は語った。

Facebook の Android 向け Instagram アプリがこれらの改善を使用して構築されたところ、ビルド時間が 30 パーセント短縮されました。

そして今、Android アプリのすべての開発者は、Buck によって奪われた瞬間を味わうことができます。®

Discover More