page.title=アプリ マニフェスト @jd:body

本書の内容

  1. マニフェスト ファイルの構造
  2. ファイルの規則
  3. ファイルの特徴
    1. インテント フィルタ
    2. アイコンとラベル
    3. パーミッション
    4. ライブラリ

すべてのアプリケーションには、そのルート ディレクトリに 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})。 この接頭辞は共通であるため、ドキュメントで属性が名前で参照されている場合は通常省略されます。

クラス名の宣言
多くのエレメントは Java オブジェクトと一致しています。これらのエレメントには、アプリケーション自体(<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 は名前が指定されたサブクラスのインスタンスを作成します。サブクラスが指定されていない場合は、基底クラスのインスタンスを作成します。

複数の値
1 つ以上の値が指定されている場合は、1 つのエレメントに複数の値が記載されているのではなく、エレメントが繰り返されているケースがほとんどです。 たとえば、インテント フィルタには複数のアクションが記載されている場合があります。
<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}

文字列の値
属性値が文字列で文字をエスケープする場合はダブル バックスラッシュ('{@code \\}')を使う必要があります。たとえば、改行は '{@code \\n}'、Unicode の文字は '{@code \\uxxxx}' となります。

ファイルの特徴

以下のセクションでは、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> エレメントが別途含まれている必要があります。 (ライブラリ名は該当するパッケージのドキュメントに記載されています)。