233

After upgrading to android 12, the application is not compiling. It shows

"Manifest merger failed with multiple errors, see logs"

Error showing in Merged manifest:

Merging Errors: Error: android:exported needs to be explicitly specified for . Apps targeting Android 12 and higher are required to specify an explicit value for android:exported when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details. main manifest (this file)

I have set all the activity with android:exported="false". But it is still showing this issue.

My manifest file:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="eu.siacs.conversations">

    <uses-sdk tools:overrideLibrary="net.ypresto.androidtranscoder" />

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />
    <uses-permission android:name="android.permission.READ_PROFILE" />
    <uses-permission
        android:name="android.permission.READ_PHONE_STATE"
        android:maxSdkVersion="22" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

    <uses-feature
        android:name="android.hardware.location"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.location.gps"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.location.network"
        android:required="false" />

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

    <uses-feature
        android:name="android.hardware.camera"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.camera.autofocus"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.microphone"
        android:required="false" />

    <application
        android:name=".Application"
        android:allowBackup="false"
        android:allowClearUserData="true"
        android:appCategory="social"
        android:hardwareAccelerated="true"
        android:icon="@mipmap/ic_app_launch"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:networkSecurityConfig="@xml/network_security_configuration"
        android:requestLegacyExternalStorage="true"
        android:roundIcon="@mipmap/ic_app_launch_round"
        android:theme="@style/ConversationsTheme"
        android:usesCleartextTraffic="true"
        android:windowSoftInputMode="adjustPan|adjustResize"
        tools:replace="android:label"
        tools:targetApi="q">
        <activity
            android:name=".ui.search.GroupSearchActivity"
            android:exported="true" />
        <activity
            android:name=".ui.profileUpdating.FavouritesActivity"
            android:exported="true" />
        <activity
            android:name=".ui.profileUpdating.NameActivity"
            android:exported="true" />
        <activity
            android:name=".ui.CompulsoryUpdateActivity"
            android:exported="true" />
        <activity android:name=".ui.payments.doPayment.DoPaymentActivity"
            android:exported="true" />
        <activity android:name=".ui.individualList.IndividualListActivity"
            android:exported="true" />
        <activity android:name=".ui.payments.setPayment.SetPaymentActivity"
            android:exported="true" />
        <activity android:name=".ui.login.otpActivity.OTPActivity"
            android:exported="true" />
        <activity android:name=".ui.login.loginActivity.LoginActivity"
            android:exported="true" />

        <service android:name=".services.XmppConnectionService" android:exported="true" />

        <receiver android:name=".services.EventReceiver"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
                <action android:name="android.intent.action.ACTION_SHUTDOWN" />
                <action android:name="android.media.RINGER_MODE_CHANGED" />
            </intent-filter>
        </receiver>

        <activity
            android:name=".ui.ShareLocationActivity"
            android:label="@string/title_activity_share_location"
            android:exported="true"/>
        <activity
            android:name=".ui.SearchActivity"
            android:label="@string/search_messages"
            android:exported="true" />
        <activity
            android:name=".ui.RecordingActivity"
            android:configChanges="orientation|screenSize"
            android:theme="@style/ConversationsTheme.Dialog"
            android:exported="true" />
        <activity
            android:name=".ui.ShowLocationActivity"
            android:label="@string/title_activity_show_location"
            android:exported="true" />
        <activity
            android:name=".ui.SplashActivity"
            android:theme="@style/SplashTheme"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".ui.ConversationsActivity"
            android:label="@string/app_name"
            android:launchMode="singleTask"
            android:minWidth="300dp"
            android:minHeight="300dp"
            android:exported="true"
            android:windowSoftInputMode="stateHidden" />
        <activity
            android:name=".ui.ScanActivity"
            android:screenOrientation="portrait"
            android:exported="true"
            android:theme="@style/ConversationsTheme.FullScreen"
            android:windowSoftInputMode="stateAlwaysHidden" />
        <activity
            android:name=".ui.UriHandlerActivity"
            android:label="@string/app_name"
            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="xmpp" />
            </intent-filter>
            <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" />
                <data android:host="im.app.in" />
                <data android:pathPrefix="/i/" />
                <data android:pathPrefix="/j/" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.SENDTO" />

                <category android:name="android.intent.category.DEFAULT" />

                <data android:scheme="imto" />
                <data android:host="jabber" />
            </intent-filter>
        </activity>
        <activity
            android:name=".ui.StartConversationActivity"
            android:label="@string/title_activity_start_conversation"
            android:launchMode="singleTop"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
            </intent-filter>
        </activity>
        <activity
            android:name=".ui.SettingsActivity"
            android:label="@string/title_activity_settings"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.NOTIFICATION_PREFERENCES" />
            </intent-filter>
        </activity>
        <activity
            android:name=".ui.ChooseContactActivity"
            android:label="@string/title_activity_choose_contact"
            android:exported="true" />
        <activity
            android:name=".ui.BlocklistActivity"
            android:label="@string/title_activity_block_list"
            android:exported="true"/>
        <activity
            android:name=".ui.ChangePasswordActivity"
            android:label="@string/change_password_on_server"
            android:exported="true"/>
        <activity
            android:name=".ui.ChooseAccountForProfilePictureActivity"
            android:enabled="false"
            android:label="@string/choose_account"
            android:exported="true">
            <intent-filter android:label="@string/set_profile_picture">
                <action android:name="android.intent.action.ATTACH_DATA" />

                <category android:name="android.intent.category.DEFAULT" />

                <data android:mimeType="image/*" />
            </intent-filter>
        </activity>
        <activity
            android:name=".ui.ShareViaAccountActivity"
            android:label="@string/title_activity_share_via_account"
            android:launchMode="singleTop"
            android:exported="true" />
        <activity
            android:name=".ui.EditAccountActivity"
            android:launchMode="singleTop"
            android:exported="true"
            android:windowSoftInputMode="stateHidden|adjustResize" />
        <activity
            android:name=".ui.ConferenceDetailsActivity"
            android:label="@string/action_muc_details"
            android:exported="true"
            android:windowSoftInputMode="stateHidden" />
        <activity
            android:name=".ui.ContactDetailsActivity"
            android:exported="true"
            android:windowSoftInputMode="stateHidden" />
        <activity
            android:name=".ui.PublishProfilePictureActivity"
            android:label="@string/mgmt_account_publish_avatar"
            android:exported="true"
            android:windowSoftInputMode="stateHidden" />
        <activity
            android:name=".ui.PublishGroupChatProfilePictureActivity"
            android:exported="true"
            android:label="@string/group_chat_avatar" />
        <activity
            android:name=".ui.ShareWithActivity"
            android:label="@string/app_name"
            android:launchMode="singleTop"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.SEND" />
                <action android:name="android.intent.action.SEND_MULTIPLE" />

                <category android:name="android.intent.category.DEFAULT" />

                <data android:mimeType="text/plain" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.SEND" />
                <action android:name="android.intent.action.SEND_MULTIPLE" />

                <category android:name="android.intent.category.DEFAULT" />

                <data android:mimeType="*/*" />
            </intent-filter>

            <!-- the value here needs to be the full class name; independent of the configured applicationId -->
            <meta-data
                android:name="android.service.chooser.chooser_target_service"
                android:value="eu.siacs.conversations.services.ContactChooserTargetService" />
        </activity>
        <activity
            android:name=".ui.TrustKeysActivity"
            android:label="@string/trust_omemo_fingerprints"
            android:exported="true"
            android:windowSoftInputMode="stateAlwaysHidden" />
        <activity
            android:name="com.theartofdev.edmodo.cropper.CropImageActivity"
            android:exported="true"
            android:theme="@style/Base.Theme.AppCompat" />
        <activity android:name=".ui.MemorizingActivity"
            android:exported="true" />
        <activity
            android:name=".ui.MediaBrowserActivity"
            android:exported="true"
            android:label="@string/media_browser" />

        <service android:name=".services.ExportBackupService" android:exported="true"/>
        <service android:name=".services.ImportBackupService" android:exported="true"/>
        <service
            android:name=".services.ContactChooserTargetService"
            android:permission="android.permission.BIND_CHOOSER_TARGET_SERVICE"
            android:exported="true">
            <intent-filter>
                <action android:name="android.service.chooser.ChooserTargetService" />
            </intent-filter>
        </service>
        <service android:name=".services.CompulsoryUpdateService" android:exported="true"/>

        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="${applicationId}.files"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>
        <provider
            android:name=".services.BarcodeProvider"
            android:authorities="${applicationId}.barcodes"
            android:exported="false"
            android:grantUriPermissions="true" />

        <activity
            android:name=".ui.ShortcutActivity"
            android:label="@string/contact"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.CREATE_SHORTCUT" />
            </intent-filter>
        </activity>
        <activity
            android:name=".ui.MucUsersActivity"
            android:exported="true"
            android:label="@string/group_chat_members" />
        <activity
            android:name=".ui.ChannelDiscoveryActivity"
            android:exported="true"
            android:label="@string/discover_channels" />
        <activity
            android:name=".ui.RtpSessionActivity"
            android:autoRemoveFromRecents="true"
            android:exported="true"
            android:launchMode="singleInstance"
            android:supportsPictureInPicture="true" />
    </application>

