Android ライブラリを作成する

Android ライブラリは、構造上は Android アプリ モジュールと同じです。ソースコード、リソース ファイル、Android マニフェストなど、アプリのビルドに必要なものがすべて含まれています。

ただし、Android ライブラリをコンパイルすると、デバイス上で実行される APK ではなく、Android アプリ モジュールの依存関係として使用できる Android ARchive(AAR)ファイルが作成されます。JAR ファイルと異なり、AAR ファイルは Android アプリに次の機能を提供します。

  • AAR ファイルには Android のリソースとマニフェスト ファイルを含めることができるため、Kotlin または Java のクラスとメソッドに加え、レイアウトやドローアブルなどの共有リソースにもバンドルできます。
  • AAR ファイルには、アプリ モジュールの C/C++ コードで使用する C/C++ ライブラリを含めることができます。

ライブラリ モジュールは、次のような場合に役立ちます。

  • アクティビティ、サービス、UI レイアウトといった同じコンポーネントを使用する複数のアプリをビルドする場合
  • コア コンポーネントを共有する複数の APK バリアント(無償版と有償版など)に存在するアプリをビルドする場合

どちらの場合も、再利用したいファイルをライブラリ モジュールに移動し、各アプリ モジュールの依存関係としてライブラリを追加します。

このページでは、Android ライブラリ モジュールを作成して使用する方法について説明します。ライブラリを公開する方法については、ライブラリを公開するをご覧ください。

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

プロジェクトで新しいライブラリ モジュールを作成するには、次の手順を行います。

  1. [File] > [New] > [New Module] をクリックします。
  2. 表示された [Create New Module] ダイアログで、[Android Library]、[Next] の順にクリックします。

    従来の JAR ファイルをビルドする Kotlin または Java ライブラリを作成するオプションもあります。JAR ファイルは、多くのプロジェクトで(特に他のプラットフォームとコードを共有したい場合に)役立ちますが、Android のリソースまたはマニフェスト ファイルを含めることはできません。この特徴は、Android プロジェクトでコードを再利用する場合に非常に便利です。このガイドでは、Android ライブラリの作成に焦点を絞って説明します。

  3. ライブラリの名前を指定し、ライブラリのコードの最小 SDK バージョンを選択して、[Finish] をクリックします。

Gradle プロジェクトの同期が完了すると、[Project] ペインにライブラリ モジュールが表示されます。新しいモジュール フォルダが表示されない場合は、ペインに [Android] ビューが表示されていることを確認してください。

アプリ モジュールをライブラリ モジュールに変換する

再利用したいコードが含まれている既存のアプリ モジュールがある場合は、次の手順でライブラリ モジュールに変換できます。

  1. Groovy を使用している場合は、モジュール レベルの build.gradle ファイルを開きます。Kotlin スクリプトを使用している場合は、build.gradle.kts ファイルを開きます。
  2. applicationId の行を削除します。これを定義できるのは Android アプリ モジュールだけです。
  3. ファイルの先頭で、次のような「plugins」ブロックを探します。

    Groovy

      plugins {
          id 'com.android.application'
      }
      

    Kotlin

      plugins {
          id("com.android.application")
      }
      

    これらのブロックを次のように変更します。

    Groovy

      plugins {
          id 'com.android.library'
      }
      

    Kotlin

      plugins {
          id("com.android.library")
      }
      
  4. ファイルを保存し、[File] > [Sync Project with Gradle Files] をクリックします。

モジュールの構造は同じままですが、モジュールが Android ライブラリとして機能するようになりました。ビルドすると、APK ではなく AAR ファイルが作成されます。

AAR ファイルをビルドする場合は、[Project] ウィンドウでライブラリ モジュールを選択し、[Build] > [Build APK] をクリックします。

[Project Structure] ダイアログで依存関係を追加する

[Project Structure] ダイアログを使用して、プロジェクトに依存関係を追加できます。以降のセクションでは、このダイアログを使用して依存関係を追加する方法について説明します。

