巨大な aar を分割し、ビルド時に復元する


こんなときに

  • Android アプリ開発で、aar 形式で提供されるライブラリーを使用しているが、aar ファイルが巨大すぎてそのまま commit & push すると GitHub に怒られるとき

どうする

  • aar ファイルを分割した状態で Git にコミットし、gradle でアプリをビルドする時に自動的に元の aar ファイルが復元される様にする

くわしく

普通に aar ファイルをライブラリーとしてインポートすると、build.gradle ファイルは以下の様になってるはずです。

configurations.maybeCreate("default")
artifacts.add("default", file('foo.aar'))

これを、以下の様に変更します。(ファイル名 foo.aar は適宜調整のこと)

plugins {
    id "base"
}

task archiveAar(type: Zip) {
    group = "Build"
    description = "Creates the aar archive."
    archiveFileName = "foo.aar"
    destinationDirectory = project.projectDir
    inputs.files {
        fileTree(".") {
            include "foo.aar.*"
        }
    }
    inputs.files.each {
        from zipTree(it)
    }
}

configurations.maybeCreate("default")
artifacts.add("default", archiveAar.archiveFile)

さらに、aar ファイルを一旦 unzip し、出てきたファイル群を適当な複数の部分集合に分割したあと、それぞれを zip ファイルとして圧縮し直します。
圧縮後のファイル名は include "foo.aar.*" のところにマッチする様に foo.aar.1, foo.aar.2, ... とかそんな感じにしておきます。
元の aar ファイル内のディレクトリー構成が新しい zip ファイル内でも保たれる様に気を付けてください。
最後に、分割後のファイルと build.gradle を Git にコミットして完了です。(GitHub に push した時に怒られない様にするには、分割 zip 後の各ファイルが 50 MB 未満となる様にすべきです。)

あとは普通にアプリをビルドすれば OK です。
(初回ビルド時のみ、まだ aar ファイルが復元されてないためにビルドが失敗することがあります。その場合は先に gradle archiveAar を単体で実行すると aar ファイルが生成されます)


筆者環境は Gradle バージョン 6.3 です。他のバージョンの Gradle では結果が異なる可能性があります。