VASILYDay 4

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

More than 1 year has passed since last update.

長らく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
Android ARchiveの略
・ Androidライブラリのソースコードと画像やXMLなどのリソースをまとめて管理
・ 実態は特定のディレクトリ構造をzipしたもの

Maven
Javaプログラムをビルドするためのツール

build.gradle
ビルドシステムであるGradleの設定ファイル

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


ライブラリ公開までのステップ


  1. プロジェクト作成

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

  3. ライブラリ本体のコードを書く

  4. build.gradleを編集

  5. AARをビルド

  6. Mavenリポジトリを作成

  7. GitHubに公開


プロジェクトを作成

まずはAndroidアプリのプロジェクトを作成します。

Activityの種類を選択する画面では、何を選択してもよいのですが、Empty Activityを選択しておくとライブラリの動作確認に役立つでしょう。


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

下記の流れでライブラリモジュールを追加します

File → New → New Module → Android Library


コードを書く

ここでライブラリ本体のコードを書いていきましょう。

今回は、文字列がemailかどうかを判別する簡単なクラスを一つ作成しました。

ライブラリのコードをデバッグするにあたって、プロジェクト作成時に作ったEmptyActivityのAndroidアプリ上で動かしてみるのが良いと思います。


build.gradleを編集

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


app/build.gradle

アプリモジュールをライブラリモジュールに変換するように設定を変更します。

またライブラリモジュールはapplicationIdを持つことができないので、設定を削除します。

// apply plugin: 'com.android.application'

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

この設定変更によって、プロジェクトを実機やシミュレータにビルドすることができなくなります。

再びライブラリのデバッグをする際は設定を元に戻しましょう。


library/build.gradle

AARを含むMavenリポジトリを生成するGradleスクリプトを追記します。

ここでライブラリのバージョンなどを指定します。

これらはGradleスクリプトを実行するとpomと呼ばれるMavenの設定ファイルに記述されます。

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 ファイルが作成されます。

$ ./gradlew assembleRelease

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


Mavenリポジトリを作成

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

$ ./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にアップロードすると、ライブラリの公開は完了です。

$ git push origin master


ホスティング方法はさまざま

個人のライブラリ開発にはGitHubにホスティングするが一番手軽ですが、ホスティング先は他にも幾つか存在します。

それぞれ特徴がありますが、下に行くほど公開するまでの手間が多く敷居が高いイメージです。

サービス
説明

GitHub
今回のように個人が気軽にライブラリを公開するならこれ

JitPack
GitHubのコードをbuild.graldeでインストールする形式にパッケージ化してくれるサービス

JFrog Bintray
JFrog社が提供するライブラリ配布のためのサービス

Bintray JCenter
Bintrayが管理する公式の中央リポジトリ

Maven Central Repository
Sonatype社が管理するMavenの中央リポジトリ


今回の成果物

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

github/EmailValidator


ライブラリを利用する

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

dependencies {

compile 'com.worlddowntown.emailvalidator:emailvalidator:1.0.0'
}

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

import com.worlddowntown.emailvalidator.EmailValidator

...

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


参考資料

Android ライブラリの作成 | Android Studio


まとめ

MavenリポジトリとしてAARをGitHubにpushすることで、Androidライブラリとして公開することができました。

iOS開発でのCarthageやCocoaPodsのような外部ライブラリに依存せずに、Androidアプリの設定を記述するGradleファイルで、ライブラリ設定も記述できるのが良いですね。

イケてるライブラリが作れたら、今後大きなリポジトリに公開してみたいものです。