lightbulb_outline Help shape the future of the Google Play Console, Android Studio, and Firebase. Start survey

アプリ マニフェスト

すべてのアプリには、そのルート ディレクトリに AndroidManifest.xml(ファイル名はこのまま)が必要です。 マニフェスト ファイルはアプリに関する重要な情報を Android システムに提供します。これは、システムがアプリのコードを実行する前に必要な情報です。

その他、マニフェスト ファイルでは次のことを行います。

  • アプリの Java パッケージ名を指定します。パッケージ名は、アプリの一意の識別子としての機能を果たします。
  • アプリのコンポーネント(アプリを構成するアクティビティ、サービス、ブロードキャスト レシーバー、コンテンツ プロバイダ)を記述します。また、各コンポーネントを実行するクラス名を指定し、機能を公開します。扱えるのは、Intent メッセージなどです。Android システムにコンポーネントと起動可能な状態であることを知らせる役目を果たします。
  • アプリのコンポーネントをホストするプロセスを決定づけます。
  • アプリが API の保護された部分にアクセスし、他のアプリとやり取りする際に必要となるパーミッションを宣言します。また、他のアプリがアプリのコンポーネントとやり取りするために必要なパーミッションも宣言します。
  • アプリの実行時にプロファイリングやその他の情報を提供する Instrumentation クラスを記載します。これらの宣言は、アプリの開発時にのみマニフェストに含まれ、アプリの公開前に削除されます。
  • アプリに必要な Android API の最小限のレベルを宣言します。
  • アプリにリンクする必要があるライブラリを記載します。

注: Chromebook 上で実行する Android アプリの準備を進めるにあたり、考慮すべきハードウェアおよびソフトウェア機能の限界があります。詳細は Chromebook 向けアプリ マニフェストの互換性に関するドキュメントをご覧ください。

マニフェスト ファイルの構成

下記のコード スニペットは、マニフェスト ファイルの一般的な構成と使用できるすべての要素を示しています。各要素とその属性はすべて、別ファイルに記述されます。

ヒント: このドキュメント内に記載された要素の詳細情報は、各要素名をクリックするとご覧いただけます。

以下はマニフェスト ファイルの例です。

<?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>

以下は、マニフェスト ファイルに含めることができる全要素をアルファベット順に並べたものです。

注: 使用が許可されているのはこれらの要素のみです。独自の要素や属性は追加できません。

ファイルの規則

このセクションでは、通常、マニフェスト ファイルに含まれる要素と属性に適用される規則や慣例について説明します。

要素
必須の要素は <manifest><application> のみです。両方の要素を記載する必要があり、使用できるのはそれぞれ 1 回のみです。他の要素は複数、あるいはまったく使用しなくてもかまいません。ただし、有用なマニフェスト ファイルにするには、何かしらの要素を使用する必要があります。

また、要素内には別の要素を含めることができます。すべての値は属性によって設定され、要素内に文字データが設定されることはありません。

同じレベルにある要素に順番はありません。たとえば、<activity><provider><service> 要素は、どのような順で並べてもかまいません。この規則には 2 つの重要な例外があります。

  • <activity-alias> 要素は、エイリアスである <activity> の後に続けなくてはなりません。
  • <application> 要素は、<manifest> 要素内の末尾に来なければなりません。つまり、</application> 終了タグは、</manifest> 終了タグの直前に記載しなければなりません。
属性
正式には、すべての属性はオプションです。ただし、要素が目的を達成するために設定しなければならない属性もあります。このドキュメントをガイドとしてお使いください。真の意味でオプションの属性には、デフォルト値または指定がない場合の動作が記述されています。

ルートの <manifest> 要素の属性の一部を除き、すべての属性名は android: 接頭辞で始まります。たとえば、android:alwaysRetainTaskState のようになります。この接頭辞は共通であるため、ドキュメントで属性が名前で参照されている場合は通常省略されます。