同じプロジェクト内からライブラリを使用する

同じプロジェクト内の別のアプリまたはライブラリ モジュールで新しい Android ライブラリのコードを使用するには、プロジェクト レベルの依存関係を追加します。

  1. [File] > [Project Structure] > [Dependencies] に移動します。
  2. ライブラリを追加するモジュールを選択します。
  3. [Declared Dependencies] タブで をクリックし、メニューから [Module Dependency] を選択します。

  4. [Add Module Dependency] ダイアログで、ライブラリ モジュールを選択します。

    [Project Structure] ダイアログでモジュール依存関係を追加する

  5. この依存関係を必要とする構成を選択します。すべての構成に適用する場合は、[implementation] を選択して [OK] をクリックします。

Android Studio は、モジュールの build.gradle または build.gradle.kts ファイルを編集して、次の形式で依存関係を追加します。

Groovy

  implementation project(path: ":example-library")

Kotlin

  implementation(project(":example-library"))

他のプロジェクトでライブラリを使用する

依存関係(JAR、AAR)を共有するには、Maven Central などのサービスでホストされている Maven リポジトリか、ローカル ディスク上のディレクトリ構造を使用することをおすすめします。Maven リポジトリの使用について詳しくは、リモート リポジトリをご覧ください。

Android ライブラリが Maven リポジトリに公開されると、使用元のビルドにライブラリの依存関係が含まれるようにメタデータが追加されます。これにより、ライブラリが複数の場所で使用されている場合は、自動的に重複を除去できます。

異なるプロジェクトの別のアプリ モジュールで Android ライブラリのコードを使用するには、次の手順を行います。

  1. [File] > [Project Structure] > [Dependencies] に移動します。
  2. [Declared Dependencies] タブで をクリックし、メニューで [Library Dependency] を選択します。

  3. [Add Library Dependency] ダイアログで検索ボックスを使用して、追加するライブラリを探します。このフォームは、settings.gradle または settings.gradle.kts ファイルの dependencyResolutionManagement { repositories {...}} ブロック内で指定されているリポジトリを検索します。

    [Project Structure] ダイアログでライブラリ依存関係を追加する

  4. この依存関係を必要とする構成を選択します。すべての構成に適用する場合は、[implementation] を選択して [OK] をクリックします。

アプリの build.gradle または build.gradle.kts ファイルをチェックして、次のような宣言(選択したビルド構成によって異なります)が表示されていることを確認します。

Groovy

  implementation 'com.example:examplelibrary:1.0.0'

Kotlin

  implementation("com.example:examplelibrary:1.0.0")

AAR または JAR を依存関係として追加する

Android ライブラリのコードを別のアプリ モジュールで使用する手順は次のとおりです。

  1. [File] > [Project Structure] > [Dependencies] に移動します。
  2. [Declared Dependencies] タブで をクリックし、メニューで [Jar Dependency] を選択します。

  3. [Add Jar/Aar Dependency] ダイアログで、AAR または JAR ファイルへのパスを入力し、依存関係を適用する構成を選択します。すべての構成でライブラリを使用可能にする場合は、implementation 構成を選択します。

    [Project Structure] ダイアログで AAR 依存関係を追加する

    アプリの build.gradle または build.gradle.kts ファイルをチェックして、次のような宣言(選択したビルド構成によって異なります)が表示されていることを確認します。

    Groovy

      implementation files('my_path/my_lib.aar')

    Kotlin

      implementation(files("my_path/my_lib.aar"))

Android Studio の外部で実行される Gradle ビルドの依存関係をインポートするには、アプリの build.gradle または build.gradle.kts ファイルに依存関係へのパスを追加します。次に例を示します。

Groovy

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar", "*.aar"])
}

Kotlin

dependencies {
    implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar", "*.aar"))))
}

Gradle 依存関係の追加について詳しくは、ビルド依存関係を追加するをご覧ください。

パブリック リソースを宣言する

