Develop with pleasure!

福岡でCloudとかBlockchainとか。

Androidでライブラリプロジェクトを作成する際の考慮事項

Androidで通常のアプリケーションプロジェクトではなくライブラリプロジェクトを作成する際の考慮事項が、Dev Guideに記載されている。

ざっくり意訳すると、

ライブラリプロジェクトとそれに依存するアプリケーションを開発する際に、以下のことに注意する必要がある。

  • Resource conflicts
    ライブラリプロジェクトのリソースとライブラリに依存するアプリケーションプロジェクトのリソースはツールによりマージされるので、採番されたリソースIDは両方のプロジェクトで重複して定義される可能性がある。この場合、ツールはアプリケーションかライブラリか優先順位の高い方をIDの値として判断し、もう一方のIDの値は破棄される。アプリケーションを開発する際に、共通のリソースIDは複数のプロジェクトで定義される可能性が高く、最終的に優先順位の高いアプリケーションもしくはライブラリの値がマージされることに注意する必要がある。

  • Use prefixes to avoid resource conflicts
    共通のリソースIDの定義によるコンフリクトを防ぐためにプロジェクト単位でユニークとなるようなprefixを付けることを検討すべき。

  • You cannot export a library project to a JAR file
    ライブラリはjarファイルのようなバイナリでは配布できない。これはライブラリプロジェクトが正しいリソースIDを使用できるように、メインのアプリケーションプロジェクトでコンパイルされる必要があるから。

  • A library project can include a JAR library
    ライブラリプロジェクトは、JARライブラリを含むライブラリを開発することが可能。ただ、そのライブラリを使用するアプリケーションプロジェクトのビルドパスに、ライブラリが使用するJARを追加する必要がある。

  • A library project can depend on an external JAR library
    外部のライブラリ(例えば、Maps外部ライブラリみたいな)に依存するライブラリプロジェクトを作成することも可能。この場合、ライブラリに依存するアプリケーションは、外部ライブラリ(例えば、Google APIs Add-On)が組み込まれているターゲットに対してビルドされる必要がある。また、ライブラリプロジェクトと依存するアプリケーションプロジェクト両方でマニフェストファイル内の要素で外部ライブラリの使用を宣言する必要がある。

  • Library projects cannot include raw assets
    ツールはライブラリプロジェクト内のraw assetファイル(assets/ ディレクトリ内に保存されているファイル)をサポートしない。アプリケーションが使用する全てのassetリソースは、アプリケーションプロジェクト内のassets/ ディレクトリ内に保存される必要がある。しかし、res/ ディレクトリ内のリソースファイルはサポートされる。

  • Platform version must be lower than or equal to the Android project
    ライブラリは、そのライブラリに依存するアプリケーションプロジェクトの一部としてコンパイルされるので、ライブラリプロジェクト内で使用するAPIと、アプリケーションプロジェクトをビルドする際のAPIには互換性がある必要がある。一般的に、ライブラリプロジェクトで使用するAPIは、アプリケーションプロジェクトのAPIと同じバージョンか、それより低いバージョンであるべき。ライブラリプロジェクトがアプリケーションプロジェクトより高いバージョンのAPIを使用したら、アプリケーションプロジェクトはコンパイルされないでしょう。例えば、ライブラリがAndroid 1.5 API (API level 3) のAPIを使用し、 Android 1.6 (API level 4) か Android 2.1 (API level 7) でビルドされるアプリケーションプロジェクトにそのライブラリを組み込むのは問題ない。

  • No restriction on library package names
    ライブラリを使用するアプリケーションと同様に、ライブラリのパッケージ名にも特に制限は無い。

  • Each library project creates its own R class
    アプリケーションプロジェクトをビルドすると、ライブラリプロジェクトもコンパイルされアプリケーションプロジェクトにマージされる。各ライブラリはライブラリのパッケージ名に基づいた独自のRクラスを保持している。アプリケーションプロジェクトとライブラリプロジェクトから生成されたRクラスは、アプリケーションプロジェクトとライブラリプロジェクトを含む全ての必要なパッケージ内に作成される。

  • Library project storage location
    アプリケーションプロジェクトが相対リンクでライブラリプロジェクトを参照可能なのであれば、ライブラリプロジェクトの格納場所について特別な要件はない(どこに配置してもOK)。重要なのはアプリケーションプロジェクトが相対パスでライブラリプロジェクトを参照できることだ。


な感じ。

ライブラリプロジェクトをjarで提供できると良いんだけど駄目なのね。
ライブラリ側でresディレクトリのリソースファイルを使用する場合に、Rに振られるリソースIDの解決ができないからだろうな。でも、ソースも一式提供しないといけなくなるってどーなの。。

android.jarの内部にはassetsもresもガッツリ入ってるのに大丈夫なのは、アプリでR用に採番される値の範囲とは別の範囲の値を予め割り当ててるのかな。

追記 2012/11/19

Androidのライブラリプロジェクトがjarとして配布可能になってた。 - Develop with pleasure!
といった具合にADT 1.4以降で対応が入ってる。