アプリ マニフェストの概要

すべてのアプリ プロジェクトでは、プロジェクト ソースセットのルートに AndroidManifest.xml ファイルを正確にこの名前で配置する必要があります。マニフェスト ファイルは、アプリに関する重要な情報を Android ビルドツール、Android オペレーティング システム、Google Play に提供します。

マニフェスト ファイルで宣言する必要があるものの中では、特に以下が重要です。

  • アプリのコンポーネント。すべてのアクティビティ、サービス、ブロードキャスト レシーバ、コンテンツ プロバイダが含まれます。各コンポーネントでは、Kotlin クラスまたは Java クラスの名前などの基本的なプロパティを定義する必要があります。また、処理できるデバイス設定などの機能と、コンポーネントを開始する方法を記述するインテント フィルタも宣言できます。アプリ コンポーネントの詳細については、次のセクションをご覧ください。
  • システムまたは他のアプリの保護された部分にアクセスするためにアプリが必要とする権限。また、このアプリのコンテンツにアクセスするために他のアプリに必要とされる権限も宣言します。次のセクションの権限の詳細をご確認ください
  • アプリが必要とするハードウェア機能とソフトウェア機能。これは、どのデバイスで Google Play からこのアプリをインストールできるかに影響します。次のセクションのデバイスの互換性の詳細をご確認ください

Android Studio を使用してアプリをビルドすると、マニフェスト ファイルは自動的に作成されます。主要なマニフェスト要素のほとんどは、(コード テンプレートを使用する場合は特に)アプリのビルド時に追加されます。

ファイルの機能

これ以降のセクションでは、アプリの最も重要な特性の一部がマニフェスト ファイルにどのように反映されるかについて説明します。

アプリ コンポーネント

アプリ内に作成するアプリ コンポーネントごとに、対応する次の XML 要素をマニフェスト ファイルで宣言します。

マニフェスト ファイルで宣言せずにこれらのコンポーネントをサブクラス化した場合、システムはそのコンポーネントを開始できません。

完全なパッケージ指定を使用し、name 属性でサブクラスの名前を指定します。たとえば、Activity サブクラスは次のように宣言します。

<manifest ... >
    <application ... >
        <activity android:name="com.example.myapp.MainActivity" ... >
        </activity>
    </application>
</manifest>

ただし、name 値の最初の文字がピリオドである場合は、アプリの名前空間(モジュール レベルの build.gradle ファイルの namespace プロパティで指定)が名前の先頭に付加されます。たとえば、名前空間が "com.example.myapp" の場合、次のアクティビティ名は com.example.myapp.MainActivity に解決されます。

<manifest ... >
    <application ... >
        <activity android:name=".MainActivity" ... >
            ...
        </activity>
    </application>
</manifest>

パッケージ名や名前空間の設定について詳しくは、名前空間を設定するをご覧ください。

アプリ コンポーネントがサブパッケージ内(com.example.myapp.purchases 内など)に存在する場合、name 値では、不足しているサブパッケージ名(".purchases.PayActivity" など)を追加するか、完全修飾されたパッケージ名を使用する必要があります。

インテント フィルタ

アプリのアクティビティ、サービス、ブロードキャスト レシーバは、インテントによってアクティブ化されます。インテントは、実行するアクション(アクションの対象となるデータ、アクションを実行するコンポーネントのカテゴリ、その他の指示を含む)を記述する Intent オブジェクトによって定義されるメッセージです。

アプリがシステムにインテントを発行すると、システムは、各アプリのマニフェスト ファイル内のインテント フィルタ宣言に基づいて、インテントを処理できるアプリ コンポーネントを探します。システムは、一致するコンポーネントのインスタンスを開始し、そのコンポーネントに Intent オブジェクトを渡します。複数のアプリがそのインテントを処理できる場合、ユーザーはどのアプリを使用するかを選択できます。

アプリ コンポーネントには、任意の数のインテント フィルタ(<intent-filter> 要素で定義)を定義できます。各インテント フィルタにはそのコンポーネントの異なる機能を記述します。

詳細については、インテントとインテント フィルタのドキュメントをご覧ください。

アイコンとラベル

多くのマニフェスト要素には icon 属性と label 属性があり、それぞれ対応するアプリ コンポーネントの小さいアイコンとテキストラベルをユーザーに表示します。

いかなる場合でも、親要素で設定されたアイコンとラベルがすべての子要素の icon および label のデフォルト値になります。たとえば、<application> 要素で設定されたアイコンとラベルは、アプリの各コンポーネント(たとえばすべてのアクティビティ)のデフォルトのアイコンとラベルになります。

コンポーネントの <intent-filter> で設定されたアイコンとラベルは、そのコンポーネントがインテントを実行するオプションとしてユーザーに表示されるときに必ず使用されます。デフォルトでは、このアイコンは親コンポーネント(<activity> 要素または <application> 要素)に対して宣言されたアイコンから継承されます。

