Androdプロジェクトの依存関係のダウンロードを最適化する
最新のAndroidアプリ開発の手法を取り入れたサンプルプロジェクトである「Now in Android」のリポジトリを眺めていると、こんなPull Requestがありました。
https://github.com/android/nowinandroid/pull/1051
変更内容は、build.gradle.ktsやsettings.gradle.ktsのrepositoriesブロックの指定を
repositories {
google()
mavenCentral()
...
}
から
repositories {
google {
content {
includeGroupByRegex("com\\.android.*")
includeGroupByRegex("com\\.google.*")
includeGroupByRegex("androidx.*")
}
}
mavenCentral()
...
}
に変更しています。
この変更によってなぜビルドのパフォーマンスが向上するのでしょうか?ちょっと深堀りしてきましょう。
まず、repositoriesブロックでは依存関係をどのリポジトリから取得するかを指定しています。
google()はGoogleがホストしているリポジトリ(https://maven.google.com/web/index.html)、mavenCentral()はMaven Centralという代表的なリポジトリです(https://mvnrepository.com/repos/central)。
例えばJetpackライブラリはGoogleのリポジトリでホストされていて、多くのサードパーティライブラリはMaven Centralでホストされています。
Gradleは宣言された順序でリポジトリを検索していくため、上の例だとまずGoogleのリポジトリを見て、存在しなかったらMaven Centralを見るという順で行われます。
そのため、サードパーティライブラリをたくさん入れている場合は、Googleのリポジトリへの無駄な検索が発生するということになります。
そこでincludeGroupByRegexによって検索しに行くgroupを限定することにより、無駄な検索を減らしているということですね。
最近のAndroid Studioで新規プロジェクトを作成すると最初からこの絞り込みを行うようになっているため、既存プロジェクトも対応すると良さそうです。