</manifest>

My second manifest file:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="eu.siacs.conversations">

    <application tools:ignore="GoogleAppIndexingWarning">
        <activity
            android:name=".ui.ManageAccountActivity"
            android:label="@string/title_activity_manage_accounts"
            android:launchMode="singleTask"
            android:exported="true"/>
        <activity
            android:name=".ui.MagicCreateActivity"
            android:label="@string/create_new_account"
            android:launchMode="singleTask"
            android:exported="true"/>
        <activity
            android:name=".ui.EasyOnboardingInviteActivity"
            android:label="@string/invite_to_app"
            android:launchMode="singleTask" />
        <activity
            android:name=".ui.ImportBackupActivity"
            android:label="@string/restore_backup"
            android:launchMode="singleTask"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />

                <data android:mimeType="application/vnd.conversations.backup" />
                <data android:scheme="content" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />

                <data android:mimeType="application/vnd.conversations.backup" />
                <data android:scheme="file" />
            </intent-filter>
            <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="content" />
                <data android:host="*" />
                <data android:mimeType="*/*" />
                <data android:pathPattern=".*\\.ceb" />
                <data android:pathPattern=".*\\..*\\.ceb" />
                <data android:pathPattern=".*\\..*\\..*\\.ceb" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\.ceb" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.ceb" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\.ceb" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\.ceb" />
            </intent-filter>
            <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="file" />
                <data android:host="*" />
                <data android:mimeType="*/*" />
                <data android:pathPattern=".*\\.ceb" />
                <data android:pathPattern=".*\\..*\\.ceb" />
                <data android:pathPattern=".*\\..*\\..*\\.ceb" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\.ceb" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.ceb" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\.ceb" />
                <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\..*\\..*\\.ceb" />
            </intent-filter>
        </activity>
    </application>
</manifest>

My gradle file:

import com.android.build.OutputFile

