Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124


The Android Manifest serves as the essential blueprint that defines every aspect of your Android application’s structure, behavior, and system interactions. Understanding how to master the Android Manifest is absolutely crucial for Android developers who want to build robust, secure, and professionally functioning mobile applications that meet modern Android development standards.
The Android Manifest (AndroidManifest.xml) is a comprehensive XML configuration file that provides critical information about your Android app to the Android operating system. Every Android application must include exactly one Android Manifest file located in its root directory. This manifest file acts as the central communication hub where you declare app components, define permissions, specify hardware requirements, set API levels, and establish how your app interacts with the Android system.
The Android Manifest file essentially tells the Android system everything it needs to know about your app: what components it contains, what permissions it requires, what hardware features it uses, which Android versions it supports, and how other apps can interact with it. Without a properly configured Android Manifest, your Android application simply cannot be installed or run on any Android device.
The Android Manifest begins with the <manifest> root element, which serves as the container for all other manifest declarations. This element defines the package name, version information, and XML namespace for your Android application.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.myapp"
android:versionCode="1"
android:versionName="1.0"
android:installLocation="auto"
android:sharedUserId="com.example.shared">
The package attribute in your Android Manifest uniquely identifies your app in the Google Play Store and on Android devices. Version codes help the system manage app updates, while the installation location controls where your app can be installed.
The <uses-sdk> element in your Android Manifest defines the Android API levels your app supports. This crucial configuration determines device compatibility and available platform features.
<uses-sdk
android:minSdkVersion="21"
android:targetSdkVersion="33"
android:maxSdkVersion="34" />
| SDK Attribute | Purpose | Impact on App |
|---|---|---|
| minSdkVersion | Minimum Android version | Defines oldest supported devices |
| targetSdkVersion | Optimized Android version | Determines behavior and permissions |
| maxSdkVersion | Maximum Android version | Limits future compatibility |
The Android Manifest permission system controls access to protected Android features and user data. Understanding permission types and proper declaration is essential for mastering the Android Manifest.
<!-- Network permissions -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- Storage permissions -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<!-- Location permissions -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<!-- Camera and microphone -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- Communication permissions -->
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
Your Android Manifest must account for different permission protection levels that determine how permissions are granted and managed by the Android system.
| Protection Level | Description | Grant Process | Examples |
|---|---|---|---|
| Normal | Low-risk permissions | Automatic at install | INTERNET, ACCESS_NETWORK_STATE |
| Dangerous | High-risk user data access | Runtime user approval | CAMERA, LOCATION, CONTACTS |
| Signature | System or same-signature apps | Automatic for qualified apps | BIND_DEVICE_ADMIN |
| SignatureOrSystem | System apps or same signature | Platform apps only | WRITE_SECURE_SETTINGS |
The Android Manifest uses <uses-feature> elements to declare hardware and software features your app requires or uses. This ensures proper Google Play filtering and device compatibility.
<!-- Required hardware features -->
<uses-feature
android:name="android.hardware.camera"
android:required="true" />
<uses-feature
android:name="android.hardware.camera.autofocus"
android:required="true" />
<uses-feature
android:name="android.hardware.location.gps"
android:required="true" />
<!-- Optional features -->
<uses-feature
android:name="android.hardware.bluetooth"
android:required="false" />
<uses-feature
android:name="android.hardware.nfc"
android:required="false" />
<!-- Software features -->
<uses-feature
android:name="android.software.leanback"
android:required="true" />
<uses-feature
android:name="android.software.live_wallpaper"
android:required="false" />
The <application> element in your Android Manifest serves as the container for all app components and defines global application properties.
<application
android:name=".MyApplication"
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:theme="@style/AppTheme"
android:allowBackup="true"
android:allowClearUserData="true"
android:allowTaskReparenting="false"
android:backupAgent=".MyBackupAgent"
android:debuggable="false"
android:enabled="true"
android:hasCode="true"
android:hardwareAccelerated="true"
android:killAfterRestore="true"
android:largeHeap="false"
android:manageSpaceActivity=".ManageSpaceActivity"
android:persistent="false"
android:restoreAnyVersion="false"
android:supportsRtl="true"
android:taskAffinity=""
android:testOnly="false"
android:usesCleartextTraffic="false"
android:vmSafeMode="false">
| Attribute | Purpose | Values | Impact |
|---|---|---|---|
| android:name | Custom Application class | Class name | Defines app-level initialization |
| android:allowBackup | Enable backup service | true/false | Controls data backup |
| android:hardwareAccelerated | Hardware acceleration | true/false | Improves rendering performance |
| android:largeHeap | Request large heap | true/false | Increases available memory |
| android:usesCleartextTraffic | Allow HTTP traffic | true/false | Network security policy |
Activities represent individual screens in your Android app. Each activity must be declared in the Android Manifest with detailed configuration options.
<activity
android:name=".activities.MainActivity"
android:label="@string/main_activity_title"
android:theme="@style/MainActivityTheme"
android:launchMode="singleTop"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustResize"
android:exported="true"
android:enabled="true"
android:excludeFromRecents="false"
android:finishOnTaskLaunch="false"
android:hardwareAccelerated="true"
android:noHistory="false"
android:parentActivityName=".activities.ParentActivity"
android:process=":remote"
android:taskAffinity="com.example.task"
android:clearTaskOnLaunch="false"
android:alwaysRetainTaskState="false"
android:stateNotNeeded="false"
android:allowTaskReparenting="false"
android:configChanges="orientation|screenSize|keyboardHidden">
<!-- Intent filters -->
<intent-filter android:priority="100">
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="https"
android:host="example.com"
android:pathPrefix="/app" />
</intent-filter>
<!-- Meta-data -->
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activities.ParentActivity" />
</activity>
| Launch Mode | Behavior | Use Case |
|---|---|---|
| standard | New instance every time | Default behavior |
| singleTop | Reuse if at top of stack | Notification activities |
| singleTask | Single instance per task | Main activities |
| singleInstance | Single instance system-wide | Unique global activities |
Services handle long-running operations and background tasks. The Android Manifest must declare all services with appropriate configuration.
<!-- Regular Service -->
<service
android:name=".services.MyService"
android:enabled="true"
android:exported="false"
android:isolatedProcess="false"
android:process=":background"
android:directBootAware="true"
android:foregroundServiceType="location">
<intent-filter>
<action android:name="com.example.MY_SERVICE_ACTION" />
</intent-filter>
</service>
<!-- IntentService -->
<service
android:name=".services.MyIntentService"
android:exported="false" />
<!-- JobIntentService -->
<service
android:name=".services.MyJobIntentService"
android:permission="android.permission.BIND_JOB_SERVICE"
android:exported="false" />
| Service Type | Purpose | Lifecycle | Manifest Requirements |
|---|---|---|---|
| Started Service | Long-running operations | Runs until stopped | Basic service declaration |
| Bound Service | Client-server interface | Bound to components | Intent filters for binding |
| Foreground Service | User-visible operations | High priority | foregroundServiceType attribute |
| JobService | Scheduled background work | System managed | BIND_JOB_SERVICE permission |
Broadcast receivers respond to system-wide broadcast announcements. The Android Manifest can declare receivers for static registration.
<receiver
android:name=".receivers.MyBroadcastReceiver"
android:enabled="true"
android:exported="true"
android:directBootAware="true">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
<action android:name="android.intent.action.PACKAGE_REPLACED" />
<data android:scheme="package" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.BATTERY_LOW" />
<action android:name="android.intent.action.BATTERY_OKAY" />
</intent-filter>
</receiver>
<!-- Alarm receiver -->
<receiver
android:name=".receivers.AlarmReceiver"
android:exported="false" />
<!-- Network state receiver -->
<receiver
android:name=".receivers.NetworkStateReceiver"
android:exported="false">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver>
Content providers manage shared app data and enable data sharing between applications. The Android Manifest must declare providers with proper authorities and permissions.
<provider
android:name=".providers.MyContentProvider"
android:authorities="com.example.myapp.provider"
android:enabled="true"
android:exported="true"
android:grantUriPermissions="true"
android:initOrder="100"
android:multiprocess="false"
android:readPermission="com.example.READ_PROVIDER"
android:writePermission="com.example.WRITE_PROVIDER"
android:directBootAware="true">
<grant-uri-permission android:pathPattern=".*" />
<path-permission
android:path="/sensitive/"
android:readPermission="com.example.READ_SENSITIVE"
android:writePermission="com.example.WRITE_SENSITIVE" />
<meta-data
android:name="provider_metadata"
android:value="some_value" />
</provider>
<!-- File provider for sharing files -->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
Intent filters in your Android Manifest define how components can be invoked by other apps and system components.
<activity android:name=".ShareActivity">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent-filter>
</activity>
| Component | Purpose | Examples |
|---|---|---|
| Action | What the component can do | VIEW, EDIT, SEND, MAIN |
| Category | Additional info about action | DEFAULT, LAUNCHER, BROWSABLE |
| Data | Type of data handled | MIME types, URI schemes, hosts |
The Android Manifest allows you to define custom permissions for protecting your app’s components and data.
<permission
android:name="com.example.myapp.permission.READ_DATA"
android:label="@string/read_data_permission_label"
android:description="@string/read_data_permission_description"
android:protectionLevel="dangerous"
android:permissionGroup="android.permission-group.STORAGE" />
<permission
android:name="com.example.myapp.permission.WRITE_DATA"
android:label="@string/write_data_permission_label"
android:description="@string/write_data_permission_description"
android:protectionLevel="dangerous"
android:permissionGroup="android.permission-group.STORAGE" />
<permission-group
android:name="com.example.myapp.permission-group.DATA"
android:label="@string/data_permission_group_label"
android:description="@string/data_permission_group_description" />
The Android Manifest can specify input configuration requirements for your application.
<uses-configuration
android:reqFiveWayNav="false"
android:reqHardKeyboard="false"
android:reqKeyboardType="qwerty"
android:reqNavigation="nonav"
android:reqTouchScreen="finger" />
Define screen size and density support in your Android Manifest for optimal display across different devices.
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true"
android:requiresSmallestWidthDp="600"
android:compatibleWidthLimitDp="1280"
android:largestWidthLimitDp="1600" />
For precise screen control, the Android Manifest supports compatible-screens declarations.
<compatible-screens>
<screen android:screenSize="small" android:screenDensity="ldpi" />
<screen android:screenSize="small" android:screenDensity="mdpi" />
<screen android:screenSize="small" android:screenDensity="hdpi" />
<screen android:screenSize="small" android:screenDensity="xhdpi" />
<screen android:screenSize="normal" android:screenDensity="ldpi" />
<screen android:screenSize="normal" android:screenDensity="mdpi" />
</compatible-screens>
Properly securing components in your Android Manifest prevents unauthorized access and potential security vulnerabilities.
<!-- Secure activity with custom permission -->
<activity
android:name=".SecureActivity"
android:permission="com.example.SECURE_ACCESS"
android:exported="false" />
<!-- Protected service -->
<service
android:name=".SecureService"
android:permission="android.permission.BIND_JOB_SERVICE"
android:exported="false" />
<!-- Restricted broadcast receiver -->
<receiver
android:name=".SecureReceiver"
android:permission="android.permission.BROADCAST_STICKY"
android:exported="false" />
Modern Android Manifest files should include network security policies to protect data transmission.
<application
android:networkSecurityConfig="@xml/network_security_config"
android:usesCleartextTraffic="false">
Create a corresponding network security configuration file:
<!-- res/xml/network_security_config.xml -->
<network-security-config>
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">secure.example.com</domain>
</domain-config>
<base-config cleartextTrafficPermitted="false">
<trust-anchors>
<certificates src="system"/>
<certificates src="user"/>
</trust-anchors>
</base-config>
</network-security-config>
Configure data backup policies in your Android Manifest to protect user data while maintaining functionality.
<application
android:allowBackup="true"
android:backupAgent=".MyBackupAgent"
android:fullBackupContent="@xml/backup_rules"
android:dataExtractionRules="@xml/data_extraction_rules">
Use build configuration to dynamically modify your Android Manifest content based on build variants.
<application
android:label="${appName}"
android:debuggable="${isDebuggable}">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<data android:scheme="${customScheme}" />
</intent-filter>
</activity>
</application>
Control how the Android Manifest merger handles conflicts between main manifest, library manifests, and build variant manifests.
<application
android:name=".MyApplication"
tools:replace="android:name"
tools:node="merge">
<activity
android:name=".MainActivity"
tools:remove="android:theme" />
</application>
Use Android Studio’s manifest analysis tools to validate your Android Manifest configuration and identify potential issues.
| Error Type | Description | Solution |
|---|---|---|
| Duplicate permissions | Same permission declared multiple times | Remove duplicates |
| Missing components | Referenced but not declared | Add component declarations |
| Invalid attributes | Incorrect attribute values | Verify documentation |
| Merger conflicts | Conflicting declarations | Use merger tools attributes |
Test your Android Manifest configuration across different Android versions and device configurations to ensure compatibility.
// Verify permissions at runtime
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA},
CAMERA_PERMISSION_REQUEST);
}
Optimize component declarations in your Android Manifest to improve app startup time and memory usage.
<application android:largeHeap="false">
<!-- Use specific process names for heavy services -->
<service
android:name=".HeavyProcessingService"
android:process=":background"
android:exported="false" />
<!-- Enable hardware acceleration selectively -->
<activity
android:name=".GraphicsIntensiveActivity"
android:hardwareAccelerated="true" />
</application>
Configure your Android Manifest to optimize resource usage and memory allocation.
<application
android:vmSafeMode="false"
android:hardwareAccelerated="true"
android:largeHeap="false"
android:allowBackup="true">
<!-- Configure activities for optimal memory usage -->
<activity
android:name=".MainActivity"
android:launchMode="singleTop"
android:alwaysRetainTaskState="true" />
</application>
Configure your Android Manifest for Android TV applications with specific requirements and features.
<application android:banner="@drawable/banner">
<activity
android:name=".TvMainActivity"
android:theme="@style/Theme.Leanback">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-feature
android:name="android.software.leanback"
android:required="true" />
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false" />
Configure your Android Manifest for Wear OS applications with wearable-specific declarations.
<uses-feature android:name="android.hardware.type.watch" />
<application>
<meta-data
android:name="com.google.android.wearable.standalone"
android:value="true" />
<activity
android:name=".WearMainActivity"
android:theme="@android:style/Theme.DeviceDefault">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
Configure your Android Manifest for Android Automotive OS applications.
<uses-feature
android:name="android.hardware.type.automotive"
android:required="true" />
<application>
<meta-data
android:name="com.android.automotive"
android:value="true" />
<service
android:name=".CarAppService"
android:exported="true">
<intent-filter>
<action android:name="androidx.car.app.CarAppService" />
</intent-filter>
</service>
</application>
Plan your Android Manifest API level strategy to balance feature availability with device compatibility.
<uses-sdk
android:minSdkVersion="23"
android:targetSdkVersion="34"
android:maxSdkVersion="35" />
<!-- Conditional permissions based on API level -->
<uses-permission
android:name="android.permission.POST_NOTIFICATIONS"
android:maxSdkVersion="32" />
Stay updated with new Android platform features and prepare your Android Manifest for future Android versions.
<!-- Privacy and security enhancements -->
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<uses-permission android:name="android.permission.USE_EXACT_ALARM" />
<!-- New media permissions -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
Mastering the Android Manifest is absolutely essential for creating professional, secure, and well-functioning Android applications. This comprehensive blueprint file controls every aspect of your app’s interaction with the Android operating system, from basic component declarations to complex permission handling, security configurations, and platform-specific optimizations.
Understanding the complete structure of the Android Manifest enables developers to create robust applications that properly integrate with the Android ecosystem. From activity and service declarations to permission management, intent filters, and security policies, every aspect of your Android Manifest contributes to your app’s functionality, security, and user experience.
The Android Manifest serves as more than just a configuration file – it’s the foundation that determines how your app behaves across different Android versions, device types, and usage scenarios. For developers aiming to master not just the manifest but the entire ecosystem, our Android Development Complete Guide provides the full roadmap to building professional Android applications.
By mastering all components of the Android Manifest, from basic declarations to advanced features like custom permissions, network security configurations, and platform-specific optimizations, developers can create applications that meet modern Android development standards while providing excellent user experiences.
Regular review and optimization of your Android Manifest ensures your app remains compatible with evolving Android platform requirements, maintains proper security practices, and delivers optimal performance across the diverse Android ecosystem. The Android Manifest truly represents the complete blueprint of every successful Android application, making comprehensive knowledge of its components and capabilities indispensable for professional Android development.
The Android Manifest is crucial for Android app structure because it defines the complete architecture and organization of your application. This Android app blueprint specifies how Android components interact, what Android permissions are required, and how the Android lifecycle behaves. Without a properly configured Android Manifest, your Android app structure cannot function according to Android development fundamentals requirements.
When Android components are missing from your Android Manifest, the Android system cannot access or instantiate them, causing runtime exceptions. Every activity, service, broadcast receiver, and content provider in your Android app structure must be explicitly declared in the Android Manifest to be available to the system. Missing component declarations violate Android development fundamentals and prevent proper Android app blueprint implementation.
The Android Manifest directly influences the Android lifecycle by defining component lifecycle behavior through launch modes, task affinity, and process configuration. Activity declarations in your Android Manifest control how the Android lifecycle manages component creation, destruction, and state preservation. The manifest configuration affects Android components lifecycle management and determines how your Android app structure handles system-initiated lifecycle events.
All Android permissions that your app requires must be declared in the Android Manifest using <uses-permission> elements. Dangerous Android permissions like camera, location, and storage access require both manifest declaration and runtime user approval. The Android Manifest permission system protects user privacy by controlling access to sensitive device features and data in your Android app blueprint.
In your Android Manifest, these API levels serve different purposes. The minSdkVersion defines the minimum Android version your app supports, determining device compatibility and the oldest Android app versions that can install your application. The targetSdkVersion specifies the Android version your Android app blueprint is optimized for, affecting behavior and permission handling in your Android development fundamentals.