クラス名の宣言
多くの要素は Java オブジェクトに対応しています。これらの要素には、アプリ自体(<application> 要素)とその主要なコンポーネントであるアクティビティ(<activity>)、サービス(<service>)、ブロードキャスト レシーバー(<receiver>)やコンテンツ プロバイダ(<provider>)用の要素が含まれます。

サブクラスを定義する場合は、コンポーネント クラス(ActivityServiceBroadcastReceiverContentProvider)で通常行うように、name 属性でサブクラスを宣言します。この名前には、完全なパッケージ名が含まれている必要があります。たとえば、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 は名前が指定されたサブクラスのインスタンスを作成します。サブクラスが指定されていない場合は、基底クラスのインスタンスを作成します。

複数の値
2 つ以上の値を指定する場合は、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>
リソースの値
属性には、ユーザーに対して表示する値を含むものもあります。たとえば、アクティビティのラベルやアイコンです。これらの属性の値は、ローカライズされていなければならず、リソースまたはテーマから設定する必要があります。リソースの値は、以下の形式で記述されます。

@[<i>package</i>:]<i>type</i>/<i>name</i>

リソースがアプリと同じパッケージにある場合には、パッケージ名を省略できます。type は string や drawable などのリソースのタイプで、name は具体的なリソースを特定する名前です。次に例を示します。

<activity android:icon="@drawable/smallPic" . . . >

テーマからの値も同様に記載されますが、最初は @ ではなく ? になります。

?[<i>package</i>:]<i>type</i>/<i>name</i>

文字列の値
属性値が文字列の場合、改行するには \\n、Unicode 文字には \\uxxxx を使うなど、文字をエスケープするにはダブル バックスラッシュ(\\)を使う必要があります。

ファイルの特徴

以下のセクションでは、Android の機能がどのようにマニフェスト ファイルに反映されるのかを説明します。

インテント フィルタ

アプリのコア コンポーネント(アクティビティ、サービス、ブロードキャスト レシーバーなど)はインテントによって開始されます。インテント(Intent オブジェクト)には、期待されるアクションや使用するデータ、アクションを実行するコンポーネントのカテゴリ、その他の関連する指示など、さまざまな情報が含まれます。Android は、インテントに対応可能な適切なコンポーネントを捜し出し、必要に応じて新しいインスタンスを起動し、それに Intent オブジェクトを渡します。

コンポーネントは、対応可能なインテントの種類をインテント フィルタを使って通知します。Android システムはコンポーネントを起動する前にコンポーネントが対応できるインテントを把握しておく必要があるため、インテント フィルタはマニフェスト ファイルの <intent-filter> 要素で指定されます。コンポーネントは、それぞれが異なる機能を記述しているフィルタをいくつでも持つことができます。

対象となるコンポーネント名を明示的に指定しているインテントは、そのコンポーネントを起動します。この場合、フィルタは適用されません。対象となるコンポーネント名が指定されていない場合は、コンポーネントのフィルタを通過したインテントのみがコンポーネントを起動できます。

インテント フィルタに対して Intent オブジェクトをテストする方法の詳細は、インテントとインテント フィルタのドキュメントをご覧ください。

アイコンとラベル

小さなアイコンやテキスト ラベルをユーザーに表示するために、要素に iconlabel 属性を含める場合があります。画面に長い説明文を表示するための description 属性を持つ要素もあります。たとえば、<permission> 要素にはこれらのすべての属性が含まれています。これにより、ユーザーに対してアプリにパーミッションを付与するかどうかを尋ねる際に、パーミッションを示すアイコン、パーミッションの名称、パーミッションに関する説明文を表示できます。

どの場合においても、属性を含む要素に設定されたアイコンとラベルが、そのすべての子要素の iconlabel のデフォルト設定となります。そのため、<application> 要素に設定されたアイコンとラベルは、アプリの各コンポーネントのデフォルトのアイコンとラベルとなります。同様に、コンポーネントに設定されたアイコンとラベル(<activity> 要素など)は、それぞれのコンポーネントの <intent-filter> 要素のデフォルト設定となります。<application> 要素でラベルを設定し、アクティビティとそのインテント フィルタでは設定しない場合、アプリのラベルはアクティビティとインテント フィルタの両方のラベルとして扱われます。