// Top-level build file where you can add configuration options common to all
// sub-projects/modules.
buildscript {
    ext.kotlin_version = "1.5.21"
    repositories {
        google()
        mavenCentral()
        maven { url 'https://jitpack.io' }
        gradlePluginPortal()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:4.2.2'
        classpath 'com.google.gms:google-services:4.3.8'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'com.google.gms.google-services'

repositories {
    google()
    mavenCentral()
    jcenter()
    maven { url 'https://jitpack.io' }
}

configurations {
    conversationsFreeCompatImplementation
}

dependencies {
    implementation 'androidx.viewpager:viewpager:1.0.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'

    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"

    implementation 'org.sufficientlysecure:openpgp-api:10.0'
    implementation 'com.theartofdev.edmodo:android-image-cropper:2.8.0'
    implementation 'androidx.appcompat:appcompat:1.3.1'
    implementation 'androidx.exifinterface:exifinterface:1.3.2'
    implementation 'androidx.cardview:cardview:1.0.0'
    implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
    implementation 'androidx.emoji:emoji:1.1.0'
    implementation 'com.google.android.material:material:1.4.0'
    conversationsFreeCompatImplementation 'androidx.emoji:emoji-bundled:1.1.0'
    implementation 'org.bouncycastle:bcmail-jdk15on:1.64'
    //zxing stopped supporting Java 7 so we have to stick with 3.3.3
    //https://github.com/zxing/zxing/issues/1170
    implementation 'com.google.zxing:core:3.4.1'
    implementation 'de.measite.minidns:minidns-hla:0.2.4'
    implementation 'me.leolin:ShortcutBadger:1.1.22@aar'
    implementation 'org.whispersystems:signal-protocol-java:2.8.1'
    implementation 'com.makeramen:roundedimageview:2.3.0'
    implementation "com.wefika:flowlayout:0.4.1"
    implementation 'net.ypresto.androidtranscoder:android-transcoder:0.3.0'
    implementation 'org.jxmpp:jxmpp-jid:1.0.1'
    implementation 'org.osmdroid:osmdroid-android:6.1.10'
    implementation 'org.hsluv:hsluv:0.2'
    implementation 'org.conscrypt:conscrypt-android:2.5.2'
    implementation 'me.drakeet.support:toastcompat:1.1.0'
    implementation "com.leinardi.android:speed-dial:3.2.0"

    implementation "com.squareup.retrofit2:retrofit:2.9.0"
    implementation "com.squareup.retrofit2:converter-gson:2.9.0"
    implementation "com.squareup.okhttp3:okhttp:5.0.0-alpha.2"
    implementation 'com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.2'

    implementation 'com.google.guava:guava:30.1.1-android'
    implementation 'org.webrtc:google-webrtc:1.0.32006'

    // Lifecycle Helper
    implementation "androidx.activity:activity-ktx:1.3.0-rc02"
    implementation "androidx.fragment:fragment-ktx:1.3.6"

    //Navigation
    implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5'
    implementation 'androidx.navigation:navigation-ui-ktx:2.3.5'

    //CardView
    implementation "androidx.cardview:cardview:1.0.0"

    //Country Code Picker
    implementation 'com.hbb20:ccp:2.5.3'

    //Firebase
    implementation 'com.google.firebase:firebase-bom:28.3.0'
    implementation 'com.google.firebase:firebase-auth-ktx:21.0.1'
    implementation 'androidx.browser:browser:1.3.0'

    //OTP view
    implementation 'com.github.mukeshsolanki:android-otpview-pinview:2.1.2'

    //Retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'

    //Gson
    implementation 'com.google.code.gson:gson:2.8.7'

    //Multidex
    implementation 'androidx.multidex:multidex:2.0.1'

    //Round Image
    implementation 'de.hdodenhof:circleimageview:3.1.0'

    // Button with image and text
    implementation 'com.github.Omega-R:OmegaCenterIconButton:0.0.4@aar'

    //Razor pay
    implementation 'com.razorpay:checkout:1.6.10'

    //Mixpanel Tracking
    implementation 'com.mixpanel.android:mixpanel-android:5.9.1'

    //Loading screen
    implementation 'com.wang.avi:library:2.1.3'

    //Loading
    implementation 'com.wang.avi:library:2.1.3'

    //Form
    implementation 'com.quickbirdstudios:surveykit:1.1.0'
}

ext {
    travisBuild = System.getenv("TRAVIS") == "true"
    preDexEnabled = System.getProperty("pre-dex", "true")
    abiCodes = ['armeabi-v7a': 1, 'x86': 2, 'x86_64': 3, 'arm64-v8a': 4]
}

android {
    compileSdkVersion 31

    defaultConfig {
        minSdkVersion 24
        targetSdkVersion 31
        versionCode 44
        versionName "2.0.4"
        multiDexEnabled = true
        archivesBaseName += "-$versionName"
        applicationId "com.app.app"
        resValue "string", "applicationId", applicationId
        def appName = "app"
        resValue "string", "app_name", appName
        buildConfigField "String", "APP_NAME", "\"$appName\""
    }

    splits {
        abi {
            universalApk true
            enable true
        }
    }

    configurations {
        compile.exclude group: 'org.jetbrains' , module:'annotations'
    }

    dataBinding {
        enabled true
    }

    dexOptions {
        // Skip pre-dexing when running on Travis CI or when disabled via -Dpre-dex=false.
        preDexLibraries = preDexEnabled && !travisBuild
        jumboMode true
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    flavorDimensions("mode", "distribution", "emoji")

    productFlavors {

        conversations {
            dimension "mode"
        }
        free {
            dimension "distribution"
            versionNameSuffix "+f"
        }
        compat {
            dimension "emoji"
            versionNameSuffix "c"
        }
    }

    sourceSets {
        conversationsFreeCompat {
            java {
                srcDir 'src/freeCompat/java'
                srcDir 'src/conversationsFree/java'
            }
        }
    }

    buildTypes {
        release {
            shrinkResources true
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            versionNameSuffix "r"
        }
        debug {
            shrinkResources true
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            versionNameSuffix "d"
        }
    }


    if (new File("signing.properties").exists()) {
        Properties props = new Properties()
        props.load(new FileInputStream(file("signing.properties")))

        signingConfigs {
            release {
                storeFile file(props['keystore'])
                storePassword props['keystore.password']
                keyAlias props['keystore.alias']
                keyPassword props['keystore.password']
            }
        }
        buildTypes.release.signingConfig = signingConfigs.release
    }

    lintOptions {
        disable 'MissingTranslation', 'InvalidPackage','AppCompatResource'
    }

    subprojects {

        afterEvaluate {
            if (getPlugins().hasPlugin('android') ||
                    getPlugins().hasPlugin('android-library')) {

                configure(android.lintOptions) {
                    disable 'AndroidGradlePluginVersion', 'MissingTranslation'
                }
            }

        }
    }

    packagingOptions {
        exclude 'META-INF/BCKEY.DSA'
        exclude 'META-INF/BCKEY.SF'
    }

    android.applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def baseAbiVersionCode = project.ext.abiCodes.get(output.getFilter(OutputFile.ABI))
            if (baseAbiVersionCode != null) {
                output.versionCodeOverride = (100 * variant.versionCode) + baseAbiVersionCode
            }
        }

    }
}
Ashique Bava
  • 2,486
  • 2
  • 9
  • 21
  • Please share the crash logs here. – Android Geek Jul 28 '21 at 04:45
  • What do you mean by _"manifest is crashing"_? How can the manifest possibly crash? I would expect one of two things to happen, depending in which Android Studio version you're running: either you get a build error, or the app fails to install. Note that explicitly stating whether a component should be exported is only required for components that declare an intent filter (as far as I can tell). – Michael Jul 28 '21 at 06:41
  • @AndroidGeek Merging Errors: Error: android:exported needs to be explicitly specified for . Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported` when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details. main manifest (this file) – Ashique Bava Jul 28 '21 at 08:43
  • @Michael Sorry, it was a typing mistake, the application is not compiling – Ashique Bava Jul 28 '21 at 08:45
  • This is required not just for activities, but for all components that declare an intent filter (i.e. services, etc). If you've already added the `android:exported` attribute to all such components, then perhaps you're using some third-party dependency that provides some components without having set `android:exported` for them? – Michael Jul 28 '21 at 08:49
  • @Michael I have added it to services and activities, but no luck. – Ashique Bava Jul 28 '21 at 09:01
  • @Michael is there any way that we can track which third-party dependency has caused this issue(if it is), without checking all the libraries manually. – Ashique Bava Jul 28 '21 at 09:03
  • 2
    Normally I guess I'd look in the files under `app/build/intermediates/manifest_merge_blame_file/`. But if the build fails during the manifest merge then perhaps the blame files aren't even generated. In that case I don't really know. – Michael Jul 28 '21 at 09:11
  • @Michael I forgot to mention that I have two manifest files, I have updated the question. Anyway, thank you for your time. – Ashique Bava Jul 28 '21 at 09:14
  • `android:exported="true"` is missing in Activity `ui.EasyOnboardingInviteActivity` in Second manifest, Please check – Android Geek Jul 28 '21 at 10:12
  • @AndroidGeek Just added it, not working. – Ashique Bava Jul 28 '21 at 10:23
  • 4
    @AshiqueBava as Michael pointed out the culprit might not be in the merged manifest file. I had to check every manifest file for every entry listed in "External libraries" and found the missing one at last. Then you either have to update the library or file an issue in their issue tracker. – dng Jul 28 '21 at 14:00
  • Have you found a solution? I am wondering the same. – IgorGanapolsky Aug 03 '21 at 16:41
  • @IgorGanapolsky Nope. I am still looking – Ashique Bava Aug 04 '21 at 03:10
  • @AshiqueBava does my answer helps you? – Jakoss Aug 18 '21 at 15:19
  • 1
    @Jakoss I was busy with some other projects. I will check it out as soon as I get time. Thanks for your time. – Ashique Bava Aug 18 '21 at 18:46
  • @Jakoss please refer to this [photo](https://drive.google.com/file/d/1cAS877_-cTpL7y512i7tTVjCwtHJfGFU/view?usp=sharing). Even though I have added exported to all the components, it still shows the error. – Ashique Bava Aug 20 '21 at 10:06
  • @AshiqueBava are you positive that you added that to all of the components, even those outside your application (from libraries)? You can also try full rebuild, to make sure some cache is not breaking things – Jakoss Aug 20 '21 at 18:48
  • 2
    @dng thank you!! Never would have copped this. Once you mentioned it, was thinking "Oh, it must be that 3rd party lib" and removed a few of them. Culprit turned out to be `androidx.fragment:fragment-testing:1.3.6` :( – anotherdave Sep 01 '21 at 11:51
  • Having this issue when I compile a pure android library, no activities at all, checked, the tests dependencies, but no clue witch one have the missing flag. – Akhha8 Nov 30 '21 at 17:51
  • Does this answer your question? [Manifest merger failed targeting Android 12](https://stackoverflow.com/questions/67654506/manifest-merger-failed-targeting-android-12) – Mahozad Jan 23 '22 at 11:55
  • See also https://stackoverflow.com/questions/69287478/androidexported-added-but-still-getting-error-apps-targeting-android-12-and-hig. – CoolMind Mar 24 '22 at 14:56
  • This is annoying: I let Android Studio create the app skeleton, and the AS-generated code suffered from this problem! – Edward Falk Sep 10 '22 at 00:05
  • For this issue in your flutter project check this [solution](https://stackoverflow.com/a/74465512/13461417) – Black Hawk Nov 16 '22 at 18:36

38 Answers38

195

I had this issue and one of the libraries I used wasn't setting it correctly.

Find location

First of all, we need to find the exact location and/or cause for the error,
which can be done with different approaches (see below).

Find by inspecting merged-manifest (approach #1)

You can find it by doing the steps:

  • Set target SDK to 30 (to silence 31+ errors).

  • Open application's manifest (AndroidManifest.xml) and click on "Merged Manifest" tab on bottom of your edit pane:
    Merged Manifest in Android Studio

    Which if you configure build.gradle like:

    allprojects {
       buildDir = "${rootProject.rootDir}/build/${project.name}"
    }
    

    Something similar should be in a sub-path like:

    build/my-app/intermediates/merged_manifest/debug/AndroidManifest.xml
    
  • Go to the individual manifest file of all the libraries (You can skip this step if the merged manifest is created and you can just look into the merged manifest)

  • Search if there's any entry of type activity, service, receiver, or provider which does not have an exported attribute, and for each entry follow below "Fix found entries" section (or see once for how to set exported attribute).

  • Set target SDK back to 31 (or whatever it was before changing to 30).

Find by console logs (approach #2)

  • In Git-bash run something like:

    ./gradlew assembleDebug --stacktrace --info | tee my-logs.txt
    
  • Open my-logs.txt file (which previous step created, in your preferred text-editor).

  • Now, the exact location is hidden in the logs, hence search in the created my-logs.txt file, for these keywords:

    • activity#
    • service#
    • receiver#
    • provider#
  • Which should find something like:

activity#androidx.test.core.app.InstrumentationActivityInvoker$BootstrapActivity
ADDED from [androidx.test:core:1.2.0] C:\Users\Admin\.gradle\caches\transforms-3\709730c74fe4dc9f8fd991eb4d1c2adc\transformed\jetified-core-1.2.0\AndroidManifest.xml:27:9-33:20
  • Open AndroidManifest.xml file that previous steps did find, search if there's any entry of type activity, service, receiver, or provider which does not have an exported attribute, and see below "Fix found entries" section (for how to set each entries exported attribute).

Note that (at time of writting) passing --stacktrace alone did not include location info ;-)

Fix found entries

If the real (not build-generated) source of found entry is in root-project's manifest (or somewhere you can alter), set exported attribute to corresponding need (which is normally false) therein directly, like:

<receiver
    android:name="<name_of_the_entry>"
    android:exported="false or true"
    tools:node="merge" />

Note that both android:exported="..." and tools:node="merge" are set above.

But if found entry's specification is written in the manifest of a third-party library (which's real-source you can't alter), override the specification of said library by adding it to our root-project's manifest, for example like:

<provider
    android:name="com.squareup.picasso.PicassoProvider"
    android:exported="false"
    tools:node="merge"
    tools:overrideLibrary="com.squareup.picasso.picasso" />

Note that this time tools:overrideLibrary="..." is set as well.

For more information see Documentation,
and/or Similar issue in a SDK.

Top-Master
  • 7,611
  • 5
  • 39
  • 71
Jakoss
  • 4,647
  • 2
  • 26
  • 40
  • 3
    after doing a clean project the error will appear again :( – Mohammad Sommakia Aug 19 '21 at 08:52
  • 2
    Then you have some unexported entries still. Have check all entries? Broadcast receivers, services, activities and providers? – Jakoss Aug 19 '21 at 13:54
  • 1
    @Jakoss yes bro we checked all libraries files and the project worked but after rebuilding the project gradle will clean local files and download it again and modify our edits so this solution won't work – Abdulmalek Dery Aug 24 '21 at 10:07
  • 3
    @AbdulmalekDery look at my answer, you do not modify manifest in temporary files. You have to add `tools:node="merge"` entries for all entries in YOUR `manifest.xml` – Jakoss Aug 24 '21 at 10:57
  • In my case, the app did ran well but the tests could not run, fixed after upgrading `androidx.test.ext:junit from 1.1.1` to the latest. – KE Keronei Feb 13 '22 at 15:26
  • 1
    I had two receivers from third party dependency that weren't showing up in the merged manifest in Android Studio BUT did show up in the app/build/intermediates/merged_manifests – hmac Apr 05 '22 at 14:49
  • 1
    In my case, it was the com.huawei.hms:push dependency which was causing a problem, I updated it to 6.3.0.304 and the error is gone, thank you – FabioR Apr 22 '22 at 20:24
  • 1
    Thanks guy. My problem solved, only by setting target SDK to 30. – M Karimi May 02 '22 at 06:27
  • 1
    dont forget about the prefix : https://stackoverflow.com/questions/55334431/facing-below-error-toolsnode-associated-with-an-element-type-uses-permission – Yogi Arif Widodo Aug 20 '22 at 02:11
69

Fixing such issue can be a bit cumbersome, cause the IDE doesn't provide details on the error, it just tells you that there is an Activity, Receiver or Service without the exported parameter, but does not tell you which one it is. As Jakos recommend, you can manually check the merged manifest, or use this script in case the generated manifest is too large.

After that you can modify the affected entries by adding the exported attribute if it is part of your project, or override it if it's part of a library with:

<activity android:name="name_of_the_activity_inside_library>"
    android:exported="false|true"
    tools:node="merge" />

UPDATE: The manifest merge task seems to fail without generating the manifest when targeting android S and this problems are detected, so my advise is to compile the app using a targetSdk lower than 31, and then inspect the generated manifest either manually or using the script I linked. (you can find the merged manifest on the build folder or by inspecting the generated apk)

Raymond Arteaga
  • 4,355
  • 19
  • 35
  • What should I pass as args? – Ashique Bava Aug 22 '21 at 16:47
  • the file path containing your manifest, you can also directly replace args[0] with the path and use the script as a scratch – Raymond Arteaga Aug 22 '21 at 22:22
  • can you please share how to get the manifest file path – Ashique Bava Aug 23 '21 at 11:12
  • 1
    this solution won't work because after updating the libraries manifests the gradle will delete the local changes in a future sync and you have to edit manifests again so the only solution that google advice now is to ask libraries developer to update their repos :( – Abdulmalek Dery Aug 24 '21 at 10:12
  • Hi @AbdulmalekDery, you are supposed to modify only manifests you own. If you find an issue on a third party library you should use the Build3r's solution, "overriding" the exported attribute using toold:node="merge" in your main project's manifest. – Raymond Arteaga Aug 24 '21 at 15:53
  • 1
    Here's more info on what to set it to: https://developer.android.com/about/versions/12/behavior-changes-12#exported – AaronC Oct 06 '21 at 21:17
  • I wonder How the value of exported is determined? `android:exported="false|true"`? – Mahesh Jamdade Jan 23 '22 at 10:23
57

Change targetSdkVersion back to 30
You can leave compileSdkVersion at 31
Then hit Run

ericfranzee
  • 711
  • 4
  • 4
  • 6
    Hey Eric, first of all, Thank you for being a new contributor, it's the best way to help other people. With respect to your answer, It would be good if you could be a bit more elaborative so that others could understand the depth of the answer. Probably explain, how you had the same issue and how you managed to solve it. – Manjunath Reddy Jan 04 '22 at 04:32
  • 1
    Your answer could be improved with additional supporting information. Please [edit] to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Jan 04 '22 at 04:34
  • 2
    Here, sir, you dropped this . – Petetheodddog Mar 10 '22 at 11:51
  • Don't know why this worked, an explanation would be nice. Thanks nonetheless – Isaac Martin Otim Apr 19 '22 at 05:28
  • this actually worked but will there be any issues in the app in future if I reduce sdkVersion? – Chindukuri Pavan Jun 16 '22 at 11:21
  • 21
    Reducing SdkVersion will just postpone the issue for later. Google Play is enforcing certain TargetSdkVersion so you'll have to target it in a few months anyway. And targeting newest version is always good practise, this way you can use the newest additions to android OS. So the answer here is NOT a solution, just a temporary workaround – Jakoss Aug 04 '22 at 20:36
30

For instrumented test, if you are using compose test, make sure you add androidx.test.ext:junit in addition to compose.ui dependencies

androidTestImplementation "androidx.test.ext:junit:1.1.3"
androidTestImplementation "androidx.compose.ui:ui-test-junit4:1.0.4"
Saba
  • 1,208
  • 14
  • 19
  • This works in conjunction of having the ```android:exported="true"``` and you could also use the ktx version ```androidx.test.ext:junit-ktx``` – Renato Oct 30 '21 at 06:35
  • That's it! Thank you so much! – Silas Pedrosa Nov 29 '21 at 21:14
  • This was the correct answer for me, thanks. – Dieseled UP Jan 28 '22 at 09:22
  • I got error msg: "android:exported needs to be explicitly specified for element ", updating androidx.test.ext:junit:1.1.3 did fix the error. Thanks! – Eric Cen Mar 10 '22 at 02:19
  • @EricCen more importantly, how did you manage to get such an exact location in error message? (all we get is the raw default-message) – Top-Master Apr 23 '22 at 17:51
  • @Top-Master Based on the error message, it gives some information about what to search about. I did Google searches and then tried out all the possible solutions. if the error msg is too generic, it is tough to find the exact place/library where it causes the issue. The worst case is to try different versions on each library and do Google search on each library with the error message. – Eric Cen Apr 24 '22 at 17:19
27

After the build has failed go to AndroidManifest.xml and in the bottom click merged manifest see which activities which have intent-filter but don't have exported=true attribute. Or you can just get the activities which are giving error.

Add these activities to your App manifest with android:exported="true" and app tools:node="merge" this will add exported attribute to the activities giving error. Example:

     <activity
                android:name="<activity which is giving error>"
                android:exported="true"
                tools:node="merge" />

You will have to do this once, you can remove this once the library developers update their libs.

Build3r
  • 1,748
  • 16
  • 22
  • this one did the trick. I did not had to add the node=merge line, just the exported=true. thanks Build3r! – Federico Alvarez Sep 08 '21 at 20:08
  • 1
    @FedericoAlvarez Adding `tools:node="merge"` will keep all the other fields which the developer intended to have. Without it your changes will replace the original. I strong suggest to include `tools:node="merge"` More details here https://developer.android.com/studio/build/manifest-merge – Build3r Sep 13 '21 at 11:55
  • There is no tools node attribute anymore https://developer.android.com/guide/topics/manifest/activity-element – cansu Oct 29 '22 at 12:10
  • Your answer was relevant about "intent-filter" I was building a flutter project when got this error. Using intent-filter adding lines solve the problem. thanks. – embarker Dec 24 '22 at 12:06
23

Check your build.gradle file for:

debugImplementation "androidx.fragment:fragment-testing:<version>"

and if present change it to:

androidTestImplementation "androidx.fragment:fragment-testing:<version>"

It should always have been androidTestImplementation but there was some dependency issue before and it was necessary to use debugImplementation as a workaround. The IDE actually prompted you to do this. But evidently it is fixed for SDK 31, and if you leave it as debugImplementation you get the android:exported-missing manifest error which comes from a manifest.xml in a dependent package.

Ben
  • 1,881
  • 17
  • 20
  • 4
    Solves the one problem but a new problem occurs: My tests then fail with `Unable to resolve activity for: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER]... androidx.fragment.app.testing.FragmentScenario$EmptyFragmentActivity (has extras) }` – L3n95 Oct 19 '21 at 18:42
  • 3
    I could not upvote this enough times. I spent HOURS searching for this solution. Made your suggested changes and my app fired right up. – whitaay Oct 25 '21 at 22:12
  • Make sure you upgrade to the latest version of fragment – Ibramazin Dec 09 '21 at 19:51
16

as the target sdk update to 31 android 12 so for that you have to do android export in your activity luncher in manifest.xml

 android:exported="true"
Mazhar Iqbal
  • 813
  • 7
  • 7
16

The problem in my case was the test:core:1.3.0 (see screen shot).

I had to override the manifest entries for this library and declare the android:exported property:

<activity android:name="androidx.test.core.app.InstrumentationActivityInvoker$BootstrapActivity"
android:exported="true"
tools:node="merge"/>

<activity android:name="androidx.test.core.app.InstrumentationActivityInvoker$EmptyActivity"
android:exported="true"
tools:node="merge"/>

<activity android:name="androidx.test.core.app.InstrumentationActivityInvoker$EmptyFloatingActivity"
android:exported="true"
tools:node="merge"/>

enter image description here

Goran Horia Mihail
  • 3,536
  • 2
  • 29
  • 40
11
<activity
     android:name=".MainActivity"
     android:exported="true" <** add this line on AndroidManifest.xml**
     android:launchMode="singleTop"
     android:theme="@style/LaunchTheme"
 </activity>
zeev grim
  • 137
  • 1
  • 5
9

I'm not sure what you're using to code, but in order to set it in Android Studio, open the manifest of your project and under the "activity" section, put android:exported="true"(or false if that is what you prefer). I have attached an example.

Thomas Glasser
  • 103
  • 1
  • 6
  • 12
    I have added it to all the activities, but the problem still persits. – Ashique Bava Aug 04 '21 at 10:34
  • Thanks, this solution work for me, for more info go here https://developer.android.com/about/versions/12/behavior-changes-12#exported – mycky Mar 08 '22 at 11:46
9

if you are using flutter , upgrading flutter_local_notifications to the latest version (now is 9.3.2) may solve this error..

Amer Alzibak
  • 1,489
  • 15
  • 16
6

If your app targets Android 12 or higher, you must declare these attribution tags in your app's manifest file. If the app component includes the LAUNCHER category, set android:exported to true.

 <activity
        android:name="com.test.activity.SplashActivity"
        android:clearTaskOnLaunch="true"
        android:label="@string/app_name"
        android:launchMode="singleTop"
        android:noHistory="true"
        android:screenOrientation="portrait"
        android:theme="@style/AppTheme.NoActionBar"
        android:exported="true">

Also check receiver or service in Androidmanifest, if you are using any receiver or service set android:exported="true" or false according requirement.

   <receiver
        android:name="com.test.receiver.ShareReceiver"
        android:exported="true">
        <intent-filter>
            <action android:name="com.test.fcm.android.action.broadcast" />
        </intent-filter>
    </receiver>

   <service
        android:name="com.google.android.gms.tagmanager.InstallReferrerService"
        android:exported="true" />

Also update all your gradle dependency.

I have updated following dependency as per requirement.

testImplementation 'junit:junit:4.13.2' 
androidTestImplementation 'androidx.test:runner:1.4.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
implementation 'com.razorpay:checkout:1.6.15'

Hope it will help you as well.

Kishan Thakkar
  • 619
  • 6
  • 11
5

I happen to know that issue in the android 12 specifically. There is already a bug raised in Android SDK. In the solution of your problem here is a file you can add in android studio and run the method.

Enable android exported file

Then run the def methods and try to build. It is tried and tested working method.

raj kavadia
  • 926
  • 1
  • 10
  • 30
5

This is the most common issue after upgrading your TargetSDK 32 or Android Studio with API Android 12 support.

To relate this was my error:

enter image description here

The errors were:

 Error:
    android:exported needs to be explicitly specified for element <receiver#com.onesignal.BootUpReceiver>. Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported` when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details.
