Android ライブラリの作成

Android ライブラリは、構造上は Android アプリ モジュールと同じです。 ソースコード、リソース ファイル、Android マニフェストなど、アプリのビルドに必要なものはすべて含めることができます。 ただし、Android ライブラリをコンパイルすると、デバイス上で実行される APK ではなく、Android アプリ モジュールの依存関係として使用できる Android ARchive(AAR)ファイルになります。JAR ファイルとは異なり、AAR ファイルは Android アプリで次の機能を提供します。

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

ライブラリ モジュールは、次のような場合に便利です。

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

どちらの場合も、再利用したいファイルをライブラリ モジュールに移動して、各アプリ モジュールの依存関係としてライブラリを追加するだけです。このページでは、両方のケースについて説明します。

ライブラリ モジュールを作成する

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

  1. [File] > [New] > [New Module] をクリックします。
  2. 表示された [Create New Module] ウィンドウで、[Android Library]、[Next] の順にクリックします。

    作成するモジュールの選択肢には [Java Library] もありますが、これを選ぶと従来の JAR ファイルが作成されます。JAR ファイルは多くのプロジェクトで、特に他のプラットフォームとコードを共有する場合に役立ちますが、Android リソースやマニフェスト ファイルを含めることはできません(この特徴は、Android プロジェクトでコードを再利用する場合には非常に便利です)。そのためこのガイドでは、Android ライブラリの作成に焦点を当てて説明します。

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

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

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

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

  1. モジュール レベルの build.gradle ファイルを開きます。
  2. applicationId の行を削除します。 これを定義できるのは Android アプリ モジュールだけです。
  3. ファイルの先頭に次の行があるはずです。

    Groovy

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

    Kotlin

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

    Groovy

      apply plugin: 'com.android.application'

    この行を次のように変更します。

    Groovy

      apply plugin: '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] ダイアログで依存関係を追加する

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

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

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

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

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

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

Studio によって、モジュールの build.gradle ファイルが編集され、フォームの依存関係が追加されます。

Kotlin

implementation(project(path: ":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] ダイアログで、検索ボックスを使用して追加するライブラリを探します。このフォームは、プロジェクトのビルドファイルで指定されたリポジトリを repositories ブロック内で検索します。

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

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

  5. アプリの build.gradle ファイルを調べて、次のような宣言を確認します(選択したビルド構成によって異なります)。

    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 依存関係を追加する

  4. アプリの build.gradle ファイルを調べて、次のような宣言を確認します(選択したビルド構成によって異なります)。

      implementation files('my_path/my_lib.aar')
    

もしくは、Android Studio の外部で Gradle ビルドを実行している場合は、アプリの build.gradle ファイルに依存関係のパスを追加することで、依存関係をインポートできます。次に例を示します。

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

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

公開するリソースを選択する

ライブラリ内のリソースはデフォルトですべてパブリックになります。すべてのリソースを暗黙的にプライベートにするには、少なくとも 1 つの属性をパブリックとして定義する必要があります。 リソースには、プロジェクトの res/ ディレクトリにあるすべてのファイル(画像など)が含まれます。内部での利用に限定したリソースにライブラリのユーザーがアクセスできないようにするには、パブリック リソースを 1 つ以上宣言して、この自動プライベート指定の仕組みを利用します。また、空の <public /> タグを追加することによってすべてのリソースをプライベートにすることもできます(パブリックとして何もマークされないため、すべてのリソースがプライベートになります)。

パブリック リソースを宣言するには、<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>

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

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

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

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

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

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

  • リソース統合時の競合

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

    複数の AAR ライブラリ間に競合が発生すると、依存関係リストで先(dependencies ブロックの上の方)に記載されているライブラリのリソースが使用されます。

    異なるリソースに同じリソース ID を割り当てないようにするには、接頭辞などの一貫性のある命名スキームを使用して、リソース ID がモジュールごとに(またはすべてのプロジェクト モジュールにわたって)一意になるようにすることをおすすめします。

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

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

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

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

  • ライブラリ モジュールは外部 JAR ライブラリへの依存が可能

    外部ライブラリに依存するライブラリ モジュールを作成できます(たとえば、Maps 外部ライブラリなど)。この場合、依存するアプリは外部ライブラリ(たとえば、Google API アドオン)を含むターゲットを指定してビルドする必要があります。また、ライブラリ モジュールとそれに依存するアプリの両方のマニフェスト ファイルで、<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 ファイルの defaultConfig ブロック内にある consumerProguardFiles プロパティでファイルの名前を指定する必要があります。たとえば次のスニペットでは、ライブラリの ProGuard 構成ファイルとして lib-proguard-rules.txt を設定しています。

    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 つ以上含めることができます。