Después de actualizar a Android 12, la aplicación no se compila. Muestra
"La fusión del manifiesto falló con múltiples errores, consulte los registros"
Error que se muestra en el manifiesto combinado:
Errores de fusión: Error: android:exported debe especificarse explícitamente para . Las aplicaciones destinadas a Android 12 y versiones posteriores deben especificar un valor explícito para
android:exported
cuando el componente correspondiente tiene un filtro de intenciones definido. Consulte https://developer.android.com/guide/topics/manifest/activity-element#exported para obtener más detalles. manifiesto principal (este archivo)
He configurado toda la actividad con android:exported="false"
. Pero todavía muestra este problema.
Mi archivo de manifiesto:
<?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>
Mi segundo archivo de manifiesto:
<?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>
Mi archivo 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 } } } }
No estoy seguro de qué está usando para codificar, pero para configurarlo en Android Studio, abra el manifiesto de su proyecto y en la sección "actividad", coloque android:exported="true" (o falso si eso es lo que prefieres). He adjuntado un ejemplo.
Tuve este problema y una de las bibliotecas que usé no estaba configurada correctamente.
Puedes encontrarlo siguiendo los pasos:
exported
y configúrelo según las necesidades correspondientes. Podemos anular la especificación escrita en el manifiesto de una biblioteca agregándola al manifiesto de nuestra aplicación. Más información: Documentación , Problema similar en un SDK . <receiver android:name="<name_of_the_entry>" android:exported="false or true" tools:node="merge" />
Encontré esta solución aquí , funciona para mí. Esto lo da el github oficial de razorpay. Han mencionado que lo arreglarán en la próxima versión.
<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>
Mi problema era que estábamos usando la versión anterior de empuñadura 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" bajo el capó depende de la biblioteca de pruebas principal 1.3.0, que establece las propiedades exportadas.
Para solucionar esto, asegúrese de estar usando la última versión de empuñadura de daga (2.40.5 funciona):
"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"
Cambiar targetSdkVersion
de nuevo a 30
Puede dejar compileSdkVersion
en 31
Luego presiona Ejecutar
Si su aplicación está orientada a Android 12 o superior, debe declarar estas etiquetas de atribución en el archivo de manifiesto de su aplicación. Si el componente de la aplicación incluye la categoría LAUNCHER, establezca android:exported en verdadero.
<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">
También verifique el receptor o el servicio en Androidmanifest, si está utilizando algún receptor o servicio, configure Android: exported="true" o false según el requisito.
<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" />
También actualice toda su dependencia de gradle.
He actualizado la siguiente dependencia según el requisito.
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'
Espero que te ayude a ti también.
Citando documentos oficiales sobre este cambio de comportamiento en Android 12 , debe buscar actividades que contengan intent-filter
y esas son las que deben actualizarse configurando explícitamente el valor de android:exported
.
Los registros de compilación deben apuntar exactamente a la actividad con el indicador de exportación no declarado que detuvo la compilación. Debería ver algo como esto entre las últimas líneas de la salida de la consola de los comandos de install
de gradle:
> 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
debe indicarte la actividad específica que está bloqueando tu compilación.
Aquí también está el enlace a las implicaciones de configurar android:exported
.
El problema en mi caso fue test:core:1.3.0 (ver captura de pantalla).
Tuve que anular las entradas del manifiesto para esta biblioteca y declarar la propiedad 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"/>
Simplemente actualice todas sus dependencias, debería funcionar
Si está seguro de agregar exportado a cada elemento en el archivo de manifiesto y aún recibe este error, simplemente:
Sugerencia: si no puede encontrar el archivo combinado porque ya no pudo generarlo, cambie temporalmente a targetSdkVersion 30 y compileSdkVersion 30 y cree el proyecto para generar este archivo y luego siga los pasos anteriores y luego actualice a 31 (android 12)
Para la prueba instrumentada, si está utilizando la prueba de redacción, asegúrese de agregar androidx.test.ext:junit
además de las dependencias de compose.ui
androidTestImplementation "androidx.test.ext:junit:1.1.3" androidTestImplementation "androidx.compose.ui:ui-test-junit4:1.0.4"
como la actualización de SDK de destino a 31 Android 12, por lo que debe exportar Android en su almuerzo de actividad en manifest.xml
android:exported="true"
Recibí este error que apuntaba a SDK 31 y descubrí que la solución estaba en mi archivo build.gradle. Estaba usando la implementation
en mi dependencia de prueba de redacción en lugar de testImplementation
.
Parece no estar relacionado, lo sé, pero cuando observa su manifiesto de fusión con una dependencia de prueba mal utilizada, verá etiquetas agregadas para InstrumentedActivity
a las que les faltará el campo exported=true
.
Verifique su archivo build.gradle
para:
debugImplementation "androidx.fragment:fragment-testing:<version>"
y si está presente, cámbielo a:
androidTestImplementation "androidx.fragment:fragment-testing:<version>"
Siempre debería haber sido androidTestImplementation
, pero antes había algún problema de dependencia y era necesario usar debugImplementation
como solución alternativa. El IDE en realidad le pidió que hiciera esto. Pero evidentemente está arreglado para SDK 31, y si lo deja como debugImplementation, obtiene el error de manifiesto android:exported
exported -missing que proviene de un manifest.xml
en un paquete dependiente.
Solución temporal
cambie compileSdk, targetSdk a
compilar SDK 30 destino SDK 30
en archivo gradle
Después de que la compilación haya fallado, vaya a AndroidManifest.xml y, en la parte inferior, haga clic en el manifiesto combinado para ver qué actividades tienen intent-filter
pero no tienen el atributo exported=true
. O simplemente puede obtener las actividades que dan error.
Agregue estas actividades al manifiesto de su aplicación con android:exported="true"
y tools:node="merge"
esto agregará el atributo exportado a las actividades que dan error. Ejemplo:
<activity android:name="<activity which is giving error>" android:exported="true" tools:node="merge" />
Tendrá que hacer esto una vez, puede eliminarlo una vez que los desarrolladores de la biblioteca actualicen sus bibliotecas.
Solucionar este problema puede ser un poco engorroso, porque el IDE no brinda detalles sobre el error, solo le dice que hay una Actividad, Receptor o Servicio sin el parámetro exportado, pero no le dice cuál es. Como recomienda Jakos, puede verificar manualmente el manifiesto fusionado o usareste script en caso de que el manifiesto generado sea demasiado grande.
Después de eso, puede modificar las entradas afectadas agregando el atributo exportado si es parte de su proyecto, o anularlo si es parte de una biblioteca con:
<activity android:name="name_of_the_activity_inside_library>" android:exported="false|true" tools:node="merge" />
ACTUALIZACIÓN: la tarea de fusión del manifiesto parece fallar sin generar el manifiesto cuando se dirige a Android S y se detectan estos problemas, por lo que mi consejo es compilar la aplicación usando un targetSdk inferior a 31 y luego inspeccionar el manifiesto generado manualmente o usando el script enlacé. (puede encontrar el manifiesto fusionado en la carpeta de compilación o inspeccionando el apk generado)
Resulta que conozco ese problema en Android 12 específicamente. Ya hay un error planteado en Android SDK. En la solución de su problema, aquí hay un archivo que puede agregar en Android Studio y ejecutar el método.
Habilitar archivo exportado de Android
Luego ejecute los métodos de definición e intente compilar. Es un método de trabajo probado y probado.
<activity android:name=".MainActivity" android:exported="true" <** add this line on AndroidManifest.xml** android:launchMode="singleTop" android:theme="@style/LaunchTheme" </activity>
Caso 1: sin submódulos ni bibliotecas
Este problema comenzó con SDK 31. Si no tiene bibliotecas o submódulos, agregue
android:exported="true" <!-- or false as required -->
Puede hacer clic derecho en la etiqueta y Android Studio le sugerirá.
Caso 2: Con submódulos o bibliotecas
Si tiene otras bibliotecas o módulos que está importando, también debe anularlos. Para eso, vea la pestaña 'Manifiesto combinado'. O puede abrir
<ProjectRoot>/app/build/intermediates/merged_manifest/<su sabor>/AndroidManifest.xml
en un editor. Prefiero el segundo método, ya que el manifiesto combinado no permite buscar desde Android Studio.
Caso 3: Si nada de lo anterior funciona
Si nada de lo anterior funciona, tendrá que esperar hasta que el proveedor de su biblioteca realice los cambios necesarios. Hasta que realicen cambios, puede revertir la versión SDK a 30 o inferior. Bajar SDK debería solucionar el problema temporalmente.
si está utilizando flutter, actualizar flutter_local_notifications
a la última versión (ahora es 9.3.2) puede resolver este error.