D:\iptvapp\iptvapp\app\src\main\AndroidManifest.xml:99:9-103:20 Error:
    android:exported needs to be explicitly specified for element <receiver#com.onesignal.UpgradeReceiver>. Apps targeting Android 12 and higher are required to specify an explicit value for `android:exported` when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details.

Then by using the merged Mainfest Clikc on the Libirary that has error for instacne onesingal.

enter image description here

Then copy the error if its the receiver part and add it to your main manifest file as follows with

android:exported

set to true on.

and them

 <receiver android:name="com.onesignal.BootUpReceiver"  android:exported="true">
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED" />
                    <action android:name="android.intent.action.QUICKBOOT_POWERON" />
                </intent-filter>
            </receiver>
            <receiver android:name="com.onesignal.UpgradeReceiver" android:exported="true" >
                <intent-filter>
                    <action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
                </intent-filter>
            </receiver>

worked like a charm!

Develop4Life
  • 7,581
  • 8
  • 58
  • 76
4

If you sure about adding exported to every element in manifest file and still got this error, simply :

  1. switch to project directory and open merged manifest file in app\build\intermediates\merged_manifest
  2. search for any component that contains intent-filter and didn't have exported attribute
  3. override this component in your manifest file by copy past it to your main manifest file

tip: if you can't find merged file because it's already failed to generate it .temporary downgrade to targetSdkVersion 30 and compileSdkVersion 30 and build project to generate this file and then follow above steps and then upgrade to 31 (android 12)

