web-dev-qa-db-ja.com

Androidライブラリマニフェストとアプリマニフェスト

私はここで同様の質問を読みましたが、いくつかの点についてはまだはっきりしていません。ライブラリプロジェクトを使用すると、プロジェクト全体に2つのマニフェスト(ライブラリ用と「メイン」のアプリプロジェクト用)があり、何がどこにあるのか、または冗長性があるかどうかはわかりません。

私は「ライト」バージョンと「有料」バージョンのアプリウィジェットを開発しているので、ほとんどすべてのコードがライブラリプロジェクトに含まれます。ライブラリはウィジェットであるため、少なくともレシーバー、サービス、構成アクティビティーに加えて、他のいくつかのアクティビティーがあります。では、これらのコンポーネントの完全な宣言(インテント、フィルターなどを含む)はどこで宣言する必要がありますか?それらは、ライブラリのマニフェスト、またはアプリケーションパッケージ自体のマニフェストに含まれ、ライブラリ(例:Android:name = "com.foo.mylibrary.MyService")のクラスを参照していますか?

私が見たいくつかの例は、両方のマニフェストでそれらを宣言しているようですが、これらをどちらか一方に配置することは何もできないと思います。

39
gordonwd

ライブラリプロジェクトを使用すると、プロジェクト全体に2つのマニフェスト(ライブラリ用と「メイン」のアプリプロジェクト用)があり、何がどこにあるのか、または冗長性があるかどうかはわかりません。

ライブラリプロジェクトマニフェストは現在使用されていません。

Gradle for Android、したがってAndroid Studio、サポートライブラリプロジェクトおよびマニフェストを公開するAAR。これには、アクティビティ宣言、必要な権限または機能、またはサポートされる最小Android SDKレベル。

ライブラリマニフェストをアプリ自体のマニフェストとマージする方法、特にビルドタイプとプロダクトフレーバーを考慮に入れる場合のルールは ビットコンプレックス です。

では、これらのコンポーネントの完全な宣言(インテント、フィルターなどを含む)はどこで宣言する必要がありますか?

ホストプロジェクト。

ライブラリはこれらのコンポーネントを公開でき、Android Studio Hostプロジェクトは必要に応じてそれらを削除できます。

ライブラリのマニフェスト、またはアプリケーションパッケージ自体のマニフェストに入れて、ライブラリのクラスを参照しますか(Android:name = "com.foo.mylibrary.MyService"など)?

後者。

どちらでも(AndroidおよびAndroid StudioのGradleを使用)。理論的には、ライブラリがコンポーネントを公開する方が簡単なので、アプリの作成者は個人的には、あまりにも多くの開発者が不必要なマニフェストエントリを出荷することになるので、私はこれの大ファンではありません。

43
CommonsWare

ADT r20プレビュー3以降、マニフェストをマージできるようになりました。そのため、一般的な構成をライブラリマニフェストに入れることができます。詳細については、 https://stackoverflow.com/a/10400355/262789 を参照してください。

Intellijのバージョン13 IDEAはマニフェストマージのサポートに必要です(manifestmerger.enabled=true)。また、グレードベースのビルドシステム 必要と思われる Android Studioサポート。

9
Benjamin

参照されているすべてのAndroidアクティビティ、レシーバー、サービスなどの要素は、アプリケーションマニフェストに含める必要があります。そうしないと、OSによって認識されません。ご想像のとおり、ライブラリマニフェストファイルはほとんど空の実装

[〜#〜]更新[〜#〜]

CommonsWareが上記で指摘したように、Androidビルドツールは、代わりにさまざまなマニフェストをマージしようとします。元の答えを後世に残しておく

5
JRaymond