Androidのライセンス表示について(license-tools-plugin)

# はじめに
Androidアプリにオープンソースライセンスを表示させる機会があったため、初めてクックパッドさんの`license-tools-plugin`を使用しました。
今後も使用する機会があるかと思い、導入方法をまとめました。

# license-tools-pluginとは
[クックパッドさんが公開](https://github.com/cookpad/LicenseToolsPlugin)しているプラグインで、以下の機能が提供されています。
 - yamlを使ったオープンソースライセンスの管理
 - ライセンス追記漏れのチェック
 - ライセンス一覧のhtmlの作成

# 開発環境
PC：MacBook Pro
OS：macOS BigSur
Android Studio：Arctic Fox 2020.3.1

# license-tools-pluginの導入方法
※今回はAndroid開発でよく使われるライブラリをいくつか追加し、`出力したhtmlファイルをwebViewに表示させる方法`について記載いたします。

## 1.プラグインを追加
build.gradle(project)に以下のコード上の①〜③を追記します。

追加②に関しては、最新のバージョンを[こちら](https://github.com/cookpad/LicenseToolsPlugin/blob/master/plugin/build.gradle)から確認して置き換えてください。


```kotlin:build.gradle(project)
buildscript {
    repositories {
        google()
        mavenCentral()
        
        //追加①　ここから
        maven {
            url 'https://plugins.gradle.org/m2/'
        }
        //ここまで
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:4.2.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.30"

        classpath 'gradle.plugin.com.cookpad.android.plugin:plugin:1.2.8'  //追加②
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

apply plugin: "com.cookpad.android.plugin.license-tools" //追加③
```

build.gradleへの記述が終わったら、画面上部にある`Sync Now`を押して同期します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1819683/e0e6a825-6c7b-5a71-6237-6b6908d529b8.png)

## 2.ymlファイルを作成
Android StudioのTerminalに以下のコマンドを入力し、yamlファイルを作成します。
`./gradlew updateLicenses`

実行が完了すると、app直下に`licenses.yml`というyamlファイルが追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1819683/8551f94f-9e8a-496b-f403-3ca28a73d184.png)

`licenses.yml`の内容は以下のようになっています。(一部を抜粋)

```kotlin:licenses.yml
- artifact: androidx.activity:activity:+
  name: activity
  copyrightHolder: #COPYRIGHT_HOLDER#
  license: The Apache Software License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: https://developer.android.com/jetpack/androidx/releases/activity#1.2.4
- artifact: androidx.annotation:annotation-experimental:+
  name: annotation-experimental
  copyrightHolder: #COPYRIGHT_HOLDER#
  license: The Apache Software License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: https://developer.android.com/jetpack/androidx/releases/annotation#1.1.0
- artifact: androidx.annotation:annotation:+
  name: annotation
  copyrightHolder: #COPYRIGHT_HOLDER#
  license: #LICENSE#
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: https://developer.android.com/jetpack/androidx/releases/annotation#1.2.0
- artifact: androidx.appcompat:appcompat-resources:+
  name: appcompat-resources
  copyrightHolder: #COPYRIGHT_HOLDER#
  license: #LICENSE#
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: https://developer.android.com/jetpack/androidx/releases/appcompat#1.3.1


// ライブラリの数によってはかなり長くなります
```
ここから少し面倒ですが、`#COPYRIGHT_HOLDER#`や`#LICENSE#`となっている箇所を調べて手動で編集します。
yamlファイル内の`artifact`や`licenseUrl`を1つ1つ検索し、GitHubなどから情報を得ることができます。
（Androidの標準ライブラリは、`The Android Open Source Project`と記載します。）

今回の場合ですと、以下のように編集します。

```kotlin:licenses.yml
- artifact: androidx.activity:activity:+
  name: activity
  copyrightHolder: The Android Open Source Project
  license: The Apache Software License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: https://developer.android.com/jetpack/androidx/releases/activity#1.2.4
- artifact: androidx.annotation:annotation-experimental:+
  name: annotation-experimental
  copyrightHolder: The Android Open Source Project
  license: The Apache Software License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: https://developer.android.com/jetpack/androidx/releases/annotation#1.1.0
- artifact: androidx.annotation:annotation:+
  name: annotation
  copyrightHolder: The Android Open Source Project
  license: The Apache Software License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: https://developer.android.com/jetpack/androidx/releases/annotation#1.2.0
- artifact: androidx.appcompat:appcompat-resources:+
  name: appcompat-resources
  copyrightHolder: The Android Open Source Project
  license: The Apache Software License, Version 2.0
  licenseUrl: http://www.apache.org/licenses/LICENSE-2.0.txt
  url: https://developer.android.com/jetpack/androidx/releases/appcompat#1.3.1


// ライブラリの数によってはかなり長くなります
```

全て編集が完了したら、Android StudioのTerminalに以下のコマンドを入力し、yamlファイルの確認をします。
`./gradlew checkLicenses`

エラーが発生しなければ問題なくyamlファイルが作成されています！

## 3.ライセンス一覧を作成
Android StudioのTerminalに以下のコマンドを入力し、htmlファイルを作成します。
`./gradlew generateLicensePage`

実行が完了すると、app直下に`licenses.html`というhtmlファイルが追加されます。
![名称未設定html.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1819683/2f2a9634-b48e-5f49-2212-287a25b08fe1.png)

## 4.ライセンスをアプリに表示
Assetsフォルダを作成し、先ほど追加された`licenses.html`を格納します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1819683/3deb4af4-0c90-8542-c61e-90e5b78d14bc.png)

htmlファイルをWebViewで表示するために、`activity_main.xml`にWebViewを追加します。

```kotlin:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <WebView
        android:id="@+id/web_view"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_margin="16dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

    </WebView>

</androidx.constraintlayout.widget.ConstraintLayout>
```

`MainActivity.kt`には、WebViewにassetsフォルダ内のhtmlファイルを表示するよう記載します。

```kotlin:MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val webView = findViewById<WebView>(R.id.web_view)
        webView.loadUrl("file:///android_asset/licenses.html")
    }
}
```

ここまでできたらアプリを実行してみましょう！
WebView内にオープンソースライセンスを表示することができました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1819683/b2257429-a682-6b6c-a152-059b2d189a40.png)

このままでもいいですが、URLが長いと横スクロールで見ることになり少し見づらい問題がありました。
修正したい場合は、htmlファイルに以下を追加します。
すると、横幅に合わせて改行されるめ、横スクロールをなくすことができます。

    a {
    overflow-wrap: break-word;
    }

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1819683/2da4ccc2-bc39-003f-e72a-684fd8e98ac8.png)


# その他
アプリを作成する上で、ライブラリを追加した際は`./gradlew checkLicenses`コマンドを実行することで差分が取れます。
差分をコピーし、現在の `licenses.yml`ファイルにペーストします。
以降は初回時と同様に`#COPYRIGHT_HOLDER#`や`#LICENSE#`を編集し、再度コマンドを実行しエラーが無いかを確認します。
htmlファイルも再度`./gradlew generateLicensePage`コマンドで作成すれば、オープンソースライセンスを更新できます。

# 参考文献
* GitHub: https://github.com/cookpad/LicenseToolsPlugin
* クックパッド開発者ブログ: https://techlife.cookpad.com/entry/2016/04/28/183000