android:exported needs to be explicitly specified for <activity>. Apps targeting Android 12 and higher are required to specify
Asked Answered
F

39

247

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
            }
        }

    }
}
Fabriane answered 28/7, 2021 at 4:9 Comment(24)
Please share the crash logs here.Hyssop
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).Samalla
@AndroidGeek Merging Errors: Error: android:exported needs to be explicitly specified for <activity>. 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 developer.android.com/guide/topics/manifest/… for details. main manifest (this file)Fabriane
@Samalla Sorry, it was a typing mistake, the application is not compilingFabriane
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?Samalla
@Samalla I have added it to services and activities, but no luck.Fabriane
@Samalla 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.Fabriane
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.Samalla
@Samalla I forgot to mention that I have two manifest files, I have updated the question. Anyway, thank you for your time.Fabriane
android:exported="true" is missing in Activity ui.EasyOnboardingInviteActivity in Second manifest, Please checkHyssop
@AndroidGeek Just added it, not working.Fabriane
@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.Warlock
Have you found a solution? I am wondering the same.Shelled
@Shelled Nope. I am still lookingFabriane
@AshiqueBava does my answer helps you?Hemeralopia
@Hemeralopia I was busy with some other projects. I will check it out as soon as I get time. Thanks for your time.Fabriane
@Hemeralopia please refer to this photo. Even though I have added exported to all the components, it still shows the error.Fabriane
@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 thingsHemeralopia
@Warlock 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 :(Cinematograph
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.Ribwort
Does this answer your question? Manifest merger failed targeting Android 12Crust
See also #69287978.Nardone
This is annoying: I let Android Studio create the app skeleton, and the AS-generated code suffered from this problem!Choric
For this issue in your flutter project check this solutionPetasus
H
207

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.

Hemeralopia answered 4/8, 2021 at 9:31 Comment(9)
after doing a clean project the error will appear again :(Nephelometer
Then you have some unexported entries still. Have check all entries? Broadcast receivers, services, activities and providers?Hemeralopia
@Hemeralopia 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 workGlyco
@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.xmlHemeralopia
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.Whyte
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_manifestsSpigot
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 youAngloindian
Thanks guy. My problem solved, only by setting target SDK to 30.Lichter
dont forget about the prefix : #55334931Goosy
D
73

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)

Dix answered 20/8, 2021 at 18:43 Comment(7)
What should I pass as args?Fabriane
the file path containing your manifest, you can also directly replace args[0] with the path and use the script as a scratchDix
can you please share how to get the manifest file pathFabriane
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 :(Glyco
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.Dix
Here's more info on what to set it to: developer.android.com/about/versions/12/…Humid
I wonder How the value of exported is determined? android:exported="false|true"?Obsess
S
58

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

Sagacious answered 4/1, 2022 at 1:30 Comment(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.Uncaused
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.Judoka
Here, sir, you dropped this 👑.Take
Don't know why this worked, an explanation would be nice. Thanks nonethelessSimulate
this actually worked but will there be any issues in the app in future if I reduce sdkVersion?Lobar
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 workaroundHemeralopia
T
34

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"
Tachygraphy answered 16/10, 2021 at 20:20 Comment(6)
This works in conjunction of having the android:exported="true" and you could also use the ktx version androidx.test.ext:junit-ktxMegrims
That's it! Thank you so much!Feck
This was the correct answer for me, thanks.Allhallowtide
I got error msg: "android:exported needs to be explicitly specified for element <activity#androidx.test.core.app.InstrumentationActivityInvoker$EmptyActivity>", updating androidx.test.ext:junit:1.1.3 did fix the error. Thanks!Trinh
@EricCen more importantly, how did you manage to get such an exact location in error message? (all we get is the raw default-message)Gonsalez
@Gonsalez 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.Trinh
P
29

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.

Peggy answered 20/8, 2021 at 16:21 Comment(4)
this one did the trick. I did not had to add the node=merge line, just the exported=true. thanks Build3r!Luwian
@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 developer.android.com/studio/build/manifest-mergePeggy
There is no tools node attribute anymore developer.android.com/guide/topics/manifest/activity-elementJecoa
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.Ulotrichous
P
24

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.

Pulpwood answered 6/10, 2021 at 17:14 Comment(3)
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) }Hillard
I could not upvote this enough times. I spent HOURS searching for this solution. Made your suggested changes and my app fired right up.Vola
Make sure you upgrade to the latest version of fragmentShortterm
L
17

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"
Leucoma answered 14/10, 2021 at 8:1 Comment(0)
D
17

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

Despumate answered 15/11, 2021 at 8:25 Comment(5)
gave a clue of what to do. thanks.Maemaeander
This was the library I was having trouble with.Fruitage
This is my case! I have solved this by switching the version of androidx.test.ext:junit to 1.1.3. This solution is not requiring any hardcode overridings (and any other lib updates/file modifications), this case, it betterRemaremain
Downgrading from version 1.3.0 to 1.1.3 its not a fix imo.Despumate
This is my case! I have solved this by switching the version of androidx.test:core to last version 1.4.0. This solution is not requiring any hardcode overridings (and any other lib updates/file modifications), this case, it betterAllopatric
D
12
<activity
     android:name=".MainActivity"
     android:exported="true" <** add this line on AndroidManifest.xml**
     android:launchMode="singleTop"
     android:theme="@style/LaunchTheme"
 </activity>
Dumond answered 23/2, 2022 at 14:13 Comment(1)
added bu still givinng errorGamopetalous
A
10

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.

Androecium answered 4/8, 2021 at 9:18 Comment(2)
I have added it to all the activities, but the problem still persits.Fabriane
Thanks, this solution work for me, for more info go here developer.android.com/about/versions/12/…Maravedi
T
9

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

Ticon answered 16/2, 2022 at 0:14 Comment(1)
This was exactly my problem. Thanks a lot!Peppermint
S
7

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.

Solitude answered 22/12, 2021 at 7:14 Comment(0)
T
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.

Tartrazine answered 23/8, 2021 at 10:27 Comment(4)
Check the link and read the comment session with attention, will solve your problem with Android 12. Thanks Raj.Dorey
Not worked for me... I followed the steps on linkBerceuse
What issue are you facing now?Tartrazine
It does not work for me too. Both doAddAndroidExportedIfNecessary and doAddAndroidExportedForDependencies do not add libraries activities. It only added export attribute to the activities/services that already listed in the manifest file.Archfiend
L
5

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)

