見出し画像

さらば、全てのサポートライブラリ。: Jetifierの無効化


REALITYではようやくJetifierを無効化することができたので、今回はその取り組みについて話したいと思います。

Jetifierとは

Jetifierはライブラリ内に存在するサポートライブラリ(android.support.*)への依存を、対応するAndroidXのパッケージ(androidx.*)に自動的に書き換えてくれるツールです。

典型的にはAndroidXへの移行時に gradle.properties に次のような記述を書いて利用することが多いと思います。

android.enableJetifier=true


一見すると便利に見えるJetifierですが、一方でビルドパイプラインを複雑にし、変換作業のためにビルド時間が増えてしまう、という隠れた問題があります。

The downside: this is an extra build step in an already complex build pipeline. “Jetifiying” large dependencies can take a fair bit of time - perhaps a couple of seconds per binary. 

https://adambennett.dev/2020/08/disabling-jetifier/

ビルド時間は開発の生産性に大きく関わる問題で、それは開発メンバーが増えつつあるREALITYのAndroidチームにおいても例外ではありませんでした。

検証と対応

まず、アプリ内のライブラリのうち、どれがAndroidXに対応していないか調べる必要があります。
これは Can I drop Jetifier? で簡単に確認できます。

./gradlew -Pandroid.enableJetifier=false canIDropJetifier

これを実行した結果、REALITYではいくつかのライブラリでAndroidX対応していないことがわかりました。

パターンとしては次の4つでした。

1. 最新バージョンでAndroidXに対応済み

一番簡単なパターンです。最新バージョンにアップデートして対応しました。

2. 試験的なバージョンではAndroidXに対応しているが、安定版としてはリリースされていない

安定版がリリースされるまで待つことにしました。
Jetifierを利用し続けること自体が何か問題を引き起こしているわけではなかったからです。

結果としては数ヶ月後に安定版が公開されて対応できました。

3. ライブラリの内部で依存しているライブラリがAndroidXに対応していない

最新バージョンではAndroidXに対応していることがわかったので、
強制的にバージョンを指定することで解決しました。

resolutionStrategy {
   force 'com.library.foo:bar:x.y.z'
}

(これは予期しない動作を生む可能性があるので、一概にこうすべきではないと思います。)

4. メンテナンスされていない。AndroidXに対応していない

一番難しいパターンです。メンテナンスされていないライブラリを使い続けるのか?という別の問題もありますが、それを置いておくとすると自前で対応するほかありません。OSSであればAndroidXに対応したフォークを探すのも一つの手だと思います。REALITYでは前者が1件、後者が1件という感じで対応しました。

結果

無事にJetifierを外すことができたのでビルド時間を計測してみました。
気になる結果ですが・・・


ビルド時間は特に変わりませんでした。

そんなはずは・・・と思い、様々な計測をしてみましたが、効果は無さそうでした。

これにはいくつか原因が考えられます:

- Jetifier外しを段階的に行ってしまった。ゆえに外す前と外した後のコードにはそれなりにJetifierに関係ない差分があり、適切な比較ができなかった。
- 「REALITYのビルド時間」においては、Jetifierは支配的ではなかった。(こういう話もあるようです)
- ビルド時間としては、AGP 4.1.0-alpha01で修正されたバグの影響が大きかった。それが修正された今は効果がなくなった。

などなど、理由を考え出すとキリがないですが、とにかく結論としては、変わらなかった、ということです。

勿論、ビルドパイプラインからJetifierが無くなり、シンプルになったことは間違いないですが、本当にビルド時間を短縮したいのであれば、やはり場当たり的に改善策に取り組むのではなく、計測に基づいてボトルネックを一つ一つ愚直に潰していくべきでしょう。

そしてもうひとつ得られた知見は、ライブラリの採用は依存を増やすということでした。REALITYは流行りのライブラリをフル活用して開発するというよりは、本当に必要な(安定した)ものだけを導入する思想で開発をしています。これが前者のような思想で開発していたら、今回の場合、作業量は増えていたし、場合によってはうまくいかなかったとも思っています。

ところで

REALITYではJetifierが無効化された世界でコードを書きたい、もしくはビルドの高速化に興味があるエンジニアを募集しています。ご気軽にご応募ください。よろしくお願いします。