cigien
  • 57,834
  • 11
  • 73
  • 112
Sherif farid
  • 364
  • 4
  • 7
4

Just add these in build.gradle...

androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation "androidx.compose.ui:ui-test-junit4:1.3.3"

Works like charm!

V-rund Puro-hit
  • 5,518
  • 9
  • 31
  • 50
4

for me adding exported=true in activity section worked

3

Found this solution here, works for me. This is given by official razorpay github. They've mentioned they'll fix it in next release.

<receiver
    android:name="com.razorpay.RzpTokenReceiver"
    android:exported="false">
    <intent-filter>
        <action android:name="rzp.device_token.share" />
    </intent-filter>
</receiver>

<activity
    android:name="com.razorpay.CheckoutActivity"
    android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
    android:exported="true"
    android:theme="@style/CheckoutTheme">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <data
            android:host="rzp.io"
            android:scheme="io.rzp" />
    </intent-filter>
</activity>
KKM
  • 626
  • 5
  • 12
3

Case 1: No submodules or libraries

This issue started with SDK 31. If you don't have any libraries or submodules add

android:exported="true" <!-- or false as required -->

You can right click on the tag and Android Studio will suggest you.

Case 2: With submodules or libraries

If you have other libraries or modules that you are importing, you have to override them too. For that see the tab 'Merged Manifest'. OR You can open

