[Android] Kotlin製ライブラリを公開してみた

長らくiOSアプリを開発していましたが、新規アプリ開発のタイミングでAndroidアプリ開発の門を叩き早くも3ヶ月がたちます。

Androidアプリエンジニアとしてのプレゼンスを高めるために、何かOSS開発してみようと思い立ちました。
これまでiOSアプリ開発のためのライブラリもいくつか公開してきましたが、アプリを開発するのとは違う作業がいくつも必要になり思いの外手間がかかってしまいます。

本記事ではAndroidアプリ向けのライブラリを公開する流れをiOSアプリ開発者視点で紹介します。

# 3行まとめ
- Androidにおけるライブラリとは
- ライブラリ公開までのステップ
- 公開したライブラリのインストール方法

# 環境
- Android Studio 3.0.1
- Kotlin 1.2.0-release-Studio3.0-1

# Androidにおけるライブラリ

iOSアプリ開発のライブラリはCarthageなどを使ってライブラリをインストールすることが一般的になっていますが、Androidアプリではどのようになっているのでしょうか。
公開する側と利用する側から説明します。

## 公開する側
ライブラリのAARをMavenリポジトリに含めて配布する

## 利用する側
build.gradleにAARをインストールする設定を書いてビルドする

|用語|解説|
|:--|:--|
|AAR|・ **A**ndroid **AR**chiveの略<br />・ Androidライブラリのソースコードと画像やXMLなどのリソースをまとめて管理<br />・ 実態は特定のディレクトリ構造をzipしたもの|
|Maven|Javaプログラムをビルドするためのツール|
|build.gradle|ビルドシステムであるGradleの設定ファイル|

文章にすると一言になってしまいましたが、具体的な作業についてさらに説明していきます。

# ライブラリ公開までのステップ
1. プロジェクト作成
2. ライブラリモジュールを追加
3. ライブラリ本体のコードを書く
4. build.gradleを編集
5. AARをビルド
6. Mavenリポジトリを作成
7. GitHubに公開

## プロジェクトを作成

まずはAndroidアプリのプロジェクトを作成します。
Activityの種類を選択する画面では、何を選択してもよいのですが、Empty Activityを選択しておくとライブラリの動作確認に役立つでしょう。
<img src="https://qiita-image-store.s3.amazonaws.com/0/11454/5b806d03-7161-2313-c8f0-36e589a0fdc0.png" width="600px" />

## ライブラリモジュールを追加

下記の流れでライブラリモジュールを追加します
File → New → New Module → Android Library


<img src="https://qiita-image-store.s3.amazonaws.com/0/11454/3213da41-b898-9c51-c7f4-8dc702bfe2ce.png" width="500px" />


<img src="https://qiita-image-store.s3.amazonaws.com/0/11454/ca2b179c-570d-724e-51f7-a37e73babc31.png" width="600px" />

## コードを書く

ここでライブラリ本体のコードを書いていきましょう。
今回は、文字列がemailかどうかを判別する簡単なクラスを一つ作成しました。
ライブラリのコードをデバッグするにあたって、プロジェクト作成時に作ったEmptyActivityのAndroidアプリ上で動かしてみるのが良いと思います。

## build.gradleを編集

ライブラリのコードができあがったら、build.gradleを変更します。

### app/build.gradle

アプリモジュールをライブラリモジュールに変換するように設定を変更します。
またライブラリモジュールは`applicationId`を持つことができないので、設定を削除します。

```gradle
// apply plugin: 'com.android.application'
apply plugin: 'com.android.library'                  // 1行目を変更
// applicationId "com.worlddowntown.emailvalidator"  // 消す
```

この設定変更によって、プロジェクトを実機やシミュレータにビルドすることができなくなります。
再びライブラリのデバッグをする際は設定を元に戻しましょう。

### library/build.gradle

AARを含むMavenリポジトリを生成するGradleスクリプトを追記します。
ここでライブラリのバージョンなどを指定します。
これらはGradleスクリプトを実行するとpomと呼ばれるMavenの設定ファイルに記述されます。

