The Android Developer Challenge is back! Submit your idea before December 2.

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

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

特に、マニフェスト ファイルでは次の情報を宣言する必要があります。

  • アプリのパッケージ名。通常は、コードの名前空間と一致します。 Android ビルドツールは、プロジェクトをビルドするときに、これを使用してコード エンティティの場所を特定します。 アプリをパッケージ化する際に、ビルドツールはこの値を Gradle ビルドファイル内のアプリケーション ID に置き換えます。これが、システムと Google Play で一意のアプリ識別子として使用されます。 パッケージ名とアプリケーション ID の詳細をご覧ください
  • アプリのコンポーネント(すべてのアクティビティ、サービス、ブロードキャスト レシーバ、コンテンツ プロバイダ)。 各コンポーネントでは、Kotlin クラスや Java クラスの名前など、基本的なプロパティを定義する必要があります。 また、処理できる端末設定や、コンポーネントの開始方法を記述したインテント フィルタなど、機能を宣言することもできます。 アプリのコンポーネントの詳細をご覧ください
  • システムや他のアプリの保護された部分にアクセスするためにアプリが必要とするパーミッション。 また、他のアプリがこのアプリのコンテンツにアクセスする場合に必要なパーミッションも宣言します。 パーミッションの詳細をご覧ください
  • アプリが必要とするハードウェア機能やソフトウェア機能。これは、どの端末でこのアプリを Google Play からインストールできるかに影響します。 端末の互換性の詳細をご覧ください

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

ファイルの特徴

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

パッケージ名とアプリケーション ID

マニフェスト ファイルのルート要素には、アプリのパッケージ名に関する属性が必要です(通常は、プロジェクトのディレクトリ構造、つまり Java 名前空間と一致します)。

たとえば、次のスニペットは、パッケージ名 "com.example.myapp" が指定されたルートの <manifest> 要素を示しています。

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

アプリを最終的なアプリ パッケージ(APK)としてビルドする際、Android ビルドツールは package 属性を次の 2 つのことに使用します。

  • アプリが生成する R.java クラス(アプリリソースへのアクセスに使用される)の名前空間としてこの名前を適用します。

    例:上のマニフェストの場合、R クラスは com.example.myapp.R に作成されます。

  • マニフェスト ファイルで宣言された相対クラス名を解決するために、この名前を使用します。

    例:上のマニフェストの場合、<activity android:name=".MainActivity"> として宣言されたアクティビティは com.example.myapp.MainActivity に解決されます。

そのため、マニフェストの package 属性で指定する名前は常に、アクティビティや他のアプリコードを保持する、プロジェクトのベース パッケージ名と一致している必要があります。 他のサブパッケージをプロジェクトに含めることもできますが、それらのファイルでは、package 属性の名前空間を使用して R.java クラスをインポートする必要があります。

ただし、APK をコンパイルすると、package 属性がアプリのユニバーサルに一意なアプリケーション ID にもなることに注意してください。 ビルドツールは package 名に基づいて前述のタスクを実行した後、package の値を、プロジェクトの build.gradle ファイル(Android Studio プロジェクトで使用される)内の applicationId プロパティに指定された値に置き換えます。 package 属性のこの最終的な値は、システムと Google Play でアプリを確実に識別するための唯一の手段となります。そのため、ユニバーサルに一意である必要があります。

マニフェスト内の package 名と build.gradle ファイル内の applicationId の違いは少しわかりにくいことがあります。 しかし、両方を同じにしておけば、心配することは何もありません。

ただし、コードの名前空間(つまり、マニフェスト内の package 名)をビルドファイル内の applicationId とは異なる値にする場合は、必ず、アプリケーション ID の設定に伴う影響を十分に理解しておいてください。 リンク先のページでは、ビルドファイルの applicationId に関係なく、マニフェストの package 名を安全に調整する方法や、個々のビルド設定についてアプリケーション ID を変更する方法を解説しています。

アプリのコンポーネント

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

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

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

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

ただし、name 値の最初の文字がピリオドである場合、アプリのパッケージ名(<manifest> 要素の package 属性で指定したもの)が名前の先頭に追加されます。 たとえば、次のアクティビティ名は `"com.example.myapp.MainActivity"` に解決されます。

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

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

インテント フィルタ

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

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

アプリのコンポーネントには、それぞれにそのコンポーネントの異なる機能を記述したインテント フィルタを <intent-filter> 要素でいくつでも定義することができます。

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

アイコンとラベル

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

どの場合でも、親要素で設定されたアイコンとラベルがすべての子要素の iconlabel のデフォルト値になります。 たとえば、<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.Manifest.permission に記載されている、Android で定義されている任意のパーミッションを使用することも、別のアプリで宣言されているパーミッションを使用することもできます。 アプリで独自のパーミッションを定義することもできます。 新しいパーミッションは、<permission> 要素で宣言します。

詳細については、パーミッションの概要をご覧ください。

端末の互換性

マニフェスト ファイルでは、アプリが必要とするハードウェア機能やソフトウェア機能のタイプ、つまり、アプリが互換性を持つ端末のタイプを宣言することもできます。 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 の値を指定する必要があります。

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

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

    // Specifies the API level used to test the app.
    targetSdkVersion 28

    ...
  }
}

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

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

ファイルの規則

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

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

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

通常、同じレベルにある要素に順番はありません。 たとえば、<activity><provider><service> の各要素を任意の順番で指定できます。 このルールには 2 つの重要な例外があります。

属性
技術的には、属性はすべて省略可能です。 ただし、要素がその目的を達成するためには、指定しなければならない属性が多数あります。 真の意味で省略可能な属性については、リファレンス ドキュメントにデフォルト値を記載しています。

ルートの <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> コンテンツ プロバイダ コンポーネントを宣言します。
<receiver> ブロードキャスト レシーバ コンポーネントを宣言します。
<service> サービス コンポーネントを宣言します。
<supports-gl-texture> アプリがサポートする GL テクスチャ圧縮フォーマットを 1 つ宣言します。
<supports-screens> アプリがサポートする画面サイズを宣言し、アプリがサポートするものより大きい画面については画面互換性モードを有効にします。
<uses-configuration> アプリが必要とする特定の入力機能を指定します。
<uses-feature> アプリで使用するハードウェア機能またはソフトウェア機能を 1 つ宣言します。
<uses-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"
    package="com.example.myapp">

    <!-- 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 upon the package attribute -->
        <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>