<ProjectRoot>/app/build/intermediates/merged_manifest/<your flavor>/AndroidManifest.xml

in an editor. I prefer the second method as Merged manifest doesn't allow to search from Android Studio.

  1. Copy <activity>, <receiver> or any others causing build errors.
  2. Paste them to Main Manifest
  3. Add android:exported="true" or android:exported="false" as required
  4. Rebuild

Case 3: If None of the above works

If none of the above works, you will have to wait until your library provider makes necessary changes. Until they make changes, you may revert SDK version to 30 or lower. Lowering sdk should fix the issue temporarily.

2

This error occur when we make the targetSkdVersion=31 for latest version 12, and the error cause if we have not use android:exported="true" in the launcher activity and android:exported="false" in other intent_filter,service or broadcast receiver. We should write android:exported="true" only for launcher activity like this:

 <activity 
         android:name="com.abc.MainActivity"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

and write android:exported="false" for service or broadcast receiver etc, like these:

      <service android:name="com.startapp.sdk.adsbase.InfoEventService"
        android:exported="false"/>
    <service
        android:name="com.startapp.sdk.adsbase.PeriodicJobService"
        android:permission="android.permission.BIND_JOB_SERVICE"
        android:exported="false"/>

    <receiver android:name="com.startapp.sdk.adsbase.remoteconfig.BootCompleteListener"
        android:exported="false">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

