サイトのトップへ戻る

Android Studio ドキュメント 日本語訳

サイト内検索

Android ライブラリを作成する

Android ライブラリは、構造的には Android アプリモジュールと同じです。 ソースコード、リソースファイル、Android マニフェストを含む、アプリのビルドに必要な全てのものをインクルードできます。 しかし、Android ライブラリは端末上で実行できるAPKファイルにコンパイルされるのではなく、Android アプリモジュールの依存ファイルとして使用できるAndroid Archive (AAR)ファイルにコンパイルされます。 JAR ファイルとは違い、AAR ファイルはAndroid のリソースファイルとマニフェストファイルを含むことが出来ます。 これにより、Java のクラスやメソッドに加えて、layout やdrawableのような共有リソースもバンドルすることが出来ます

ライブラリモジュールは以下のような状況で役に立ちます。:

  • activityやserviceや UI layoutのような同じコンポーネントを使用する複数のアプリを作成している場合。
  • 無料版と有料版 複数の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 ファイルを開きます。 ファイルの上部には以下のような記述があるでしょう。:
    apply plugin: 'com.android.application'
    
  2. 以下のようにして、 plugin 割り当てを変更します。:

    apply plugin: 'com.android.library'
    
  3. Sync Project with Gradle Filesをクリックします。

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



ライブラリを依存ファイルとして追加する

Android ライブラリのコードを他のアプリモジュールで使用するには、以下のようにします:

  1. 以下二つの手順のうちどちらかを使って、プロジェクトにライブラリを追加します (同一プロジェクト内にライブラリモジュールを作成した場合は、ライブラリは既に存在するのこの手順は飛ばして構いません。):
    • コンパイルしたAAR (もしくは JAR) ファイルを追加する:
      1. File > New Moduleをクリックします。
      2. Import .JAR/.AAR Packageをクリックし、その後Nextをクリックします。
      3. AAR ファイルもしくは JAR ファイルの保存場所を入力し、Finishをクリックします。
    • プロジェクトにライブラリモジュールをインポートする:
      1. File > New > Import Moduleをクリックします。
      2. ライブラリモジュールディレクトリの保存場所を入力し、Finishをクリックします。

      このライブラリモジュールはあなたのプロジェクトにコピーされるので、ライブラリのコードは編集しても問題ありません。 あなたがライブラリのコードを単一バージョンでだけ管理したい場合、このやり方はあなたの要件と合致しないでしょう。 代わりに、前述のコンパイル済AAR ファイルをインポートする方法が良いです。

  2. ライブラリはsettings.gradleファイルの上部に一覧表記するようにしてください。以下は、"my-library-module"という名前のライブラリを使用する場合の例です。:
    include ':app', ':my-library-module'
    
  3. アプリモジュールのbuild.gradle ファイルを開き、以下のようにしてdependenciesブロックに新たに行を追加します。:
    dependencies {
        compile project(":my-library-module")
    }
    
  4. Sync Project with Gradle Filesをクリックします。

上記の例では、my-library-moduleという名前の Androidライブラリモジュールはbuild.gradleファイルがあるモジュールの依存ファイルとなります。

これでAndroidライブラリ内のコードとリソースはアプリモジュールからアクセスできるようになり、ライブラリAARファイルはビルド時にAPKファイルへバンドルされます。

しかし、AAR ファイルを別々に共有したい場合は、project-name/module-name/build/outputs/aar/にあるのでBuild > Make Projectをクリックして再生成することができます。



public設定にするリソースを選ぶ

ライブラリ内の全てのリソースは既定では public設定となっています。 全てのリソースを暗黙的にprivate設定にするには、 少なくとも一つ、ある特定の属性をpublicとして定義する必要があります。 Resourcesには、画像のような、プロジェクトのres/ ディレクトリにある全てのファイルが含まれています。 ライブラリの使用者が内部でのみ使用されるリソースにはアクセスできないようにするには、 public リソースを一つ以上宣言してこの自動private 指定メカニズムを有効にする必要があります。

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

以下のサンプルコードでは、mylib_app_name という名前と mylib_public_string という名前の二つのpublic string リソースを作成しています。:

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

ライブラリを使う開発者に見せたいリソースをpublic設定にしてください。 例えば、v7 appcompat ライブラリ内のほとんどのリソースは private設定ですが、Toolbar ウィジットを制御する属性は public 設定にして マテリアルデザインに対応しています。

暗黙的に属性をprivate 設定にすることで、ライブラリ使用者に内部バイナリリソースまで対象としたコード補間が表示されるのを防ぐだけでなく、 ライブラリの使用者に影響を与えずにprivate リソースの名前変更や削除を行うことが出来ます。 Private リソースはコード補間と テーマエディタの範囲から除外され、 privateリソースを参照しようとするとLint が警告を出します。



開発で考慮すべき事項

