page.title=アプリ マニフェスト @jd:body
すべてのアプリケーションには、そのルート ディレクトリに AndroidManifest.xml ファイル(名前はこのまま)が必要です。 マニフェスト ファイルはアプリに関する重要な情報を Android システムに提示します。これは、システムがアプリのコードを実行する前に必要な情報です。 その他、マニフェスト ファイルでは次のことを行います。
次の図は、マニフェスト ファイルの一般的な構造とファイルに含むことができるすべてのエレメントを示します。 各エレメントとそれぞれの属性はすべて別のファイルに記述されます。 エレメントの詳細を見るには、図中、図の下にあるアルファベット順のエレメント一覧、またはその他の説明文に表示されているエレメント名をクリックしてください。
<?xml version="1.0" encoding="utf-8"?> <manifest> <uses-permission /> <permission /> <permission-tree /> <permission-group /> <instrumentation /> <uses-sdk /> <uses-configuration /> <uses-feature /> <supports-screens /> <compatible-screens /> <supports-gl-texture /> <application> <activity> <intent-filter> <action /> <category /> <data /> </intent-filter> <meta-data /> </activity> <activity-alias> <intent-filter> . . . </intent-filter> <meta-data /> </activity-alias> <service> <intent-filter> . . . </intent-filter> <meta-data/> </service> <receiver> <intent-filter> . . . </intent-filter> <meta-data /> </receiver> <provider> <grant-uri-permission /> <meta-data /> <path-permission /> </provider> <uses-library /> </application> </manifest>
以下は、マニフェスト ファイルに含むことができるすべてのエレメントをアルファベット順に並べたものです。 使用が許可されているのはこれらのエレメントのみです。独自のエレメントや属性は追加できません。
<action>
<activity>
<activity-alias>
<application>
<category>
<data>
<grant-uri-permission>
<instrumentation>
<intent-filter>
<manifest>
<meta-data>
<permission>
<permission-group>
<permission-tree>
<provider>
<receiver>
<service>
<supports-screens>
<uses-configuration>
<uses-feature>
<uses-library>
<uses-permission>
<uses-sdk>
マニフェスト ファイルに含まれるエレメントと属性には、通常、次の規則とルールが適用されます。
<manifest>
と <application>
のみです。両方のエレメントを提示する必要があり、使用できるのはそれぞれ 1 回のみです。
その他のほとんどのエレメントは、複数回使ってもまったく使わなくてもかまいませんが、意味のあるマニフェストを行うにはいくつかのエレメントが必要です。
内容のあるエレメントには他のエレメントが含まれているためです。すべての値は属性によって設定され、エレメント内に文字データが設定されることはありません。
同じレベルにあるエレメントに順番はありません。たとえば、<activity>
や <provider>
、<service>
エレメントは、どのような順で並べてもかまいません。
(<activity-alias>
エレメントは例外となります。
エイリアスとなっている <activity>
のすぐ後に記述する必要があります)。
ルートの <manifest>
エレメントの属性の一部を除き、すべての属性名は {@code android:} 接頭辞で始まります(例: {@code android:alwaysRetainTaskState})。
この接頭辞は共通であるため、ドキュメントで属性が名前で参照されている場合は通常省略されます。
<application>
エレメント)とその主要なコンポーネントであるアクティビティ(<activity>
)、サービス(<service>
)、ブロードキャスト レシーバー(<receiver>
)やコンテンツ プロバイダ(<provider>
)が含まれます。
サブクラスを定義する場合は、コンポーネント クラス({@link android.app.Activity}、{@link android.app.Service}、{@link android.content.BroadcastReceiver}、{@link android.content.ContentProvider})でいつも行うように、サブクラスは {@code name} 属性で宣言されます。 この名前には、完全なパッケージ名を含む必要があります。 たとえば、{@link android.app.Service} サブクラスの宣言は以下のようになります。
<manifest . . . > <application . . . > <service android:name="com.example.project.SecretService" . . . > . . . </service> . . . </application> </manifest>
ただし、簡素化する方法として、文字列の最初の文字がピリオドの場合、文字列はアプリケーションのパッケージ名に付加されます(<manifest>
エレメントの package
属性によって指定されるため)。
以下は、上記のものと同じ内容です。
<manifest package="com.example.project" . . . > <application . . . > <service android:name=".SecretService" . . . > . . . </service> . . . </application> </manifest>
コンポーネントの開始時に、Android は名前が指定されたサブクラスのインスタンスを作成します。サブクラスが指定されていない場合は、基底クラスのインスタンスを作成します。
<intent-filter . . . > <action android:name="android.intent.action.EDIT" /> <action android:name="android.intent.action.INSERT" /> <action android:name="android.intent.action.DELETE" /> . . . </intent-filter>
{@code @[package:]type:name}
リソースがアプリケーションと同じパッケージ内にある場合は package 名を省略できます。type はリソースのタイプ(「string」や「drawable」など)、name は特定のリソースの名前です。 次に例を示します。
<activity android:icon="@drawable/smallPic" . . . >
テーマからの値も同様の方法で表記されますが、冒頭は '{@code @}' ではなく '{@code ?}' となります。
{@code ?[package:]type:name}
以下のセクションでは、Android の機能がどのようにマニフェスト ファイルに反映されるのかを説明します。
アプリケーションのコア コンポーネント(アクティビティ、サービス、ブロードキャスト レシーバー)はインテントによって開始されます。 インテントとは、目的とするアクションを記述している情報の束({@link android.content.Intent} オブジェクト)で、使用されるデータやアクションを実行するコンポーネントのカテゴリ、その他の関連する指示を含みます。 Android は、インテントに対応する適切なコンポーネントを捜し出し、必要に応じて新しいインスタンスを起動し、それにインテント オブジェクトを渡します。
コンポーネントはインテント フィルタを使ってその機能(対応できるインテントの種類)を通知します。
Android システムはコンポーネントを起動する前にコンポーネントが対応できるインテントを知っておく必要があるため、インテント フィルタはマニフェスト ファイルの <intent-filter>
エレメントで指定されます。
コンポーネントは、それぞれが異なる機能を記述しているフィルタをいくつでも持つことができます。
対象となるコンポーネントの名前を明示的に指定しているインテントは、コンポーネントを起動します。この場合、フィルタは適用されません。 対象の名前が指定されていない場合は、コンポーネントのフィルタを通過したインテントのみがコンポーネントを起動できます。
インテント フィルタに対してインテント オブジェクトをテストする方法については、「インテントとインテント フィルタ」ドキュメントをご覧ください。
エレメントは、小さなアイコンやテキスト ラベルをユーザーに表示するために、{@code icon} と {@code label} 属性を持つ場合があります。
画面に長い説明文を表示するための {@code description} 属性を持つエレメントもあります。
たとえば、<permission>
エレメントはこれらすべての属性を持っています。これによって、アプリケーションがユーザーにパーミッションを付与するかどうかを尋ねる際に、ユーザーに対して、パーミッションを示すアイコン、パーミッションの名前、パーミッションについての説明文を提示できます。
どの場合においても、属性を含むエレメントに設定されたアイコンとラベルが、そのすべてのサブエレメントの {@code icon} と {@code label} のデフォルト設定となります。
そのため、<application>
エレメントに設定されたアイコンとラベルは、アプリケーションの各コンポーネントのデフォルトのアイコンとラベルとなります。
同様に、コンポーネントに設定されたアイコンとラベルは、— <activity>
エレメントのように — それぞれのコンポーネントの <intent-filter>
エレメントのデフォルト設定となります。
<application>
エレメントにラベルを設定し、アクティビティとそのインテント フィルタに設定しない場合は、アプリケーション ラベルはアクティビティとインテント フィルタの両方のラベルとして取り扱われます。
インテント フィルタに設定されるアイコンとラベルは、コンポーネントがユーザーに対して提示されるときはいつでも、そのフィルタにより通知されている機能を提供するコンポーネントを示すために使用されます。 たとえば、「{@code android.intent.action.MAIN}」と「{@code android.intent.category.LAUNCHER}」が設定されているフィルタは、アプリケーションを起動するアクティビティを通知しています — つまり、アプリケーション ランチャーに表示されるということです。 そのため、このフィルタに設定されているアイコンとラベルがランチャーに表示されるものとなります。
パーミッションは、コードの一部や端末上のデータへのアクセスを制限する機能を提供します。 誤用や悪用によってユーザーの利用を妨げたり有害な作用をもたらす恐れのある重要なデータやコードを保護したりするための制限を設定します。
それぞれのパーミッションは一意のラベルで識別されています。通常、ラベルは制限されるアクションを示します。 以下は、Android により定義されているパーミッションの例です。
{@code android.permission.CALL_EMERGENCY_NUMBERS}
{@code android.permission.READ_OWNER_DATA}
{@code android.permission.SET_WALLPAPER}
{@code android.permission.DEVICE_POWER}
1 つの機能は、1 つのパーミッションでのみ保護できます。
アプリケーションがパーミッションにより保護されている機能へのアクセスを必要としている場合は、<uses-permission>
エレメントをマニフェスト ファイルに記述し、そのパーミッションが必要であることを宣言する必要があります。
これによって、アプリケーションが端末にインストールされた際に、インストーラーは、アプリケーションの証明書に署名した関係機関を確認し、場合によってはユーザーに尋ねることで、要求されたパーミッションを付与するかどうかを決定します。
パーミッションが付与されると、アプリケーションは保護された機能を使用できるようになります。
パーミッションが付与されなかった場合は、アプリケーションは機能にアクセスできず、ユーザーに通知が表示されることもありません。
アプリケーションは、パーミッションを使って自身のコンポーネント(アクティビティ、サービス、ブロードキャスト レシーバー、コンテンツ プロバイダ)を保護することもできます。
Android により定義されているパーミッション({@link android.Manifest.permission android.Manifest.permission} に記載)や他のアプリケーションにより宣言されたパーミッションであればどれでも使用できます。
独自のパーミッションを定義することもできます。新しいパーミッションは、<permission>
エレメントを使って宣言します。
たとえば、次のようにアクティビティを保護できます。
<manifest . . . > <permission android:name="com.example.project.DEBIT_ACCT" . . . /> <uses-permission android:name="com.example.project.DEBIT_ACCT" /> . . . <application . . .> <activity android:name="com.example.project.FreneticActivity" android:permission="com.example.project.DEBIT_ACCT" . . . > . . . </activity> </application> </manifest>
この例では、{@code DEBIT_ACCT} パーミッションは <permission>
エレメントで宣言されているだけではなく、その使用が <uses-permission>
エレメントで要求されている点に注意してください。
アプリケーション自身によって保護が設定されている場合でも、アプリケーションの他のコンポーネントが保護されたアクティビティを起動するために、その使用を要求する必要があります。
同じ例で、別の場所で宣言されたパーミッションに {@code permission} 属性が設定されている場合({@code android.permission.CALL_EMERGENCY_NUMBERS} など)は、<permission>
エレメントを使って再度宣言する必要があります。
その場合も <uses-permission>
でその使用を要求する必要があります。
<permission-tree>
エレメントは、コードに定義されるパーミッションの集まりに対するネームスペースを宣言します。
<permission-group>
エレメントは、パーミッションのセットに対するラベル(マニフェスト ファイルに <permission>
エレメントを使って宣言されたもの、その他の場所で宣言されたものの両方)を定義します。
これは、ユーザーに提示される際のパーミッションのグループ分けのみに影響します。
<permission-group>
エレメントでは、パーミッションのグループへの所属は指定されません。グループ名のみが指定されます。
パーミッションは、<permission>
エレメントの permissionGroup
属性にグループ名を割り当てることによって、グループに配置されます。
すべてのアプリケーションはデフォルトの Android ライブラリにリンクされています。このライブラリには、Activity、Service、Intent、View、Button、Application、ContentProvider などの共通クラスを含む、アプリケーションをビルドするための基本パッケージが含まれています。
しかし、独自のライブラリに含まれているパッケージもあります。開発中のアプリケーションがこれらのパッケージのコードを使用している場合は、該当するライブラリにリンクするよう明示的に求める必要があります。
この場合は、マニフェスト ファイルに各ライブラリを指定する <uses-library>
エレメントが別途含まれている必要があります。
(ライブラリ名は該当するパッケージのドキュメントに記載されています)。