コンポーネントがユーザーに対して提示され、フィルタによって通知された機能を提供するときは必ず、インテント フィルタに設定されたアイコンとラベルによってコンポーネントが表現されます。たとえば、android.intent.action.MAINandroid.intent.category.LAUNCHER が設定されたフィルタは、アプリを起動するアクティビティを通知しています 。つまり、アプリ ランチャーに表示されるということです。よって、このフィルタに設定されているアイコンとラベルがランチャーに表示されるものになります。

パーミッション

パーミッションは、コードの一部や端末上のデータへのアクセスを制限する機能を提供します。誤用や悪用されることでユーザー エクスペリエンスが低下し、悪影響をもたらすおそれのある重要なデータやコードを保護するための制限を設定します。

それぞれのパーミッションは一意のラベルで識別されます。通常、ラベルは制限されるアクションを示します。Android で定義されているパーミッションをいくつか紹介します。

  • android.permission.CALL_EMERGENCY_NUMBERS
  • android.permission.READ_OWNER_DATA
  • android.permission.SET_WALLPAPER
  • android.permission.DEVICE_POWER

1 つのパーミッションで保護できるのは 1 つの機能のみです。

アプリがパーミッションにより保護されている機能へのアクセスを必要としている場合は、<uses-permission> 要素をマニフェスト ファイルに記述し、そのパーミッションが必要であることを宣言する必要があります。アプリが端末にインストールされる際に、インストーラーは、アプリの証明書に署名した機関を確認するか、場合によってはユーザーに確認することで、リクエストされたパーミッションを付与するかどうかを決定します。パーミッションが付与されると、アプリは保護された機能を使用できるようになります。パーミッションが付与されなかった場合は、アプリは機能にアクセスできず、ユーザーに通知が表示されることもありません。

アプリはパーミッションを使って自身のコンポーネントも保護できます。Android で定義されているパーミッション(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>

この例では、DEBIT_ACCT パーミッションは <permission> 要素で宣言されているだけではなく、その使用が <uses-permission> 要素で要求されている点に注意してください。アプリ自身によって保護が設定されている場合でも、そのアプリの他のコンポーネントが保護されたアクティビティを起動するためには、その使用を要求する必要があります。

上記と同じ例で、別の場所で宣言されたパーミッションに permission 属性が設定されている場合(android.permission.CALL_EMERGENCY_NUMBERS など)は、<permission> 要素を使って再度宣言する必要はありません。ただし、その場合も <uses-permission> でその使用を要求する必要はあります。

<permission-tree> 要素はコード内で定義されたパーミッション グループに対して名前空間を宣言し、<permission-group> はパーミッション セットに対してラベルを定義します。両方ともマニフェストまたは他の場所に <permission> 要素で宣言されます。これは、ユーザーに提示される際のパーミッションのグループ分けのみに影響します。<permission-group> 要素はグループに属するパーミッションを指定しませんが、グループに名前を付けます。パーミッションをグループに割り当てるには、<permission> 要素の permissionGroup 属性にグループ名を指定します。

ライブラリ

すべてのアプリはデフォルトの Android ライブラリにリンクされています。このライブラリには、アクティビティ、サービス、インテント、ビュー、ボタン、アプリ、コンテンツ プロバイダなどの共通クラスを含む、アプリを構築するための基本パッケージが含まれています。

ただし、一部のパッケージは独自のライブラリに含まれています。開発中のアプリがこれらのパッケージのコードを使用している場合は、該当するライブラリにリンクするよう明示的に要求する必要があります。この場合は、マニフェスト ファイルにそれぞれのライブラリを指定する各 <uses-library> 要素が含まれている必要があります。ライブラリ名は、パッケージ用のドキュメントでご確認ください。