はじめに
アプリケーション開発において、共通のパーツとして切り出して再利用性を高めたり、ロジックを切り出して責務を明確化して扱いやすくするために、コードをパッケージにまとめたくなります。
最近ではPythonを触ることが多いのでpipで管理できるようにしますが、Androidでも同様にライブラリにして管理できるようにしたいと思いました。
Androidでは、モジュールとしてライブラリを作成し、それをAARファイルへ変換し、Mavenレポジトリとしてアップロードすることで、それをライブラリとして読み込んで利用できるようです。管理ツールとしてGitHubを使うやり方で、それを実現します。
- 実行環境: Android Studio Version 4.0 (on macOS Catalina)
ライブラリの作成
プロジェクトの作成
「Start a new Android Studio project」からスタートします。
「Empty Activity」を選択します。(ここはどれでもよいです。)
プロジェクトの名前を決めます。特に、com.kuboshizuma
の部分はモジュールの部分はライブラリと合わせたほうが分かりやすいと思います。よく分からなければ、com.(自分の名前)
で作成するとよいです。
これでプロジェクトが作成されます。
ライブラリとなるモジュールの作成
次に以下のようにモジュールを作成します。
「Android Library」を選択しましょう。
「helloworld」と名前を付けます。「package name」の箇所が、先程のcom.(自分の名前)
を使ってcom.(自分の名前).helloworld
となっていると思います。ここは揃えたほうが分かりやすいので変更しないほうが無難です。
モジュールにクラスを追加します。以下のように「Java Class」を選択します。
以下のように、「SayHelloWorld」クラスを作りましょう。
その後、Toast
を使って、文字を表示させるメソッドを作成します。
package com.kuboshizuma.helloworld; import android.content.Context; import android.widget.Toast; public class SayHelloWorld { public static void s(Context c, String message){ Toast.makeText(c, message, Toast.LENGTH_SHORT).show(); } }
以上で今回作成するライブラリ自体の作成は終了です。実際には、このSayHelloWorld
クラスの部分をリッチに記述して、有用なライブラリを作ります。
プロジェクト内部でのライブラリの使用
ライブラリとして公開する前に、上記で作成したモジュールをライブラリとしてプロジェクト内で使い、動作を確認してみましょう。
以下のようにapp直下のbundle.gradle
にライブラリの追加を記述します。
dependencies { (省略) implementation project(":helloworld") }
このように記述することで、ライブラリを利用できるようになります。
プロジェクトのMainActivity.java
で以下のように、ライブラリを呼び出して使ってください。
package com.kuboshizuma.helloworldlibrary; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import com.kuboshizuma.helloworld.SayHelloWorld; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SayHelloWorld.s(MainActivity.this, "Hello World!"); } }
Syncして、実行すると利用が確認できます。 以下のように、ホップアップのような「Hello World!」が確認できれば成功です。
配布用パッケージの作成
それでは、この作成したライブラリを配布するための準備をしていきます。
AARの作成
AARとは「Android ARchive」を指し、Androidの配布用ファイルのことです。
プロジェクトの直下で以下のコマンドを実行することで作成できます。
$ ./gradlew assembleRelease
ただし、執筆時点では以下のようなエラーが発生しました。
* What went wrong: Could not initialize class org.codehaus.groovy.runtime.InvokerHelper
gradleのバージョンが低いようなので、gradle/wrapper/gradle-wrapper.properties
のバージョンが元々 6.1.1
だったのですが、以下のように、6.3
に変更します。
distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-all.zip
変更後、再度以下のコマンドを実行するとうまくいくと思います。
$ ./gradlew assembleRelease
以下のコマンドでAARファイルが存在するか確認しましょう。ファイルが表示されたら成功しています。
$ find . -name '*.aar'
Mavenレポジトリとしての配置
Java関連のファイルをおいてよしなにするレポジトリのことをMavenレポジトリというようです。GitHubをMavenレポジトリとして利用するための用意が必要です。
ライブラリ(helloworld
)直下のbundle gradle
に以下のような記述を追記します。
pom.groupId
には何度か登場している com.(自分の名前)
のような値を入れてください。また、pom.artifactId
はライブラリ名を入れてください。バージョンはお好きなもので構いません。
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.kuboshizuma' pom.artifactId = 'helloworld' } } }
その後、以下のコマンドを実行します。
$ ./gradlew uploadArchives
repository
ディレクトリが作成されていることが確認できれば成功です。
パッケージの配布と利用
GitHubへのアップロード
まず、ここまでで作成したコードをGitHubにアップロードしましょう。 今回アップロードしたサンプルをkuboshizuma/HelloWorldLibraryにアップロードしておきます。うまくいかない方はご参照ください。
公開パッケージの利用
利用するためのプロジェクトを新しく立ち上げましょう。
「Start a new Android Studio project」からスタートします。
「Empty Activity」を選択します。(例のごとく、ここはどれでもよいです。)
HelloWorldSmaple
のように先程と違う名前でプロジェクトを作成します。
まず、プロジェクト直下のbundle.gradle
に以下のように、maven ~
の行を追加します。ここは'https://raw.githubusercontent.com/*(ユーザー名)/(レポジトリ名)/(ブランチ名)/repository/'
になっているので適宜変更してください。
allprojects { repositories { google() jcenter() maven { url 'https://raw.githubusercontent.com/kuboshizuma/HelloWorldLibrary/master/repository/' } } }
次に、app直下に以下のように記述を追加します。com.(自分の名前):(ライブラリ名):(バージョン)
のようになっています。
dependencies { (省略) implementation 'com.kuboshizuma:helloworld:1.0.0' }
記述したら、Syncを実行しておいてください。 ここまでできると、新しいプロジェクト内でライブラリを使用できます。
プロジェクトのMainActivity.java
に以下のように記述することで、ライブラリを使用できます。
package com.kuboshizuma.helloworldsample; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import com.kuboshizuma.helloworld.SayHelloWorld; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SayHelloWorld.s(MainActivity.this, "Hello World!"); } }
以下のように表示が確認できたら成功です。
補足
コードを公開したくない方は以下の記事のように、privateレポジトリでも実現可能です。
また、ライブラリの公開ではrepository
のフォルダだけの公開で十分なので全てを公開する必要もありません。
おわりに
Androidアプリのライブラリの作り方とGitHubでの管理について説明しました。うまく使うことができれば便利で、Github上で簡単に管理できるところもよいなと思いました。みなさんも、是非、Androidライブラリを作成してみてください。
参考
基本的な流れは下記の記事を参考にしました。
しかし、この記事ではライブラリの公開・管理をJitPackというサービスに依存しています。今回はGitHubで直接管理できるようにしました。
やや古いですが、以下の記事も参考になりました。
以下の記事も簡潔にまとまっていて、参考になりました。
以下の記事は他の記事より情報が新しく、参考になりました。特にGitHubのURL周りがちょくちょく変わっているみたいです。
また、今回はやらなかったですが、Privateレポジトリとして非公開に扱うこともできるようなので、今回の方法は汎用性は高いと思います。