リソースには、プロジェクトの res/ ディレクトリにあるすべてのファイル(画像など)が含まれます。ライブラリ内のリソースは、デフォルトではすべてパブリックです。すべてのリソースを暗黙的にプライベートにするには、少なくとも 1 つの属性をパブリックとして定義する必要があります。

パブリック リソースを宣言するには、<public> 宣言をライブラリの public.xml ファイルに追加します。これまでにパブリック リソースを追加したことがない場合は、ライブラリの res/values/ ディレクトリに public.xml ファイルを作成する必要があります。

次のサンプルコードでは、mylib_app_namemylib_public_string という名前の 2 つのパブリック文字列リソースを作成しています。

<resources>
    <public name="mylib_app_name" type="string"/>
    <public name="mylib_public_string" type="string"/>
</resources>

ライブラリのユーザーが内部使用に限定されたリソースにアクセスできないようにするには、1 つ以上のパブリック リソースを宣言して、この自動プライベート指定の仕組みを利用します。または、空の <public /> タグを追加して、すべてのリソースをプライベートにすることもできます。この場合、どのリソースもパブリックとしてマークされないため、すべてがプライベートになります。

ライブラリを使用するデベロッパーに対して公開するリソースは、すべてパブリックにする必要があります。

暗黙的に属性をプライベートにすると、ライブラリのユーザーには、内部ライブラリ リソースからコード補完候補が提示されなくなります。また、ユーザーはライブラリのクライアントを妨害することなく、プライベート リソースの名前変更または削除を行えます。プライベート リソースはコード補完候補から除外され、プライベート リソースを参照しようとすると lint ツールによって警告が表示されます。

ライブラリをビルドすると、Android Gradle プラグインによりパブリック リソース定義が取得され、public.txt ファイルに抽出されます。このファイルは AAR ファイル内にパッケージ化されます。

ライブラリ モジュールの開発に関する考慮事項

