Facebook: BuckでAndroidビルドをスピードアップ

https://www.youtube.com/watch?v=GHTO2WKDO6I#t=15m5s

1 comment | 1 point | by WazanovaNews 約3年前 edited


Jshiike 約3年前 edited | ▲upvoteする | link

FacebookのDavid Reissが、オープンソースで提供しているAndroid & JavaビルドツールBuckを紹介しています。

1) 他の選択肢との比較

  • Googleが提供するビルドシステムANTは、遅いのとモジュールのサポートが弱いのがネック。
  • ベター版となったGRADLEは、ANTよりは早いが、モジュールのサポートという意味ではまだ不十分。また、Buckの開発に着手した当時はまだAndroid対応してなかった。
  • Mavenは、とにかく遅い。

2) Buckの性能アップ

  • Facebook Androidアプリは 65万+行あるが、Buckでの処理において、ここ1年でスピード10倍改善。
  • 細かいモジュールにも対応できるので、コンパイルの並列処理に活かせる。
  • Javaコードのモジュールのインターフェースを変更したか、実装を変更したか検知して、実装のみなら再コンパイルしない。
  • コンパイルの最後でdexファイルをマージするスピードが早い
  • デーモンとして実行できるので、バックグランドで実行している間に次のビルドの対応ができる。
  • 分散キャッシュを使った成果物の再利用ができる。

3) そもそも何が遅いのか?

  • ApkBuilder
    • アセット、dexファイル、ネイティブライブラリをAPKにまとめる。
    • 大きめのアプリだと7秒かかる。
  • インストール
    • 高速なUSBでも、ADBプロトコルは5〜6秒でマックスアウト。
    • PackageManagerがもろもろ活躍して、アプリのサイズによるが2-45秒かかる。実機の方が高速なエミュレータより時間がかかる。
  • dexファイルのメソッド参照64K上限にひっかかるとビルドできない
    • メソッド参照カウントは、例えばサードパーティのライブラリを参照すると大きく増える。push notificationを受取るのに、上限の半分近くはいってしまう。
    • ProGuardはサードパーティのライブラリの対応には有効だが、スピードが今ひとつ。
    • Android Developer Blogで紹介された、secondary dexと呼ばれる、内部ストレージやネットワーク経由でdexファイルを取り込んでビルドする手法もあまり便利ではない。

4) 対応策

  • dexを分割する手法を採用。更に、secondary dexファイルはAPKには含まずに、直接デバイスにインストールする仕組みとした。
    • ApkBuilderは、アセット、ネイティブコード、もしくは起動コードに変更がなければ必要ない。
    • インストールも、変更したファイルだけ。Javaのみの変更ならPackageManagerをスキップ。
    • ARTを使った際に効果が大きい。ARTが担う、インストール前の最適化プロセスをスキップできるので。

5) 成果

  • ビルド + インストールで4秒
  • 60%のケースで、APKのインストールをスキップできるようになった
  • もう少しサイズの小さいAntennaPod(コード3-4万行)で実験。変更された箇所だけをコンパイルするインクレメンタルビルド + インストールの時間が、Gradleで20秒かかっていたものが、Buckでは3.2秒に。

6) ネクストステップ

  • ネイティブライブラリや画像を修正した場合もAPKから外すことができれば、APKのサイズをもっと削減できる。
  • Exopackageをxmlのレイアウトにしたい。

7) Q & A

  • Buckの機能をGradleにポーティングしないのか?
    • どちら側が対応するのかはさておき、技術的には、マルチdexサポートと、何をインストールするか把握してくれるsmart installerの二つの機能が難易度が高い。
  • ネイティブライブラリのためのNDKサポートは?
    • Facebookはそれほどネイティブコードは手がけてないので、Buckにおいても対応は遅れている。しかし、やるとすれば、ネイティブファイルをAPKから外そうというアイデアは、おそらくdexファイルのケースよりも簡単にできるのではないかと思ってる。
  • テストツールとのインテグレーションは?
    • Androidのテストについては、単体テストとエミュレータなどを使った自動化がポイントになるが、Robolectricでの単体テストについて、Buckは、JUnitをビルドインサポートしていて、TestNGにもプルリクエストをだしているはず。エミュレーターによるテストについても、よく把握はしてないが、対応しているはず。Buckは、 Instrumentation Testing(?よく聞き取れず。。)はサポートしていない。

#facebook #android #buck #オープンソース


ワザノバTop200アクセスランキング


Back