```gradle
def repo = new File(rootDir, "repository")

apply plugin: "maven"

uploadArchives {
    repositories {
        mavenDeployer {
            repository url: "file://${repo.absolutePath}"
            pom.version = '1.0.0'
            pom.groupId = 'com.worlddowntown.emailvalidator'
            pom.artifactId = 'emailvalidator'
        }
    }
}
```

## AARをビルド

`gradlew` コマンドを実行して、AARを作成して見ましょう。
`gradlew` コマンドは、Androidプロジェクトで利用可能なすべてのビルドタスクを実行するためのコマンドです。
引数に `assembleRelease` を付けることでリリースビルドができます。
コマンド実行後、下記のような .aar ファイルが作成されます。

```sh
$ ./gradlew assembleRelease

$ tree app/build/outputs
app/build/outputs
├── aar
│   └── app-release.aar
└── logs
    └── manifest-merger-release-report.txt
```

## Mavenリポジトリを作成

build.gradleに記述したコマンドを実行し、Mavenリポジトリを作成します。

```sh
$ ./gradlew uploadArchives

$ tree repository
repository
└── com
    └── worlddowntown
        └── emailvalidator
            └── emailvalidator
                ├── 1.0.0
                │   ├── emailvalidator-1.0.0.aar
                │   ├── emailvalidator-1.0.0.aar.md5
                │   ├── emailvalidator-1.0.0.aar.sha1
                │   ├── emailvalidator-1.0.0.pom
                │   ├── emailvalidator-1.0.0.pom.md5
                │   └── emailvalidator-1.0.0.pom.sha1
                ├── maven-metadata.xml
                ├── maven-metadata.xml.md5
                └── maven-metadata.xml.sha1
```

## GitHubにアップロード

リポジトリ本体をGitHubにアップロードすると、ライブラリの公開は完了です。

```sh
$ git push origin master
```

## ホスティング方法はさまざま
個人のライブラリ開発にはGitHubにホスティングするが一番手軽ですが、ホスティング先は他にも幾つか存在します。
それぞれ特徴がありますが、下に行くほど公開するまでの手間が多く敷居が高いイメージです。

|サービス|説明|
|:--|:--|
|GitHub|今回のように個人が気軽にライブラリを公開するならこれ|
|[JitPack](https://jitpack.io/)|GitHubのコードをbuild.graldeでインストールする形式にパッケージ化してくれるサービス|
|[JFrog Bintray](https://bintray.com/)|JFrog社が提供するライブラリ配布のためのサービス|
|[Bintray JCenter](https://bintray.com/bintray/jcenter)|Bintrayが管理する公式の中央リポジトリ|
|[Maven Central Repository](https://search.maven.org/)|Sonatype社が管理するMavenの中央リポジトリ|

# 今回の成果物

文字列のEmail判定をするだけのシンプルなライブラリを公開しました。

[github/EmailValidator](https://github.com/WorldDownTown/EmailValidator)

# ライブラリを利用する

Androidアプリプロジェクトのbuild.gradleに追記

```gradle
dependencies {
    compile 'com.worlddowntown.emailvalidator:emailvalidator:1.0.0'
}

repositories {
    maven { url 'http://raw.github.com/WorldDownTown/EmailValidator/master/repository/' }
}
```

```kotlin
import com.worlddowntown.emailvalidator.EmailValidator

...

EmailValidator("foobar@example.com").isValid    // true
EmailValidator("foobarexample.com").isValid     // false
```

# 参考資料
[Android ライブラリの作成 | Android Studio](https://developer.android.com/studio/projects/android-library.html?hl=ja)

# まとめ
MavenリポジトリとしてAARをGitHubにpushすることで、Androidライブラリとして公開することができました。
iOS開発でのCarthageやCocoaPodsのような外部ライブラリに依存せずに、Androidアプリの設定を記述するGradleファイルで、ライブラリ設定も記述できるのが良いですね。
イケてるライブラリが作れたら、今後大きなリポジトリに公開してみたいものです。