ライブラリ モジュールとそれに依存するアプリを開発するときは、次の動作と制限に注意してください。

  • ライブラリは優先度の順にマージされる。

    ライブラリ モジュールへの参照を Android アプリ モジュールに追加すると、各参照の相対的な優先度を設定できます。ビルド時に、ライブラリは優先度の低いものから順に 1 つずつアプリにマージされます。

  • リソースのマージの競合を避ける。

    ビルドツールは、ライブラリ モジュールのリソースとそれに依存するアプリ モジュールのリソースをマージします。指定されたリソース ID が両方のモジュールで定義されている場合は、アプリのリソースが使用されます。

    複数の AAR ライブラリ間で競合が発生した場合は、依存関係リスト内の先の方(dependencies ブロックの先頭に近い方)にあるライブラリのリソースが使用されます。

    リソースの競合を避けるには、非推移的な R クラスを使用します。それができない場合は、モジュールに固有の(つまり、すべてのプロジェクト モジュール間で一意の)接頭辞またはそれ以外の一貫性のある命名方式の使用を検討してください。

  • マルチモジュール ビルドでは、JAR 依存関係は推移的依存関係として扱われる。

    AAR を出力するライブラリ プロジェクトに JAR 依存関係を追加すると、JAR はライブラリ モジュールによって処理され、AAR と一緒にパッケージ化されます。

    ただし、アプリ モジュールによって使用されるライブラリ モジュールがプロジェクトに含まれている場合、アプリ モジュールはライブラリのローカル JAR 依存関係を推移的依存関係として扱います。この場合、ローカル JAR は、ライブラリ モジュールではなく、ローカル JAR を使用するアプリ モジュールによって処理されます。これにより、ライブラリのコードの変更によって生じる増分ビルドが高速化されます。

    ローカル JAR 依存関係に起因する Java リソースの競合は、ライブラリを使用するアプリ モジュールで解決する必要があります。

  • ライブラリ モジュールは外部 JAR ライブラリに依存できる。

    外部ライブラリに依存するライブラリ モジュールを開発できます。この場合、依存元のモジュールは外部ライブラリを含むターゲットを指定してビルドする必要があります。

    なお、ライブラリ モジュールとそれに依存するアプリの両方のマニフェスト ファイルで、<uses-library> 要素で外部ライブラリを宣言する必要があります。

  • アプリ モジュールの minSdkVersion には、ライブラリで定義されているバージョン以上の値を指定する必要がある。

    ライブラリは、それに依存するアプリ モジュールの一部としてコンパイルされるため、ライブラリ モジュールで使用される API は、アプリ モジュールがサポートするプラットフォーム バージョンと互換性がなければなりません。

  • ライブラリ モジュールごとに独自の R クラスが作成される。

    依存元のアプリ モジュールをビルドすると、ライブラリ モジュールは AAR ファイルにコンパイルされた後、アプリ モジュールに追加されます。そのため、ライブラリごとに独自の R クラスが生成され、ライブラリのパッケージ名に基づいた名前が付けられます。

    メイン モジュールとライブラリ モジュールから生成される R クラスは、メイン モジュールのパッケージとライブラリのパッケージを含むすべての必要なパッケージ内に作成されます。

  • ライブラリ モジュールには独自の ProGuard 構成ファイルを含めることができる。

    AAR をビルドして公開するために使用するライブラリ プロジェクトの場合は、ライブラリのビルド構成に ProGuard 構成ファイルを追加できます。追加すると、指定した ProGuard ルールが Android Gradle プラグインによって適用されます。このファイルは、ビルドツールにより、ライブラリ モジュールごとに生成される AAR ファイルに埋め込まれます。ライブラリをアプリ モジュールに追加すると、ライブラリの ProGuard ファイルがアプリ モジュールの ProGuard 構成ファイル(proguard.txt)の末尾に追加されます。

    ライブラリ モジュールに ProGuard ファイルを埋め込むと、ライブラリに依存するアプリ モジュールで、ライブラリを使用するために ProGuard ファイルを手動で更新する必要がなくなります。Android Studio のビルドシステムでアプリをビルドする際には、アプリ モジュールとライブラリの両方のディレクティブが使用されます。したがって、ライブラリで別途コード圧縮ツールを実行する必要はありません。

    ProGuard ルールをライブラリ プロジェクトに追加するには、ライブラリの build.gradle または build.gradle.kts ファイルの defaultConfig ブロック内にある consumerProguardFiles プロパティでファイルの名前を指定します。

    たとえば、次のスニペットでは、lib-proguard-rules.txt をライブラリの ProGuard 構成ファイルとして設定しています。

    Groovy

    android {
        defaultConfig {
            consumerProguardFiles 'lib-proguard-rules.txt'
        }
        ...
    }

    Kotlin

    android {
        defaultConfig {
            consumerProguardFiles("lib-proguard-rules.txt")
        }
        ...
    }

    ただし、APK にコンパイルされ AAR を生成しないマルチモジュール ビルドにライブラリ モジュールが含まれている場合は、ライブラリを使用するアプリ モジュールでのみコード圧縮を実行してください。ProGuard ルールとその使用方法について詳しくは、アプリの圧縮、難読化、最適化をご覧ください。

  • ライブラリ モジュールのテストはアプリのテストとほぼ同じである。

    主な違いは、ライブラリとその依存関係がテスト APK の依存関係として自動的に含まれることです。つまり、テスト APK には独自のコードだけでなく、ライブラリの AAR とそのすべての依存関係も含まれます。テスト対象のアプリが単独で存在することはないため、androidTest タスクはテスト APK のみをインストール(およびアンインストール)します。

    複数のマニフェスト ファイルをマージする場合、Gradle はデフォルトの優先順位に従って、ライブラリのマニフェストをテスト APK のメイン マニフェストにマージします。

AAR ファイルの仕組み

AAR ファイルのファイル拡張子は .aar で、Maven アーティファクト タイプも aar です。ファイル自体は ZIP ファイルです。必須エントリは /AndroidManifest.xml だけです。

また、AAR ファイルには、次の省略可能なエントリを 1 つ以上含めることができます。