android:exported needs to be explicitly specified for . Apps targeting Android 12 and higher are required to specify

回答 28 浏览 13.4万 2021-07-28

升级到android 12后,应用程序无法编译。它显示

"Manifest合并失败,有多个错误,请看日志"。

合并后的清单中显示错误。

合并错误:错误:android:exported需要为.NET指定明确的值。针对Android 12和更高版本的应用程序,当相应的组件定义了一个意图过滤器时,需要为android:exported明确指定一个值。详见https://developer.android.com/guide/topics/manifest/activity-element#exported。主清单(该文件)

我已经用android:exported="false"设置了所有的活动。但它仍然显示这个问题。

我的舱单文件。

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

我的第二个舱单文件。

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

我的gradle文件。

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 提问于2021-07-28
请在此分享崩溃的日志。Android Geek 2021-07-28
通常我想我会在app/build/intermediates/manifest_merge_blame_file/下的文件中寻找。但如果在清单合并过程中构建失败,那么也许责备文件甚至没有生成。在这种情况下,我真的不知道。Michael 2021-07-28
@AshiqueBava 正如Michael所指出的,罪魁祸首可能不在合并的清单文件中。我不得不检查"外部库"中列出的每一个清单文件,最后找到了丢失的那个。然后,你要么更新库,要么在他们的问题跟踪器上提交问题。dng 2021-07-28
@Jakoss 我正忙于其他一些项目。我一有时间就会去看看。谢谢你的时间。Ashique Bava 2021-08-18
@dng 谢谢你!!我从来没有发现过这个问题。你一提到它,我就在想"哦,一定是那个第三方lib",并删除了其中的几个。结果发现罪魁祸首是androidx.fragment:fragment-testing:1.3.6 :(anotherdave 2021-09-01
28 个回答
#1楼 已采纳
得票数 139

我遇到了这个问题,我使用的其中一个库没有正确设置。

Find location

首先,我们需要找到错误的确切位置和/或原因,
这可以通过不同的方法来完成(见下文)。

Find by inspecting merged-manifest (approach #1)

你可以通过做步骤找到它。

  • 将目标SDK设置为30(以消除31以上的错误)。

  • 打开应用程序的清单(AndroidManifest.xml),并点击编辑窗格底部的"Merged Manifest"标签:
    Android Studio中合并的清单

    如果你把build.gradle配置成这样:

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

    类似的东西应该在一个子路径中,比如说。

    build/my-app/intermediates/merged_manifest/debug/AndroidManifest.xml
    
  • 进入所有库的单独清单文件(如果创建了合并后的清单,您可以跳过这一步,直接查看合并后的清单即可)。

  • 搜索是否有任何 entry 类型的活动、服务、接收者或提供者不具有 exported 属性,对于每个条目,请遵循“修复找到的条目”部分(或参见一次用于如何设置exported 属性)。

  • 将目标SDK设置为31(或改变为30之前的任何版本)。

Find by console logs (approach #2)

  • 在Git-bash中运行类似于以下的程序。

    ./gradlew assembleDebug --stacktrace --info | tee my-logs.txt
    
  • 打开my-logs.txt文件(上一步创建的,在你喜欢的文本编辑器中).

  • 现在,确切的位置在日志中是隐藏的,因此,在创建的my-logs.txt文件中搜索,这些关键词:

    • activity#
    • service#
    • receiver#
    • provider#
  • 这应该能找到类似的东西。

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
  • 打开前面步骤确实找到的AndroidManifest.xml 文件,搜索是否有任何activityservicereceiverprovider 类型的条目 没有exported 属性,请参阅下面的“修复找到的条目”部分(了解如何设置每个条目的exported 属性)。

注意(在撰写本文时)单独通过--stacktrace 不包括位置信息 ;-)

Fix found entries

如果找到的条目的真正(而不是构建生成的)来源在根项目的清单中(或在你可以改变的地方),将exported属性直接设置为其中的相应需求(通常是false),例如:

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

注意android:exported="..."tools:node="merge"都是上面设置的。

但是,如果发现条目的规范写在第三方库的清单中(这是你无法改变的真实来源),那么通过将其添加到我们的根项目的清单中来覆盖上述库的规范,例如,像。

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

注意这次tools:overrideLibrary="..."也被设置了。

有关详细信息,请参阅文档
和/或 SDK 中的类似问题

Jakoss 提问于2021-08-04
Top-Master 修改于2022-04-27
做完一个干净的项目后,错误又会出现:()Mohammad Sommakia 2021-08-19
那么你还有一些未导出的条目。检查过所有条目吗?广播接收者、服务、活动和提供者?Jakoss 2021-08-19
@Jakoss 是的,兄弟,我们检查了所有的库文件,项目运行良好,但是在重建项目后,gradle会清理本地文件,然后再次下载,并修改我们的编辑,所以这个解决方案不会起作用。Abdulmalek Dery 2021-08-24
@AbdulmalekDery 看我的回答,你没有修改临时文件中的清单。你必须为你的manifest.xml中的所有条目添加tools:node="merge"条目。Jakoss 2021-08-24
我有两个来自第三方依赖的接收器,没有显示在Android Studio的合并清单中,但确实显示在app/build/intermediates/merged_manifests中。hmac 2022-04-05
#2楼
得票数 56

修复这样的问题可能有点麻烦,因为 IDE 没有提供错误的详细信息,它只是告诉你有一个没有导出参数的 Activity、Receiver 或 Service,但没有告诉你是哪一个是。正如 Jakos 建议的那样,您可以手动检查合并的清单,或使用 this脚本,以防生成的清单太大。

之后,你可以通过添加导出的属性来修改受影响的条目,如果它是你项目的一部分,或者覆盖它,如果它是一个库的一部分,你可以用。

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

更新: 当针对 android S 并且检测到此问题时,清单合并任务似乎失败而没有生成清单,因此我的建议是使用低于 31 的 targetSdk 编译应用程序,然后手动或使用我链接的脚本检查生成的清单. (您可以在 build 文件夹或通过检查生成的 apk 找到合并的清单)

Raymond Arteaga 提问于2021-08-20
Raymond Arteaga 修改于2021-08-23
我应该把什么作为args传给对方?Ashique Bava 2021-08-22
包含您的清单的文件路径,您也可以直接用路径替换args[0],并将该脚本作为抓取的对象。Raymond Arteaga 2021-08-22
请分享一下如何获得清单文件的路径Ashique Bava 2021-08-23
这个解决方案是行不通的,因为在更新库的清单后,gradle会在未来的同步中删除本地的变化,你必须重新编辑清单,所以现在google建议的唯一解决方案是要求库的开发者更新他们的仓库:(Abdulmalek Dery 2021-08-24
这里有更多关于将其设置为什么的信息。developer.android.com/about/versions/12/…AaronC 2021-10-06
#3楼
得票数 35

targetSdkVersion 改回 30
你可以在 31 离开 compileSdkVersion
然后点击运行

ericfranzee 提问于2022-01-04
ericfranzee 修改于2022-01-04
嗨,Eric,首先,感谢你成为新的贡献者,这是帮助别人的最好方式。关于你的答案,如果你能更详细一些,以便其他人能够理解答案的深度,那就更好了。也许可以解释一下,你是如何遇到同样的问题,以及你是如何设法解决的。Manjunath Reddy 2022-01-04
您的答案可以通过额外的支持信息得到改进。请编辑以添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到更多关于如何写好答案的信息。Community 2022-01-04
这对我来说很有效,谢谢,节省了我的时间。MD.Riyaz 2022-03-09
在这里,先生,你把这个👑掉了。Petetheodddog 2022-03-10
减少SdkV版本只是将问题推迟到以后。Google Play正在强制执行某些TargetSdkV版本,因此你必须在几个月内将其作为目标。瞄准最新的版本总是好的做法,这样你就可以使用安卓操作系统的最新版本了。因此,这里的答案不是一个解决方案,只是一个临时的变通办法。Jakoss 2022-08-04
#4楼
得票数 25

对于插桩测试,如果您正在使用 compose 测试,请确保在 compose.ui 依赖项之外添加 androidx.test.ext:junit

androidTestImplementation "androidx.test.ext:junit:1.1.3"
androidTestImplementation "androidx.compose.ui:ui-test-junit4:1.0.4"
Saba 提问于2021-10-16
这与拥有android:exported="true"的工作相结合,你也可以使用ktx版本的androidx.test.ext:junit-ktxRenato 2021-10-30
这就是了!非常感谢您!Silas Pedrosa 2021-11-29
这对我来说是正确的答案,谢谢。Dieseled UP 2022-01-28
我得到了错误的味精:"android:exported需要明确指定元素<activity#androidx.test.core.app.InstrumentationActivityInvoker$EmptyActivity>",更新androidx.test.ext:junit:1.1.3确实解决了错误。谢谢!Eric Cen 2022-03-10
@EricCen 更重要的是,你是如何在错误信息中获得如此准确的位置的? 我们得到的只是原始的默认信息。Top-Master 2022-04-23
#5楼
得票数 24

检查你的build.gradle文件是否有以下内容:

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

如果存在,则将其改为。

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

它应该一直是androidTestImplementation,但之前存在一些依赖问题,因此有必要使用debugImplementation 作为解决方法。 IDE 实际上会提示您执行此操作。但显然它已针对 SDK 31 进行了修复,如果将其保留为 debugImplementation,则会收到来自依赖包中的 manifest.xmlandroid:exported-missing 清单错误。

Ben 提问于2021-10-06
解决了一个问题,但又出现了新的问题。然后我的测试失败了,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 2021-10-19
我无法对这一点给予足够的支持。我花了好几个小时来寻找这个解决方案。做了你建议的改动后,我的应用程序就启动了。whitaay 2021-10-25
请确保你升级到最新版本的fragmentIbramazin 2021-12-09
#6楼
得票数 20

在构建失败后,进入AndroidManifest.xml,在底部点击合并清单,查看哪些活动有intent-filter但没有exported=true属性。 或者你可以直接获得那些出错的活动。

将这些活动添加到您的应用程序清单中,并添加android:exported="true"和应用程序tools:node="merge",这将为活动添加导出的属性,从而产生错误。 示例:

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

你必须这样做一次,一旦库的开发者更新了他们的库,你就可以将其删除。

Build3r 提问于2021-08-20
这个方法很有效。我不需要添加node=merge行,只需添加exported=true。Federico Alvarez 2021-09-08
@FedericoAlvarez 添加tools:node="merge"将保留所有其他开发者打算拥有的字段。没有它,你的修改将取代原来的。我强烈建议加入tools:node="merge" 更多细节请点击 developer.android.com/studio/build/manifest-mergeBuild3r 2021-09-13
#7楼
得票数 13

作为目标 sdk 更新到 31 android 12,因此您必须在 manifest.xml 中的活动午餐器中执行 android 导出

 android:exported="true"
Mazhar Iqbal 提问于2021-10-14
#8楼
得票数 13

我的问题是test:core:1.3.0(见屏幕截图)。

我不得不覆盖这个库的清单条目,并声明android:exported属性:

<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 提问于2021-11-15
提供了一个做什么的线索。 谢谢。AbdulMomen عبدالمؤمن 2022-01-06
这是我遇到麻烦的图书馆。dazza5000 2022-01-21
这就是我的情况!我已经通过把androidx.test.ext:junit的版本换成1.1.3来解决这个问题了。这个解决方案不需要任何硬编码重写(以及任何其他lib的更新/文件修改),这种情况下,它更好地Egor 2022-01-29
从1.3.0版本降级到1.1.3版本,这并不是一种修复,我认为。Goran Horia Mihail 2022-01-29
这就是我的情况!我已经通过将androidx.test:core的版本切换到最新的1.4.0版本来解决这个问题了。这个解决方案不需要任何硬编码重写(以及任何其他lib更新/文件修改),这种情况下,它更好地Shahriar enayaty 2022-03-14
#9楼
得票数 11
<activity
     android:name=".MainActivity"
     android:exported="true" <** add this line on AndroidManifest.xml**
     android:launchMode="singleTop"
     android:theme="@style/LaunchTheme"
 </activity>
zeev grim 提问于2022-02-23
#10楼
得票数 6

我不确定你用什么来编码,但为了在 Android Studio 中设置它,打开你的项目清单并在“活动”部分下,输入 android:exported="true "(如果您喜欢,则为 false)。 我附上了一个例子。

Thomas Glasser 提问于2021-08-04
我已经把它添加到所有的活动中,但问题仍然存在。Ashique Bava 2021-08-04
谢谢,这个解决方案对我有用,更多信息请点击developer.android.com/about/versions/12/&hellip.html。mycky 2022-03-08
#11楼
得票数 5

如果您的应用以Android 12或更高版本为目标,您必须在应用的清单文件中声明这些归属标签。 如果应用组件包括LAUNCHER类别,请将android:exported设置为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">

还要检查Androidmanifest中的接收器或服务,如果你正在使用任何接收器或服务,请根据要求设置android:exported="true"或false。

   <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" />

同时更新你所有的gradle依赖性。

我已经按照要求更新了以下的依赖关系。

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'

希望它也能对你有所帮助。

Kishan Thakkar 提问于2021-12-22
#12楼
得票数 4

我碰巧知道安卓12系统中的这个问题。Android SDK中已经提出了一个错误。为了解决你的问题,这里有一个文件,你可以在android studio中添加并运行该方法。

启用安卓系统导出的文件

然后运行def方法,并尝试建立。 这是经过测试的工作方法。

raj kavadia 提问于2021-08-23
检查链接并注意阅读评论环节,将解决你在Android 12上的问题。谢谢你,拉吉。Canato 2021-09-01
对我来说没有用...我按照链接上的步骤Gabriel Almeida 2021-10-09
你现在面临的是什么问题?raj kavadia 2021-10-10
它对我也不起作用。doAddAndroidExportedIfNecessary和doAddAndroidExportedForDependencies都没有添加库活动。它只向清单文件中已经列出的活动/服务添加了导出属性。firemaples 2021-10-28
#13楼
得票数 4

如果你确定在清单文件中的每个元素都添加了导出,但仍有此错误,只需......。

  1. 切换到项目目录,打开app/build/intermediates/merged_manifest中的合并清单文件。
  2. 搜索任何包含intent-filter且没有导出属性的组件。
  3. 在您的清单文件中覆盖此组件,将其复制粘贴到您的主清单文件中去。

提示:如果你找不到合并文件,因为它已经无法生成.临时降级到targetSdkV30版本,并编译SdkV30版本,构建项目以生成该文件,然后按照上述步骤操作,然后升级到31(android12)。

Sherif farid 提问于2021-12-06
cigien 修改于2021-12-06
#14楼
得票数 3

发现这个解决方案这里,对我有用。这是razorpay官方github提供的。他们已经提到他们会在下一个版本中修复它。

<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 提问于2022-01-11
#15楼
得票数 3

情况1:没有子模块或库

这个问题从SDK 31开始。如果你没有任何库或子模块,请添加

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

你可以在标签上点击右键,Android Studio会向你建议。

情况2:有子模块或库

如果你有其他要导入的库或模块,你也必须覆盖它们。关于这一点,请看 "合并清单 "标签。 或者你可以打开

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

在一个编辑器中。我更喜欢第二种方法,因为合并后的清单不允许从Android Studio中搜索。

  1. 复制<activity>、<receiver>或任何其他导致构建错误的东西。
  2. 将它们粘贴到主运载工具上
  3. 根据需要添加android:exported="true"或者android:exported="false"。
  4. 重建工作

情况3:如果上述任何一项都不起作用

如果上述方法都不奏效,你将不得不等待,直到你的库提供商做出必要的改变。在他们做出改变之前,你可以将SDK版本恢复到30或更低。降低SDK应该可以暂时解决这个问题。

Vishudh Sasidharan 提问于2022-02-15
Vishudh Sasidharan 修改于2022-02-15
解决方案2适用于我的情况。谢谢你!"。Hoang Lam 2022-09-06
#16楼
得票数 3

如果你正在使用flutter,升级flutter_local_notifications到最新版本(现在是9.3.2)可能会解决这个错误..

Amer Alzibak 提问于2022-02-16
这正是我的问题。非常感谢!Kabuki 2022-03-05
#17楼
得票数 3

这是在升级您的TargetSDK 32或支持API Android 12的Android Studio后最常见的问题。

与此相关,这是我的错误。

enter image description here

这些错误是:。

 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.

然后通过使用合并后的Mainfest Clikc在Libirary上有错误的instacne onesingal。

enter image description here

然后复制错误,如果其接收部分,并将其添加到您的主清单文件中,如下所示,用

安卓:导出

设置为真实就可以了。

和他们

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

工作得很顺利!

Daniel Adenew 提问于2022-06-16
在我的情况下,它也是OneSignal 3.x,但我选择了迁移到4.x。MingalevME 2022-08-17
非常感谢@Daniel Adenew。它为我节省了很多时间Muhammad Zeeshan 2022-10-13
#18楼
得票数 1

我的问题是,我们使用的是较早的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"在引擎盖下依赖于核心测试库1.3.0,该库确实设置了导出的属性。

要解决这个问题,请确保你使用的是最新的匕首柄版本(2.40.5版可以)。

"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" 
Jokubas Trinkunas 提问于2022-01-03
#19楼
得票数 0

我在使用sdk 31时遇到了这个错误,并发现解决办法在我的build.gradle文件中。我在编译测试依赖中使用了implementation,而不是testImplementation

我知道这似乎不相关,但是当您查看带有误用测试依赖项的合并清单时,您会看到为 InstrumentedActivity 添加的标签将缺少 exported=true 字段。

Joe Hehir 提问于2021-09-29
#20楼
得票数 0

引用 关于 android 12 中这种行为变化的官方文档,您应该寻找包含intent-filter 的活动,这些活动需要通过明确设置android:exported 的值来更新。

构建日志应该准确地指向停止你的构建的带有未声明的导出标志的活动。你应该在installgradle的命令的控制台输出的最后几行之间看到类似这样的东西:

> 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应该指向阻止你构建的具体活动。

这里还有链接到设置android:exported的意义

Fernando Jascovich 提问于2021-11-10
#21楼
得票数 0

对于还在使用Flutter的人来说,除了在应用程序的<活动中放上exported=true,你还需要在安装的插件的<活动中放上它。 因为我使用的是simpleauthflutter包,它在androidmanifest中生成了一个活动,我把exported=true放上了。这是唯一可行的方法,看起来会是这样的

Fabio 提问于2022-04-21
#22楼
得票数 0

添加

tools:node="merge"

<activity...

和升级

androidx.core.test 

到最新的版本。

将像一个魅力的工作:)

Pietrek 提问于2022-06-24
#23楼
得票数 0

复制并粘贴gradle脚本到根build.gradle文件的上方。

需要合并的 Android 12 Gradle 脚本

并执行该任务

doAddAndroidExportedIfNecessary(如果需要的话)。

(为缺失的活动--服务--接收者自动添加所需标签)

doAddAndroidExportedForDependencies

(用于自动添加所需的标签到缺少活动-服务-接收者的依赖关系)。

希望这个脚本可以解决你的问题。

Alex - Exaland Concept 提问于2022-09-30
#24楼
得票数 0

就我而言,我将fragment-testing 更新为1.5.3 版本,这对我有帮助:

dependencies {
    debugImplementation androidx.fragment:fragment-testing:1.5.3
}
Husniddin Madaminov 提问于2022-10-03
#25楼
得票数 0

当我们把targetSkdVersion=31改成最新的12版本时,这个错误就会发生,如果我们没有在启动器活动中使用android:exported="true"在其他intent_filter、服务或广播接收器中使用android:exported="false"我们应该像这样只在启动器活动中写android:exported="true":

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

并为服务或广播接收器等写上android:exported="false",就像这些。

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

但是,如果这些服务或广播接收器在实现的库中使用,这意味着它将在库的清单文件中。因此,我们将从这些库的清单文件中复制这些服务和广播接收器等,并将其粘贴到我们的主活动清单中,就像上面我将start.io sdk的intent_fileter、服务或广播接收器植入我的应用程序中复制到我的主清单文件。

如何将合并舱单文件复制到主舱单文件

  • 打开你的项目的AndroidManifest.xml。
  • 在窗口的底部,点击合并后的舱单标签。
  • 寻找任何包括intent-filter标签且缺少android:exported属性的活动。
  • 现在将所有这些复制到主清单文件中。
Pir Fahim Shah 提问于2022-10-22
#26楼
得票数 -1

只要更新你的所有依赖关系,就应该可以工作了。

Kirill Kitten 提问于2021-11-08
#27楼
得票数 -1

只需在你的AndroidManifest.xml中添加这个内容即可。

android:exported="true"

在您的 <activity>

Kasyful Anwar 提问于2022-10-06
#28楼
得票数 -3

暂时的解决方案

将compileSdk、targetSdk改成

编译SDK 30 目标SDK 30

在gradle文件中

INFINITY GUY 提问于2021-08-21
这如何解决了问题呢?Jakoss 2021-08-22
事实上,这是目前唯一的解决方案。Mostafa King 2021-10-17
@MostafaKing 不,目前正确的解决方案是将第三方libs'元素声明为已导出。artem 2021-10-28