Lunsford answered 6/12, 2021 at 2:10 Comment(0)
M
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!

Multinational answered 16/6, 2022 at 11:55 Comment(4)
In my case it was OneSignal 3.x too, but I chose to migrate to 4.x.Emblaze
Thanks a lot @Daniel Adenew. It saves a lot of time for meHypostyle
Using the "Merged Manifest" tab is really useful indeed to identify the activity, service or receiver missing the exported attribute. In my case the problem was caused by the android-beacon-library dependency. Upgrading it to latest version fixed the problem.Frederickafredericks
Thank you sir. This line makes the difference: <receiver android:name="com.onesignal.BootUpReceiver" android:exported="true"> So I used your receiver codeAerometry
L
4

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>
Lavina answered 11/1, 2022 at 11:12 Comment(0)
C
4

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.

Campus answered 15/2, 2022 at 22:34 Comment(1)
Solution 2 work for my case. Thank you!Perbunan
F
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!

Frontier answered 24/1, 2023 at 7:12 Comment(0)
H
4

for me adding exported=true in activity section worked

Hothouse answered 25/1, 2023 at 8:17 Comment(0)
R
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.
Rutherfordium answered 22/10, 2022 at 7:35 Comment(0)
U
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" 
Unknowable answered 3/1, 2022 at 14:41 Comment(0)
C
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
}
Corfu answered 3/10, 2022 at 5:19 Comment(0)
W
1

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>
Wheaton answered 22/11, 2022 at 6:48 Comment(0)
P
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

Phyletic answered 17/3, 2023 at 9:42 Comment(0)
T
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.

Turgeon answered 29/9, 2021 at 18:53 Comment(0)
J
0

Just update all your dependencies, it should work

Jeu answered 8/11, 2021 at 11:24 Comment(0)
C
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.

Condominium answered 10/11, 2021 at 15:20 Comment(0)
A
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:

Archine answered 21/4, 2022 at 2:59 Comment(0)
U
0

Add

tools:node="merge"

to

<activity...

and upgrade

androidx.core.test 

to latest version.

Will work like a charm :)

Ulland answered 24/6, 2022 at 15:52 Comment(0)
B
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

Bhatt answered 30/9, 2022 at 12:28 Comment(0)
A
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>
Aaronson answered 15/11, 2022 at 14:11 Comment(0)
P
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.

Palaeobotany answered 17/11, 2022 at 19:28 Comment(3)
@Yunnosch could you be more specific about the formatting noise you are referring to? Is it a reference to the markdown in my post?Palaeobotany
I edited my post to what I though was better after your feedback.Palaeobotany
Thank you. I like it better now. Good luck.Howling
G
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"

Granuloma answered 22/11, 2022 at 5:42 Comment(0)
C
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...

Champlain answered 20/2, 2023 at 0:3 Comment(0)
S
0

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

minSdkVersion 21
targetSdkVersion 29
Stall answered 28/2, 2023 at 12:15 Comment(0)
S
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

Stafford answered 10/3, 2023 at 23:31 Comment(0)
H
0

Try to update the junit library

I use the older junit version (1.1.1) unable to find out this is the cause for this issue. After update to latest version this issue fixed.

androidTestImplementation 'androidx.test.ext:junit:1.1.5'
Hallett answered 14/12, 2023 at 12:16 Comment(0)
P
0

I have tried adding android:exported="true" with all the activities, receiver and services who were containing the <IntentFilter> but the solution didn't work for me, then I try updating my androidTest dependencies to the latest version and it worked for me along with the exported:true, code snippet I tried is mentioned below:

    dependencies {
        androidTestImplementation 'androidx.test:core-ktx:1.4.0' // Use the latest version
        androidTestImplementation 'androidx.test.ext:junit-ktx:1.1.3' // Use the latest version
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' // Use the latest version
        // Check for updates to any other testing libraries you're using
    }
Pursuer answered 18/3 at 20:20 Comment(0)
P
-3

just add this in your AndroidManifest.xml

android:exported="true"

inside your <activity>

Profiterole answered 6/10, 2022 at 1:4 Comment(1)
have to consider "is it right to set to exported=true?".Wordage

© 2022 - 2024 — McMap. All rights reserved.