AndroidManifest.xml は、そのコンポーネント、パーミッション、メタデータを記述する、すべての Android アプリケーションに必須の構成ファイルです。Android システムは、各アプリをインストールおよび起動する際にこのファイルを読み取ります。Android Developers, 2025によると、正しいマニフェストがなければ、アプリはデバイスにインストールされません。AndroidManifest.xmlは、オペレーティングシステムに Activity、Service、BroadcastReceiver、ContentProvider を登録します。
まとめ
AndroidManifest.xmlは、すべての Android プロジェクトが app/src/main ディレクトリに持つ必須の、XML形式のルート構成ファイルです。Android システムは、アプリコードを実行する前に——インストール時の APK 解析中に——これを解析します。マニフェストに構文エラーがあったり、必須の宣言がなかったりすると、インストールはエラーメッセージを表示して中断されます。
このファイルには、アプリの完全な宣言が含まれています:すべてのコンポーネント(Activity、Service、BroadcastReceiver、ContentProvider)のリスト、リクエストされたパーミッション、最低 SDK バージョン、ハードウェア要件、およびテーマとスタイルの設定です。システムや他のアプリから呼び出すことができるすべてのコンポーネントは、マニフェストで明確に宣言される必要があります。これはセキュリティの要件です:明確な宣言がなければ、コンポーネントは呼び出すことができません。
正しく構成されたマニフェストがなければ、Google Playやサイドローディングを通じてアプリをインストールすることはできません。システムは APK 解析時にマニフェストをチェックし、エラーがあればインストールを拒否します。Google Play また、不安全な構成を検出するためにマニフェストをスキャンします:intent-filter のないコンポーネントで exported=true の場合に警告が発行され、targetSdk 34+ の必須パーミッションが不足している場合はパブリッシングがブロックされます。したがって、マニフェスト構造を理解することは、Android ディベロッパーにとって必須のスキルです。
すべての Android アプリコンポーネントは、マニフェストで明確に登録する必要があります。これは、4つのコンポーネントすべてに対するプラットフォームの必須要件です。登録がなければ、コンポーネントはシステムによって作成されず、それを起動しようとすると ActivityNotFoundException または類似の例外が発生します。コンポーネントは application タグ内に、動作に影響しない順番で登録されます。
activity タグは、アプリの画面を登録します。exported 属性は、他のアプリがこの Activity を起動できるかどうかを決定します。Android 12より以降、intent-filter がある場合に exported がないと、ビルドエラーが発生します——これはセキュリティの要件です。エントリポイントは、action MAIN と category LAUNCHER を持つ intent-filter を通じて設定されます。各 Activity には、フルまたは相対クラス名に一致するユニークな android:name が必要です。
<activity
android:name=".MainActivity"
android:exported="true"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
service タグは、バックグラウンドサービスを定義します。Android 8より以降、バックグラウンドサービスには厳密な制限があります:フォアグラウンドサービスにはアイコン付きのユーザーに表示される必須の通知が必要であり、bound サービスはクライアントが結合されている間だけ存続します。通知なしでバックグラウンドで実行されるサービスは、アプリがバックグラウンドに移行してから数分以内にシステムによって自動的に終了させられます。長時間のタスクには、Service の代わりに WorkManager を使用してください。
<service
android:name=".SyncService"
android:exported="false"
android:foregroundServiceType="dataSync" />
receiver タグは、システムまたはカスタムのブロードキャストメッセージを受け取るレシーバーを宣言します。Android 8より以降、多くの暗黙的なブロードキャストは、マニフェストで静的に宣言されたレシーバーには届けられなくなりました。代わりに、コード内で Context.registerReceiver を通じてダイナミックにレシーバーを登録することが推奨されます。例外には、BOOT_COMPLETED などのいくつかのシステムブロードキャストが含まれ、これらは侊然としてマニフェストでの静的な登録が必要です。
<receiver
android:name=".ConnectivityReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
Android の毎一つの危険なパーミッションには、uses-permission タグを通じてマニフェストでの宣言が必要です。Android 6より以降、危険なパーミッションはユーザーダイアログを通じてランタイムにリクエストされますが、マニフェストでの宣言は必須のままです。それがなければ、requestPermissions メソッドは SecurityException をスローーします。INTERNET や ACCESS_NETWORK_STATE などの正常レベルのパーミッションは、インストール時に自動的に許可されます。
| パーミッション | 目的 |
|---|---|
| CAMERA | 写真や動画のためのデバイスカメラへのアクセス |
| ACCESS_FINE_LOCATION | GPS とネットワークによる精確な地理位置情報 |
| RECORD_AUDIO | デバイスマイクからの音声録音 |
| READ_CONTACTS | 電話丈にある連絡先の読み取り |
| POST_NOTIFICATIONS | Android 13+ での通知の送信 |
uses-permission-sdk-23 タグは、Android 6.0+ でのみ必要なパーミッションを指定します。これにより、存在しないパーミッションをリクエストせずに、古いバージョンとの互換性を維持できます。例えば、POST_NOTIFICATIONS は Android 13+ でのみ利用可能なため、古いデバイスで不明なパーミッションエラーを避けるために uses-permission-sdk-33 を通じて指定する必要があります。uses-permission の maxSdkVersion 属性は、新しい Android バージョンにアプリを更新する際に、不要なパーミッションを自動的に取り消すことができます。
正常レベルのパーミッション(INTERNET、ACCESS_NETWORK_STATE)は、インストール時に自動的に許可され、ランタイムリクエストは不要です。これらも uses-permission を通じて宣言されますが、ユーザーにダイアログで表示されることはありません。他のアプリケーションからのアプリコンポーネントへのアクセスを制御するために、パーミッション保護コンポーネント機構が使用されます:Activity または Service レベルでカスタムパーミッションを指定でき、コンポーネントが外部から呼ばれたときにシステムが確認します。これにより、プロセス間通信に対する追加のセキュリティレイヤーが提供されます。
マニフェストの intent-filter タグは、コンポーネントが処理できる暗黙的なインテントを宣言します。これは、Android がシステムまたはカスタムのアクションをアプリに結び付ける機構です。インテントフィルターは、3つの要素から構成されます:アクション、カテゴリ、データです。これら3つを組み合せて、コンポーネントが受け取るべきインテントを正確に記述できます。システムは、もっとも特定的なフィルターに基づいて適切なコンポーネントを選択します。
<activity android:name=".DeepLinkActivity">
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="https"
android:host="itsectr.com"
android:pathPrefix="/app" />
</intent-filter>
</activity>
autoVerify 属性は、Android App Links の検証を有効にします:システムがサーバーに連絡してドメインの所有を確認します。検証がない場合、ディープリンクは標準の選択ダイアログを通じて動作し、ユーザーがリンクを開くアプリを選択します。検証が成功すると、リンクはダイアログなしで直接アプリで開きます。Google Search Console も autoVerify を使用して、ディープリンクをインデックスし、検索結果に表示します。
action.VIEW および DEFAULT および BROWSABLE カテゴリを持つフィルターは、ブラウザ、メール、他のアプリからのリンクを処理します。これは、Android でディープリンクを実装するための主な機構です。myapp:// などのカスタム URL スキームをサポートするには、ホストなしでスキームだけを指定すればよいですけど、Google ではカスタムスキームよりも HTTPS ディープリンクを推奨しています。その理由は、よりセキュアで追加のパーミッションが不要だからです。カスタムスキームは、同じスキームを登録している任意のアプリによってインターセプトされる可能性があります。
ルートの manifest タグには、パッケージ、バージョン、SDK の属性が含まれます。application タグには、テーマ、アイコン、ラベル、デバッグフラグなどのグローバル設定が保管されます。manifest の属性はパッケージレベルでのバージョニングを定義し、application の属性はアプリの全体的な外観と動作を決定します。値は、@-構文を使ったリソース参照か、文字列リテラルになります。
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.itsectr.myapp"
<uses-sdk
android:minSdkVersion="24"
android:targetSdkVersion="34" />
<application
android:label="MyApp"
android:icon="@mipmap/ic_launcher"
android:theme="@style/Theme.MyApp"
android:supportsRtl="true"
android:allowBackup="true">
<!-- アプリのコンポーネント -->
</application>
</manifest>
application 内の meta-data タグは、任意のキーバリュー組を保管することができます。これは、サードパーティライブラリの構成に便利です:API キー、エンドポイント URL、機能フラグなどです。meta-data からのデータは、ランタイムに PackageManager.getApplicationInfo().metaData を通じてアクセスできます。例えば、Firebase や Google Maps は、ソースコードにハードコーディングせずにアクセスキーを渡すために meta-data を使用します。代わりに、キーはマニフェストで設定され、ビルドフレーバーによって異なる場合があります。
android:extractNativeLibs 属性は、APK からのネイティブライブラリの抽出を制御します。targetSdk 34+ のアプリでは、この属性を明確に指定する必要があります。そうしないと、INSTALL_FAILED_INVALID_APK エラーでビルドが失敗する可能性があります。extractNativeLibs=false の場合、ネイティブライブラリは APK 内にそのまま残り、アンパックされず、インストールされたアプリのサイズを減らしますが、ライブラリのロード時間が増えます。もっともの現代的なアプリでは、ユーザーのデバイスのディスク空間を削減するために、extractNativeLibs=false が推奨されます。
android:networkSecurityConfig 属性は、ネットワークセキュリティ構成ファイルを指定できます。これは targetSdk 28+ のアプリに特に重要で、デフォルトでは HTTP トラフィックがブロックされます。構成ファイルは、信頼する証明書、HTTP接続のためのドメイン、証明書ピンニングルールを定義します。これは、古い android:usesCleartextTraffic 属性に代わるもので、OS レベルでの接続セキュリティ管理のためのより柔軟な機構を提供します。
android:largeHeap 属性は、アプリに対して拡張されたヒープサイズをリクエストします。デフォルトでは、Android は各アプリに、デバイスと OS バージョンに依存する制限されたメモリを割り当てます。アプリが重い画像や動画、大きなデータセットを扱う場合、largeHeap は OutOfMemoryError を防ぐことができます。ただし、この属性を惡用すると害があります:メモリ消費の多いアプリは、リソースが不足しているときにシステムによってより早く終了させられます。largeHeap は、プロファイリングと必要性の確認を行った後にのみ使用してください。
よくある質問
Android 12より以降、intent-filter がある場合に exported 属性がないと、ビルドエラーが発生します。システムは intent-filter を持つすべてのコンポーネントに明確な可視性を要求します——これは、他のアプリへのコンポーネントの不意の露出を防ぐためのセキュリティ温度です。intent-filter のない Activity では、exported はデフォルトで false です。
はい、ただし、ローンチャーには複数のアプリアイコンが表示されます。MAIN/LAUNCHER を持つ各 Activity が独立したエントリポイントになります。これは、アプリの異なるセクションへのショートカットを作成するために使用されます。例えば、設定に直接ジャンプしたり、新しいレコードを作成したりするためです。各アイコンは、対応する Activity を直接開きます。
Android は、ライブラリからのマニフェストを主なアプリのマニフェストと統合します。属性の競合があった場合は、tools:replace または tools:node=“merge” を使用して解決します。この機構は自動的です:Gradle を通じてライブラリを追加すると、そのマニフェストが主なものと統合されます。ライブラリからの属性をオーバーライドまたは置き換えるには、tools:node=“remove” または tools:replace=“attributeName” を使用します。
主な理由:パーミッションが uses-permission を通じてマニフェストで宣言されていない、正常レベルのパーミッションである(ランタイムリクエストが不要)、ユーザーが“再び質問しない”を選択してパーミッションが永久的に拒否されている、または targetSdkVersion が 23 未満で、パーミッションがインストール時にリクエストされる場合です。診断には、マニフェストと adb logcat を確認してください。
android:debuggable 属性は、ADB を通じたアプリのデバッグを有効にします。Google Play でのリリースビルドでは、これは false である必要があります。リリースビルドで debuggable=true の場合、攻撃者が ADB を通じてアプリに接続し、データを読み取り、任意のコードを実行することができます。Google Play は、debuggable=true のビルドのパブリッシングを自動的にブロックします。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。