【Android】依存しているライブラリの一覧画面を作りたい

Androidアプリで依存しているライブラリの一覧をリスト化し、アプリ内から閲覧可能な画面を作る方法を紹介します。

ライブラリ一覧画面を作りたい

多くのOSSは利用ライセンスの中でそのライブラリを使っていることの掲示を求めます。Androidの場合、Google Play Services OSS License Pluginを使うとgradleの依存関係を解決してライセンス一覧を表示するActivityのコードを生成してくれます。

developers.google.com

しかし、このPluginも現時点(2024年9月末)で2年以上更新が無い状態のままであること、生成される画面がActivityで固定なのでアプリのデザインなどの要件に合わせにくく使い勝手が悪いです。この問題を手軽に解消する方法を紹介します。

Gradle License Reportを使う

Gradle License Reportは利用しているOSSライセンスをリストアップし、レポートファイルを生成するgradle pluginです。

github.com

以下の特徴を持ちます。

  • 許されたライセンスタイプ以外の依存関係を発見するとエラーを報告する
    • いわゆる「ライセンス感染」と言った事故を防げそうです
  • いくつかのフォーマットでレポートファイルを生成する
    • htmlをそのまま表示するもよし、xmlやcsvにしてアプリ内でパーすして表示するもよし
  • gradle以外の依存ライセンスを追記できる
    • 画像や音声などgradle以外で解決する依存関係をxmlで記述すると、その依存関係をロードしてくれます

以下簡単な使い方です。

依存関係を追加する

依存関係を追記します。バージョンは適宜最新の物に差し替えてください。

  • libs.versions.toml
[plugins]
jk1-licenseReport = { id = "com.github.jk1.dependency-license-report", version = "2.8" }
  • app/build.gradle.kts
plugins {
    alias(libs.plugins.jk1.licenseReport)
}

android {
    sourceSets {
        named("main") {
            val generateTask = tasks.named("generateLicenseReport", ReportTask::class)
            // assets にレポートファイルを追加する
            assets.srcDirs(listOf(generateTask.get().outputFolder))
        }
    }
}

// ライセンスレポートの出力設定
licenseReport {
    renderers = arrayOf(SimpleHtmlReportRenderer("licenses.html"))
    importers = arrayOf(
        // 追加でロードしたいライセンス情報ファイル
        XmlReportImporter("voicebox importer" ,project.file("licenses/voicebox.xml")),
        XmlReportImporter("sounds importer" ,project.file("licenses/sounds.xml")),
    )
}

許可されたライセンスを設定する

特定のライセンスが設定されたライブラリのみ組み込むことを許可するよう、以下の設定を追加します。

  • app/config/allowed-licens.json
{
  "allowedLicenses": [
    {
      "moduleLicense": "The Apache Software License, Version 2.0"
    },
    {
      "moduleLicense": "Apache-2.0"
    },
    {
      "moduleLicense": "Apache 2.0"
    },
    {
      "moduleLicense": "Apache License, Version 2.0"
    },
    {
      "moduleLicense": "BSD-3-Clause"
    },
    {
      "moduleLicense": "Android Software Development Kit License"
    },
    {
      "moduleLicense": "MIT License"
    },
    {
      "moduleLicense": "Voicebox"
    }
  ]
}

追加するライセンスがある場合、以下のXMLを用意します。

  • app/license/voicebox.xml
<chapter title="Libraries" id="Libs">
    <table>
        <tr>
            <td>Project</td>
            <td>Version</td>
            <td>License</td>
        </tr>
        <tr>
            <td>Voicebox ずんだもん</td>
            <td>0.19.2</td>
            <td>Voicebox</td>
        </tr>
        <tr>
            <td>Voicebox 四国めたん</td>
            <td>0.19.2</td>
            <td>Voicebox</td>
        </tr>
    </table>
</chapter>

ライセンス画面をアプリに組み込む

レポートファイルはassetsとしてアプリ内から参照可能です。例えば、WebViewを使って表示する場合、次のコードとなります。

AndroidView(
  modifier = Modifier.fillMaxSize().padding(paddingValues),
  factory = { context ->
    WebView(context).apply { loadUrl("file:///android_asset/licenses.html") }
  },
)

まとめ

Gradle License ReportによるOSSリストアップ画面の作り方を紹介しました。