but if these services or broadcast receiver or used in the implemented library which mean it will be inside the manifest file of the library. so we will copy those service and broadcast receiver etc from those library manifest file and will paste in our main activity manifest, as like above i have copied the intent_fileter,services or broadcast receiver of the start.io sdk implented in my app to my main mainfest file.

How to copy merger manifest file to main manifest file

  • open your project's AndroidManifest.xml.
  • at the bottom of the window, click on the Merged Manifest tab.
  • look for any activity that includes an intent-filter tag and is missing the android:exported attribute
  • now copy all those to main manifest file.
Pir Fahim Shah
  • 10,505
  • 1
  • 82
  • 81
1

My problem was that we were using older hilt version 2.38.1:

"com.google.dagger:hilt-android:2.38.1"
"com.google.dagger:hilt-android-gradle-plugin:2.38.1"
"com.google.dagger:hilt-android-compiler:2.38.1"
"com.google.dagger:hilt-android-testing:2.38.1"

"com.google.dagger:hilt-android-testing:2.38.1" under the hood depends on core testing library 1.3.0, which does set exported properties.

To fix this, make sure you are using latest dagger hilt version (2.40.5 works):

"com.google.dagger:hilt-android:2.40.5"
"com.google.dagger:hilt-android-gradle-plugin:2.40.5"
"com.google.dagger:hilt-android-compiler:2.40.5"
"com.google.dagger:hilt-android-testing:2.40.5" 
1

