🙆

Jetpack ComposeでAboutLibrariesを使用する

に公開

最近、XMLからJetpack Composeを使ってアプリのUIをリニューアルする取り組みを行っているんですが、その際にライセンス画面をAboutLibrariesというライブラリを使ってリニューアルしました。
今回は、AboutLibrariesについて実際に導入する時に躓いた部分やどうやって使うかについてまとめていきます。

ライブラリ選定

もともと、クックパッドさんのLicenseToolsPluginというライブラリを使ってライセンス画面を実装していたのですが、すでにメンテナンスが終了しており、他のライブラリに移行する必要がありました。
https://github.com/cookpad/LicenseToolsPlugin

Jetpack Composeでリニューアルするにあたって、どのライブラリで実装するかを決めるためにいくつか調査をしました。
その結果が以下のような感じです。

この中でAboutLibrariesが一番良さそうだと感じた理由としては、UIの自由度が高そうだったからです。
Composeのコンポーネントを使用できるので、こちらが実現したいUIを完全に再現できそうでした。

// こんな感じで使える
 val libraries by produceLibraries(R.raw.aboutlibraries)
 LibrariesContainer(
   libraries = libraries,
   modifier = Modifier.fillMaxSize()
 )
 
 // もっとカスタマイズする場合
 LibrariesContainer(
     libraries = libraries,
     modifier = Modifier.fillMaxSize().padding(it),
     header = {
         item {
             Box(modifier = Modifier.fillMaxWidth().padding(16.dp), contentAlignment = Alignment.Center) {
                 Text("Hello Header")
             }
         }
     },
     divider = { HorizontalDivider() },
     footer = {
         item {
             Box(modifier = Modifier.fillMaxWidth().padding(16.dp), contentAlignment = Alignment.Center) {
                 Text("Hello Footer")
             }
         }
     }
 )

スター数もメンテナンスも継続的に行われていそうだったので、AboutLibrariesを使うことに決まりました。

自動でライセンス情報を取得できなかった場合

AboutLibrariesを使うと、ほぼ全てのライブラリのライセンス情報を取得して表示してくれたのですが、いくつかのライブラリのライセンス情報を取得できないケースがありました。
例えば、firebase-analyticsplay-services-ads-identifierなどです。
これらのライセンス情報を表示するためには、まずbuild.gradle.ktsに以下を追加する必要があります。

aboutLibraries {
    // カスタムライセンスファイルの設定
    collect {
        configPath = file("../aboutLibraries")
    }
}

その後、aboutLibrariesというディレクトリを作成し、内部にlicensesというディレクトリを作成。
その中に以下のようにASDKLのライセンス情報を追加すると、firebase-analyticsplay-services-ads-identifierにライセンス情報を追加でき、内容を表示することができるようになります。

{
  "content": "This is the Android Software Development Kit License Agreement\n\n1. ......",
  "hash": "ASDKL",
  "url": "https://developer.android.com/studio/terms.html",
  "name": "Android Software Development Kit License Agreement"
}

また、プロジェクトによっては、自作ライブラリを使用しているケースもあると思います。
その場合は、aboutLibrarieslibrariesというディレクトリを追加し、そこで以下のようにライブラリ情報を追加することで対応することができます。

{
  "uniqueId": "com.example.library",
  "artifactVersion": "xxxxxxxxx",
  "developers": [
    {
      "name": "Google Inc"
    },
    {
      "name": "example"
    }
  ],
  "description": "example",
  "name": "com.example.library",
  "licenses": [
    "Apache-2.0"
  ]
}

現在のライセンス定義情報を出力

現在のライセンス定義情報を出力する際は、まずbuild.gradle.ktsに定義情報を出力するパスを定義します。

aboutLibraries {
    // 現在のライセンス定義情報を出力
    export {
        outputFile = file("../aboutLibraries/aboutLibraries.json")
    }
}

その上で、./gradlew :app:exportLibraryDefinitionsを実行すると、build.gradle.ktsで定義したaboutLibraries.jsonというファイルが出力されます。
これを活用して、新しくライブラリを追加した際でも、GitHub Actionsでライセンス情報を取得できていないライブラリがないかどうかをチェックすることができます。

まとめ

はじめて、AboutLibrariesというライブラリを使ってみましたが、Jetpack Composeと相性が良く、UIの自由度も高いので中々良かったです。
もし、他のライブラリの方が良いぞ!という話があれば、ぜひ教えてください!

Discussion