Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
AndroidManifest.xml: Назначение и структура
Определение
AndroidManifest.xml — это файл конфигурации Android приложения, который описывает структуру приложения, его компоненты, разрешения и требования к системе. Это обязательный файл для каждого Android приложения, находится в android/app/src/main/AndroidManifest.xml.
Это своего рода "паспорт" приложения для ОС Android, где указано, что умеет делать приложение и какие ресурсы ему нужны.
Базовая структура
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<!-- Объявление разрешений (permissions) -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- Требования к оборудованию -->
<uses-feature
android:name="android.hardware.camera"
android:required="true" />
<!-- Приложение и его компоненты -->
<application
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:debuggable="true">
<!-- Activity (экран приложения) -->
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- Service (фоновый сервис) -->
<service
android:name=".services.NotificationService"
android:exported="false" />
<!-- Broadcast Receiver (получатель событий) -->
<receiver
android:name=".receivers.BootCompletedReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<!-- Content Provider (доступ к данным) -->
<provider
android:name=".providers.DataProvider"
android:authorities="com.example.myapp.provider"
android:exported="false" />
</application>
</manifest>
Основные элементы
1. Permissions (Разрешения)
<!-- Объявляем разрешения, которые нужны приложению -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Для Flutter приложения в интеграции с платформой:
// android/app/build.gradle
android {
compileSdkVersion 33 // Указываем target API version
}
2. Activities (Экраны)
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
3. Services (Фоновые процессы)
<service
android:name=".services.LocationService"
android:exported="false"
android:foregroundServiceType="location" />
4. Broadcast Receivers
<receiver
android:name=".receivers.NotificationReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
Практический пример в Flutter проекте
Файл: android/app/src/main/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.flutter_app">
<!-- Разрешения -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- Требования к оборудованию -->
<uses-feature
android:name="android.hardware.location.gps"
android:required="false" />
<!-- Поддержка разных размеров экранов -->
<supports-screens
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="true"
android:xlargeScreens="true" />
<application
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:usesCleartextTraffic="false">
<!-- Flutter Activity -->
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode">
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- Для работы с deep links -->
<activity
android:name=".DeepLinkActivity"
android:exported="true">
<intent-filter>
<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="example.com"
android:path="/invite" />
</intent-filter>
</activity>
</application>
</manifest>
Типичные настройки в Flutter приложениях
1. Интернет доступ
<uses-permission android:name="android.permission.INTERNET" />
2. Камера для video_player или camera пакета
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
3. Геолокация для location пакета
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
4. Работа с файлами
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
5. Cleartext traffic (важно для разработки)
<!-- android/app/src/main/AndroidManifest.xml -->
<application
android:usesCleartextTraffic="true">
<!-- ... -->
</application>
Процесс сборки
# Flutter автоматически обрабатывает AndroidManifest.xml
flutter build apk
# Можно посмотреть финальный manifest после сборки
cat build/app/intermediates/manifest/release/AndroidManifest.xml
Важные моменты
android:exported attribute (API 31+)
<!-- ✅ Правильно: явно указываем видимость -->
<activity android:name=".MainActivity" android:exported="true" />
<service android:name=".MyService" android:exported="false" />
<!-- ❌ Неправильно: без указания exported приложение не скомпилируется на современных версиях -->
<activity android:name=".OldActivity" />
Минимальная версия Android
// android/app/build.gradle
android {
minSdkVersion 21
targetSdkVersion 33
compileSdkVersion 33
}
Заключение
AndroidManifest.xml — это критически важный файл для работы Android приложения. Он:
- Определяет, какие разрешения нужны приложению
- Описывает все компоненты приложения (Activity, Service, Broadcast Receiver)
- Указывает требования к оборудованию и версии ОС
- Содержит важные метаданные для системы Android
В Flutter проекте этот файл находится в android/app/src/main/AndroidManifest.xml и важно понимать его структуру для интеграции с нативным функционалом Android.