In my case I update fragment-testing to 1.5.3 version and this helped me:

dependencies {
    debugImplementation androidx.fragment:fragment-testing:1.5.3
}
1

I faced the same issue when i changed my target sdk version to 31 even after setting all the activity with android:exported="false".

The process to find the activity causing issue>>

Open the AndroidManifest file, here in the bottom you will see Merged Manifest, open that tab and build the project. Tab will open, Scroll to the bottom. You will see Errors/merging errors. Analyze that and you will find the Activity name causing this issue.

Add that activity to Manifest and rest you know what you have to do. Hope it helps!!

enter image description here

Manisha Saini
  • 51
  • 1
  • 7
0

I was getting this error thrown what targeting sdk 31 and found that the solution was in my build.gradle file. I was using implementation on my compose test dependency instead of testImplementation.

Seems unrelated I know but when you look at your merge manifest with a misused test dependency you will see tags added for InstrumentedActivity which will be missing the exported=true field.

Joe Hehir
  • 1
  • 1
0

Quoting official docs about this behavior change in android 12, you should look for activities containing intent-filter and those are the ones that need to be updated by setting explicitly the value of android:exported.

Build logs should point exactly to the activity with undeclared exported flag that stopped your build. You should see something like this between the last lines of the console's output of install gradle's commands:

> java.util.concurrent.ExecutionException: com.android.builder.testing.api.DeviceException: com.android.ddmlib.InstallException: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED: Failed parse during installPackageLI: /data/app/xxxxx.tmp/base.apk (at Binary XML file line #129): YOUR.FULLY.QUALIFIED.NAME.FAILING.ACTIVITY: Targeting S+ (version 31 and above) requires that an explicit value for android:exported be defined when intent filters are present

YOUR.FULLY.QUALIFIED.NAME.FAILING.ACTIVITY should point you to the specific activity that is blocking your build.

Here is also the link to the implications of setting android:exported.

0

For people with problems still using Flutter, in addition to putting exported=true in the application's <activity, you need to put it in the <activity of the installed plugins. As I use the simpleauthflutter package, it generates an activity in androidmanifest and I put exported=true. That's the only way to work. It will look like this:

Fabio
  • 53
  • 1
  • 6
0

Add

tools:node="merge"

to

<activity...

and upgrade

androidx.core.test 

to latest version.

Will work like a charm :)

Pietrek
  • 1,420
  • 14
  • 18
0

Copy and paste the gradle script above the root build.gradle file

Gradle Script for Android 12 Required Merge

And execute the task

doAddAndroidExportedIfNecessary

(for Add Automatically the tag required to missing activity - service - receiver )

doAddAndroidExportedForDependencies

(for Add Automatically the tag required to Dependencies missing activity - service - receiver )

Hope this script can resolved your problem

0

Search by phrase "intent-filter" and then add " android:exported="false" to every top xml element

<receiver
        android:name=".listener.SmsListener"
        android:enabled="true"
        android:exported="false"
        >
        <intent-filter android:priority="1000">
            <action android:name="android.provider.Telephony.SMS_RECEIVED" />
        </intent-filter>
</receiver>
Blazej Kita
  • 99
  • 1
  • 1
  • 10
0
My problem was that I didn't find all missing android:exported

I kept looking for missing android:exported="true|false". Added it everywhere I saw. Problem still persisted.

Solution

I had buildToolsVersion = "28.0.3" in gradle so the merge manifest error logs didn't help me at all.

So I upgraded to buildToolsVersion = "31.0.0" and the merge manifest showed me where the missing export was located.

Erik Nguyen
  • 346
  • 2
  • 6
0

Go to the AndroidManifest.xml Click Merged Manifest tab and Find the Keword in project EG: Error: android:exported needs to be explicitly specified for element <activity#com.cpa.accountManagement.ui.authenticated.splash.SplashActivity>. Apps targeting Android 12 and higher are required to specify an explicit value for android:exported when the corresponding component has an intent filter defined. See https://developer.android.com/guide/topics/manifest/activity-element#exported for details. accountManagement.app main manifest (this file), line 52

Find the "SplashActivity" Tag and add android:exported="true"

0

For those who are still facing this error and did not find a solution...

add this is manifest file:

<service
       android:name="org.jitsi.meet.sdk.ConnectionService"
       android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE"
       android:exported="true">
       <intent-filter>
           <action android:name="android.telecom.ConnectionService" />
       </intent-filter>
</service>
Ehsan Abid
  • 43
  • 6
0

Honestly if you're using flutter_local_notifications, and want to skip this whole headache, just use awesome_notifications instead and this will go away...

Manbus
  • 706
  • 4
  • 9
0

Add only these two values in app/build.gradle:

minSdkVersion 21
targetSdkVersion 29
F. Müller
  • 3,969
  • 8
  • 38
  • 49
ajaybadole
  • 121
  • 1
  • 1
  • 6
0

Solution I changed build gradle version from classpath 'com.android.tools.build:gradle:7.0.3' to classpath 'com.android.tools.build:gradle:7.1.2' in "android/build.gradle". But the main reason of error was about the flutter_local_notifications plugin. I deleted it for check and commented my notification service codes. So it successfully generated the app bundle.

Flutter version: 3.0.5

-1

Just update all your dependencies, it should work

Kirill Kitten
  • 1,759
  • 1
  • 4
  • 5
-2

just add this in your AndroidManifest.xml

android:exported="true"

inside your <activity>

Kasyful Anwar
  • 355
  • 2
  • 3
-3

Temporary solution

change compileSdk, targetSdk to

compileSdk 30 targetSdk 30

in gradle file