ほろ酔い開発日誌

AI企業のエンジニアのブログです。機械学習、Web開発の技術的お話、ビジネスチックなお話、日常のお役立ち情報など雑多な内容でお送りします。

Androidアプリのライブラリの作り方とGitHubでの管理

f:id:seishin55:20200712115204j:plain

はじめに

アプリケーション開発において、共通のパーツとして切り出して再利用性を高めたり、ロジックを切り出して責務を明確化して扱いやすくするために、コードをパッケージにまとめたくなります。

最近ではPythonを触ることが多いのでpipで管理できるようにしますが、Androidでも同様にライブラリにして管理できるようにしたいと思いました。

Androidでは、モジュールとしてライブラリを作成し、それをAARファイルへ変換し、Mavenレポジトリとしてアップロードすることで、それをライブラリとして読み込んで利用できるようです。管理ツールとしてGitHubを使うやり方で、それを実現します。

ライブラリの作成

プロジェクトの作成

「Start a new Android Studio project」からスタートします。

f:id:seishin55:20200712103834p:plain

「Empty Activity」を選択します。(ここはどれでもよいです。)

f:id:seishin55:20200712103909p:plain

プロジェクトの名前を決めます。特に、com.kuboshizumaの部分はモジュールの部分はライブラリと合わせたほうが分かりやすいと思います。よく分からなければ、com.(自分の名前)で作成するとよいです。

f:id:seishin55:20200712104023p:plain

これでプロジェクトが作成されます。

ライブラリとなるモジュールの作成

次に以下のようにモジュールを作成します。

f:id:seishin55:20200712104207p:plain

Android Library」を選択しましょう。

f:id:seishin55:20200712104242p:plain

「helloworld」と名前を付けます。「package name」の箇所が、先程のcom.(自分の名前)を使ってcom.(自分の名前).helloworldとなっていると思います。ここは揃えたほうが分かりやすいので変更しないほうが無難です。

f:id:seishin55:20200712104309p:plain

モジュールにクラスを追加します。以下のように「Java Class」を選択します。

f:id:seishin55:20200712104502p:plain

以下のように、「SayHelloWorld」クラスを作りましょう。

f:id:seishin55:20200712104552p:plain

その後、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!」が確認できれば成功です。

f:id:seishin55:20200712111534p:plain

配布用パッケージの作成

それでは、この作成したライブラリを配布するための準備をしていきます。

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レポジトリというようです。GitHubMavenレポジトリとして利用するための用意が必要です。

ライブラリ(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」からスタートします。

f:id:seishin55:20200712114003p:plain

「Empty Activity」を選択します。(例のごとく、ここはどれでもよいです。)

f:id:seishin55:20200712114014p:plain

HelloWorldSmapleのように先程と違う名前でプロジェクトを作成します。

f:id:seishin55:20200712114026p:plain

まず、プロジェクト直下の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!");
    }
}

以下のように表示が確認できたら成功です。

f:id:seishin55:20200712114040p:plain

補足

コードを公開したくない方は以下の記事のように、privateレポジトリでも実現可能です。

hirauchi-genta.com

また、ライブラリの公開ではrepositoryのフォルダだけの公開で十分なので全てを公開する必要もありません。

おわりに

Androidアプリのライブラリの作り方とGitHubでの管理について説明しました。うまく使うことができれば便利で、Github上で簡単に管理できるところもよいなと思いました。みなさんも、是非、Androidライブラリを作成してみてください。

参考

基本的な流れは下記の記事を参考にしました。

medium.com

しかし、この記事ではライブラリの公開・管理をJitPackというサービスに依存しています。今回はGitHubで直接管理できるようにしました。

やや古いですが、以下の記事も参考になりました。

techlife.cookpad.com

以下の記事も簡潔にまとまっていて、参考になりました。

qiita.com

以下の記事は他の記事より情報が新しく、参考になりました。特にGitHubのURL周りがちょくちょく変わっているみたいです。

hirauchi-genta.com

また、今回はやらなかったですが、Privateレポジトリとして非公開に扱うこともできるようなので、今回の方法は汎用性は高いと思います。

hirauchi-genta.com