【gradle】ローカルな場所に配置したライブラリの依存関係を検証する

こんにちは、 id:numanuma08 です。gradleのプロジェクトは依存しているライブラリの検証をする仕組みとして、Verifyting dependenciesという仕組みが提供されています。

docs.gradle.org

設定次第ですが、Maven Repositoryで管理されているライブラリのSHA256ハッシュや署名を検証しビルド時に組み込んだライブラリが正しい物かチェックできます。

一方、私が調べた限りローカルファイルに展開したライブラリのバイナリ(.jarとか.aarとか)について検証する手段が無さそうでした。ちょっとしたカスタムスクリプトを書いて、ローカルファイルに展開したライブラリの検証をビルド時に行う方法を紹介します。

SHA256ハッシュを検証する

以下のビルドタスクの定義をbuild.gradle.ktsに記述します。

val verifyChecksumTask by tasks.register("verifyChecksumTask") {
    val aarFile = file("/path/to/mylibrary-debug.aar") // ライブラリのパス
    val sha256 = "XXX" // 事前に計算したライブラリのsha-256。gradle.propertiesとかに記述でも良いかも

    doLast {
        // SHA256の計算
        val sha256Digest = MessageDigest.getInstance("SHA-256")
        aarFile.inputStream().use { input ->
            val buffer = ByteArray(8192)
            var bytesRead = input.read(buffer)
            while (bytesRead != -1) {
                sha256Digest.update(buffer, 0, bytesRead)
                bytesRead = input.read(buffer)
            }
        }
        val checksum = sha256Digest.digest().joinToString("") { "%02x".format(it) }
        // 配布されたSHA256と計算したSHA256チェックサムが一致するかチェック
        check(checksum == sha256) { "SHA-256 is invalidated" }
    }
}

// ビルド時に検証処理を実施して、常にチェックサムが一致することを検証
tasks.preBuild {
    dependsOn(verifyChecksumTask)
}

このビルドスクリプトで、ビルド時にチェックサムの検証が可能です。