固有のアクションを提供するインテント フィルタをチューザ ダイアログにわかりやすく表示したい場合は、アイコンを変えることもできます。詳細については、他のアプリからのアクティビティの開始を許可するをご覧ください。

権限

Android アプリは、プライベートなユーザーデータ(連絡先や SMS)または特定のシステム機能(カメラやインターネット アクセス)を利用するための権限をリクエストする必要があります。各権限は一意のラベルで識別されます。たとえば、SMS メッセージを送信する必要があるアプリの場合、マニフェストに次の行を記述する必要があります。

<manifest ... >
    <uses-permission android:name="android.permission.SEND_SMS"/>
    ...
</manifest>

Android 6.0(API レベル 23)以降は、ユーザーが一部のアプリの権限を実行時に承認または拒否できるようになりました。ただし、アプリがサポートする Android バージョンと無関係に、すべての権限リクエストをマニフェストの <uses-permission> 要素で宣言する必要があります。権限が付与された場合、アプリは保護された機能を使用できます。権限が付与されなかった場合、保護された機能にアクセスしようとすると失敗します。

アプリは権限を使用してアプリ自身のコンポーネントを保護することもできます。アプリは、Android で定義されている任意の権限(android.Manifest.permission に記載されています)を使用することも、別のアプリで宣言されている権限を使用することもできます。アプリ自身の権限を定義することもできます。新しい権限は <permission> 要素で宣言します。

詳しくは、Android での権限をご覧ください。

デバイスの互換性

マニフェスト ファイルでは、アプリが必要とするハードウェア機能またはソフトウェア機能のタイプ、つまりアプリが互換性を持つデバイスのタイプを宣言することもできます。Google Play ストアでは、アプリが必要とする機能またはシステム バージョンを備えていないデバイスへのアプリのインストールはできません。

アプリが互換性を持つデバイスを定義するマニフェスト タグはいくつかあります。最も一般的なものを以下に示します。

<uses-feature>

<uses-feature> 要素では、アプリが必要とするハードウェア機能とソフトウェア機能を宣言できます。たとえば、コンパス センサーがないデバイスではアプリの基本機能を実現できない場合、次のマニフェスト タグを指定してコンパス センサーが必須であることを宣言できます。

<manifest ... >
    <uses-feature android:name="android.hardware.sensor.compass"
                  android:required="true" />
    ...
</manifest>

: Chromebook でアプリを使用できるようにしたい場合は、ハードウェア機能とソフトウェア機能に関するいくつかの重要な制限事項を考慮する必要があります。詳細については、Chromebook 向けアプリ マニフェストの互換性をご覧ください。

<uses-sdk>

プラットフォームの後継バージョンには、以前のバージョンで使用できない新しい API が追加されることがよくあります。アプリが互換性を持つ最小バージョンを指定するには、マニフェストに <uses-sdk> タグとその minSdkVersion 属性を含める必要があります。

ただし、<uses-sdk> 要素の属性は、build.gradle ファイル内の対応するプロパティでオーバーライドされることにご注意ください。そのため、Android Studio を使用している場合は、minSdkVersiontargetSdkVersion の値を代わりに指定します。

Groovy

android {
    defaultConfig {
        applicationId 'com.example.myapp'

        // Defines the minimum API level required to run the app.
        minSdkVersion 21

        // Specifies the API level used to test the app.
        targetSdkVersion 33
        ...
    }
}

Kotlin

android {
    defaultConfig {
        applicationId = "com.example.myapp"

        // Defines the minimum API level required to run the app.
        minSdkVersion(21)

        // Specifies the API level used to test the app.
        targetSdkVersion(33)
        ...
    }
}

build.gradle ファイルの詳細については、ビルドを設定する方法をご覧ください。

さまざまなデバイスに対するアプリのサポートを宣言する方法の詳細については、デバイスの互換性の概要をご覧ください。

ファイルの規則

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

要素
必須の要素は <manifest><application> のみです。これらの要素は一度だけ指定します。その他のほとんどの要素は、一度も指定しなくても複数回指定してもかまいません。ただし、マニフェスト ファイルを有用なものにするには、いくつかの要素を指定する必要があります。

すべての値は属性によって設定され、要素内の文字データとしては設定されません。

一般的に、同じレベルにある要素に順序はありません。たとえば、<activity><provider><service> の各要素は任意の順序で配置できます。このルールには 2 つの重要な例外があります。

  • <activity-alias> 要素は <activity> のエイリアスであり、この要素の後に配置する必要があります。
  • <application> 要素は、<manifest> 要素内の最後の要素にする必要があります。
属性
厳密には、属性はすべて省略可能です。ただし、要素の目的を達成するためには指定しなければならない属性が多数あります。本当の意味で省略可能な属性については、リファレンス ドキュメントにデフォルト値が記載されています。

<manifest> ルート要素の一部の属性を除き、すべての属性名は android: 接頭辞で始まります(android:alwaysRetainTaskState など)。この接頭辞は普遍的であるため、通常、ドキュメントで属性を名前で参照する場合は接頭辞を省略します。