ライブラリモジュールとそれを使うアプリを開発する際には、以降に記述する挙動や制限事項に注意してください。

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

  • リソース結合の競合

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

    複数のAAR ライブラリ間で競合が発生した場合、依存関係の一覧で (dependencies ブロックの上から数えて)最初に記載されているライブラリのリソース が使用されます。

    一般的によく使用されるリソースIDを使うことによってリソースの競合が発生するのを避けるため、 リソースIDに接頭語を付けるか、モジュール内で一意になるような(またはプロジェクト全体を通しても一意となるような)その他一貫した命名規則を使うことを検討してください。

  • ライブラリモジュールには JAR ライブラリを含めることが出来る

    JAR ライブラリを含んだライブラリモジュールを開発することが出来ます; しかし、依存するアプリモジュールのビルドパスを手動で編集し、JARファイルへのパスを追加する必要があります。

  • ライブラリモジュールは外部の JAR ライブラリに依存することができます

    外部のライブラリ(例えば、外部ライブラリのMaps)に依存したライブラリモジュールを開発することができます。 この場合、依存するアプリは外部ライブラリ (例えば Google APIs Add-On)をインクルードしたターゲットをビルドする必要があります。 また、ライブラリモジュールとそれに依存するアプリの両方で、それらのマニフェストファイルの <uses- library>要素で外部ライブラリを宣言しなければらならないので注意してください。

  • ライブライモジュールはアセットを直にインクルードできません

    このツールでは、ライブラリモジュールでアセットファイル(assets/ ディレクトリに保存されている) を直に使用することをサポートしていません。 アプリで使用されるアセットリソースは、そのアプリモジュールの assets/ ディレクトリに保存されていなければなりません。

  • アプリモジュールの minSdkVersion は、ライブラリで定義されたminSdkVersion 以上にする必要がある

    ライブラリは依存するアプリモジュールの一部としてコンパイルされるので、ライブラリモジュール内で使用されるAPIはアプリモジュールがサポートするプラットフォームバージョンと互換性がある必要があります。

  • 各ライブラリモジュールは独自の R クラスを作成する

    依存するアプリモジュールをビルドする時、ライブラリモジュールはAAR ファイルにコンパイルされてアプリモジュールに追加されます。 従って各ライブラリは、ライブラリのパッケージ名に応じた名前が付けられた独自のRを持っています。 メインモジュールとライブラリモジュールで生成されるR クラスは、 メインモジュールのパッケージとライブラリのパッケージを含む、必要な全てのパッケージ内で作成されます。

  • ライブラリモジュールは ProGuard 設定ファイルをインクルードできる

    ProGuard ディレクティブを含んだライブラリにProGuard 設定ファイルを追加することで、 ライブラリでのコード圧縮を有効にすることが出来ます。 ビルドツールは、生成されたAARファイルにこのライブラリモジュール用の設定ファイルを埋め込みます。 ライブラリをアプリモジュールに追加した時、ライブラリのProGuard ファイルがアプリモジュールのProGuard 設定ファイル(proguard.txt)に追加されます。

    ProGuard ファイルをライブラリモジュール内に埋め込むことで、 ライブラリに依存するアプリモジュールがProGuard ファイルを手動で更新しなくても、ライブラリを使用できるようになります。 Android アプリモジュール上でProGuard を実行した時、ProGuard はアプリモジュールとライブラリ両方のディレクティブを使用するので、ライブラリ単体上でProGuard を実行すべきではありません。

    ライブラリの設定ファイル名を指定するには、 ライブラリの build.gradleファイル内にある defaultConfig 項目内のconsumerProguardFilesメソッドにファイル名を追加します。 例えば、以下のコードではlib-proguard-rules.txtをこのライブラリのProGuard 設定ファイルとして指定しています。:

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

    既定では、アプリモジュールは自身がデバッグビルドタイプを使用していたとしても、ライブラリのリリースビルドを使用します。 ライブラリで別のビルドタイプを使用するには、アプリのbuild.gradleファイルのdependencies ブロックに依存関係を追加して、 ライブラリの build.gradleファイルのpublishNonDefaulttrueを設定する必要があります。 例えばアプリの build.gradle ファイルに以下のコードを記載すると、アプリがデバックモードでビルドされる時はライブラリではデバックビルドを使用し、アプリがリリースモードでビルドされる時はライブラリではリリースビルドを使用します。:

    dependencies {
        debugCompile project(path: ':library', configuration: 'debug')
        releaseCompile project(path: ':library', configuration: 'release')
    }
    

    また、ライブラリのbuild.gradleファイルの androidブロック内に以下の行を追加し、ライブラリを使うプロジェクトに対して自身の non-release 設定を示す必要があります。:

    android {
        ...
        publishNonDefault true
    }
    

    ただし、publishNonDefaultを設定するとビルド時間が長くなる可能性があるので注意してください。

    To ensure that your library's ProGuard rules do not apply unwanted shrinking side effects to app modules, only include rules that disable ProGuard features that do not work with your library. Rules that attempt to aid developers can conflict with the existing code in an app module or its other libraries and therefore should not be included. For example, your library's ProGuard file can specify what code needs to be kept during an app module's minification.

    Note: The Jack toolchain provides support for only some shrinking and obfuscation options with ProGuard.



AAR ファイルの詳細

AAR ファイルの拡張子は.aarで、 and the Maven artifact type should be aar as well.このファイル自体は、以下の必須エントリーを含んだ zip ファイルです。:

  • /AndroidManifest.xml
  • /classes.jar
  • /res/
  • /R.txt

さらに、 AAR ファイルは以下の追加エントリを一つ以上含めることができます。:

  • /assets/
  • /libs/name.jar
  • /jni/abi_name/name.so (where abi_name is one of the Android supported ABIs)
  • /proguard.txt
  • /lint.jar