複数の値
複数の値を指定できる場合、たいていは 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>
リソースの値
属性の中には、アクティビティのタイトルやアプリのアイコンなど、ユーザーに表示される値を持つものがあります。このような属性の値はユーザーの言語やその他のデバイス設定によって異なることがあるため(デバイスのピクセル密度に基づいて異なるアイコンサイズを提供する場合など)、マニフェスト ファイルにハードコードするのではなく、リソースまたはテーマから値を設定する必要があります。その後、各種のデバイス設定用に提供する代替リソースに基づいて、実際の値を変更できます。

リソースは、次の形式の値として表されます。

"@[package:]type/name"

リソースがアプリによって提供される場合(ライブラリ リソースがアプリのリソースにマージされているため、ライブラリの依存関係によってリソースが提供される場合も含む)、package 名を省略できます。Android フレームワークのリソースを使用したい場合、それ以外の有効なパッケージ名は android のみです。

type はリソースのタイプ(stringdrawable など)です。name は特定のリソースを識別する名前です。次に例を示します。

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

プロジェクトにリソースを追加する方法について詳しくは、アプリリソースの概要をご覧ください。

テーマで定義されている値を代わりに適用する場合は、次のように、最初の文字を @ ではなく ? にする必要があります。

"?[package:]type/name"

文字列の値
属性値が文字列の場合、文字をエスケープするには、二重バックスラッシュ(\\)を使用します。たとえば、改行の場合は \\n、Unicode 文字の場合は \\uxxxx です。

マニフェスト要素のリファレンス

次の表では、AndroidManifest.xml ファイル内のすべての有効な要素についてリファレンス ドキュメントへのリンクを示します。

<action> インテント フィルタにアクションを追加します。
<activity> アクティビティ コンポーネントを宣言します。
<activity-alias> アクティビティのエイリアスを宣言します。
<application> アプリを宣言します。
<category> インテント フィルタにカテゴリ名を追加します。
<compatible-screens> アプリが互換性を持つ個々の画面設定を指定します。
<data> インテント フィルタにデータ仕様を追加します。
<grant-uri-permission> 親コンテンツ プロバイダがアクセス権限を持っているアプリデータのサブセットを指定します。
<instrumentation> アプリとシステムのインタラクションをモニタリングできるようにする Instrumentation クラスを宣言します。
<intent-filter> アクティビティ、サービス、ブロードキャスト レシーバが応答できるインテントのタイプを指定します。
<manifest> AndroidManifest.xml ファイルのルート要素。
<meta-data> 親コンポーネントに追加で供給できる任意のデータのアイテムを表す名前と値のペアです。
<path-permission> コンテンツ プロバイダ内のデータの特定のサブセットに対するパスと必須の権限を定義します。
<permission> このアプリまたは他のアプリの特定のコンポーネントまたは機能へのアクセスを制限するために使用できるセキュリティ権限を宣言します。
<permission-group> 関連する権限の論理グループの名前を宣言します。
<permission-tree> 権限のツリーのベース名を宣言します。
<provider> コンテンツ プロバイダ コンポーネントを宣言します。
<queries> アプリがアクセスする予定の、他のアプリのセットを宣言します。詳しくは、パッケージの公開設定のフィルタリングに関するガイドをご覧ください。
<receiver> ブロードキャスト レシーバ コンポーネントを宣言します。
<service> サービス コンポーネントを宣言します。
<supports-gl-texture> アプリがサポートする単一の GL テクスチャ圧縮形式を宣言します。
<supports-screens> アプリがサポートする画面サイズを宣言し、そのサイズより大きい画面に対して画面互換性モードを有効にします。
<uses-configuration> アプリが必要とする特定の入力機能を指定します。
<uses-feature> アプリが使用するハードウェア機能またはソフトウェア機能を 1 つ宣言します。
<uses-library> アプリをリンクする必要がある共有ライブラリを指定します。
<uses-native-library> アプリをリンクする必要があるベンダー提供のネイティブ共有ライブラリを指定します。
<uses-permission> アプリが正常に動作するためにユーザーが付与する必要があるシステム権限を指定します。
<uses-permission-sdk-23> Android 6.0(API レベル 23)以上を搭載したデバイスにアプリがインストールされている場合にのみ、アプリが特定の権限を要求することを指定します。
<uses-sdk> API レベルを示す整数を使用して、アプリが Android プラットフォームの 1 つ以上のバージョンと互換性を持つことを明示できます。

マニフェスト ファイルの例

次の XML は、アプリの 2 つのアクティビティを宣言する単純な AndroidManifest.xml の例です。

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="1"
    android:versionName="1.0">

    <!-- Beware that these values are overridden by the build.gradle file -->
    <uses-sdk android:minSdkVersion="15" android:targetSdkVersion="26" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <!-- This name is resolved to com.example.myapp.MainActivity
             based on the namespace property in the build.gradle file -->
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name=".DisplayMessageActivity"
            android:parentActivityName=".MainActivity" />
    </application>
</manifest>