Qué significa “android:exported needs to be explicitly specified”
“Manifest merger failed: 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.” significa que el manifiesto final contiene una actividad, un servicio o un receptor de difusión con un filtro de intents, pero sin una configuración explícita de acceso. Se aplica cuando la aplicación está orientada a Android 12/API 31 o una versión posterior.
Los mensajes equivalentes para <activity>, <service> o <receiver> corresponden al mismo problema. android:exported controla si otras aplicaciones pueden iniciar ese componente. No lo establezcas en true solo para que la compilación se complete. Primero identifica el componente exacto y el manifiesto de origen en la salida combinada. Consulta el requisito oficial de Android 12 sobre componentes exportados.
Esta guía se limita a actividades, servicios y receptores con filtros de intents. Los proveedores de contenido no son una variante equivalente habitual de este error de Android 12.
Localiza el componente que falla y el manifiesto al que pertenece
Usa la salida del combinador de manifiestos antes de modificar el manifiesto de la aplicación. La entrada afectada puede proceder del módulo de la aplicación, una variante de compilación, un módulo de pruebas, un manifiesto generado o una dependencia de terceros.
- Abre el archivo
AndroidManifest.xmldel módulo afectado en Android Studio. - Selecciona Merged Manifest.
- Selecciona la actividad, el servicio o el receptor afectados.
- Usa Merging Log y Manifest Sources para identificar el manifiesto que lo aporta.
- Si es necesario, revisa el informe de compilación del combinador de manifiestos.
- Corrige el manifiesto al que pertenece el componente, o usa una regla de combinación específica con mayor prioridad solo cuando se cumplan sus requisitos previos.
Resultado esperado: conoces el tipo de componente, su nombre y la fuente del manifiesto responsable del atributo ausente o en conflicto. Esto tiene un riesgo bajo y no requiere reversión en tiempo de ejecución; revierte únicamente un cambio en el manifiesto si falla una validación posterior. Android documenta la vista combinada, los registros, las fuentes, los informes y los marcadores de combinación en su documentación sobre cómo administrar los archivos de manifiesto.
Elige el valor correcto para android:exported
Para un componente que te pertenece o que puedes editar, agrega un valor explícito en el manifiesto al que pertenece y, después, vuelve a compilar la variante afectada e inspecciona el manifiesto combinado final.
| Finalidad del componente | Valor apropiado | Motivo |
|---|---|---|
| Actividad de inicio de la aplicación | android:exported="true" |
El iniciador es un punto de entrada externo a la aplicación. |
| Actividad, servicio o receptor que debe ser externo intencionalmente | android:exported="true" |
Úsalo solo cuando otra aplicación deba invocarlo. |
| Servicio solo interno | android:exported="false" |
Evita el acceso externo innecesario. |
| Receptor solo interno | android:exported="false" |
Evita el acceso externo innecesario. |
- Abre el manifiesto al que pertenece el componente afectado.
- Agrega
android:exported="true"solo cuando aplicaciones externas deban acceder a él. - Agrega
android:exported="false"cuando sea solo interno. - Vuelve a compilar la variante afectada.
- Confirma que el Merged Manifest final conserva el valor revisado.
Riesgo: bajo para la edición del manifiesto, pero establecer true expone el componente al acceso externo. Los filtros de intents no proporcionan por sí solos un control de acceso suficiente para un componente expuesto. Revisa las implicaciones de seguridad con la guía de Android sobre la seguridad de android:exported. Para revertirlo, elimina o modifica únicamente el atributo agregado y vuelve a compilar.
Corrige el caso de la actividad MAIN y LAUNCHER
Si la actividad afectada tiene un filtro de intents que contiene MAIN y LAUNCHER, es el punto de entrada de la aplicación y normalmente debe declarar android:exported="true".
- Busca la actividad con el filtro de intents
MAINyLAUNCHER. - Establece
android:exported="true"en esa actividad. - Compila la aplicación.
- Instálala o ejecútala y verifica que el icono del iniciador abra la actividad prevista.
Resultado esperado: la actividad de inicio tiene un estado exportado explícito y sigue pudiendo iniciarse. Esto no resuelve un error distinto que nombre específicamente un servicio o receptor. El riesgo es bajo; restaura la declaración anterior únicamente si la actividad ya no es un punto de entrada del iniciador.
Si el componente procede de una dependencia, un módulo de pruebas o un manifiesto generado
Si Merged Manifest muestra que otra entrada es propietaria del componente, no supongas que el manifiesto principal de la aplicación es el lugar correcto para editarlo. Diagnostica la dependencia que realmente contribuye, la biblioteca transitiva, el módulo de pruebas, la variante de compilación o el manifiesto generado.
Opción cautelosa: si el origen parece obsoleto, comprueba si hay una actualización de dependencia compatible antes de mantener una anulación local. Una actualización puede eliminar o corregir la declaración, pero no está garantizado y debe probarse en la variante afectada. Confirma que las funciones necesarias de la dependencia sigan funcionando y que el manifiesto combinado final contenga el valor previsto.
No elimines un componente aportado solo para quitar el error. Puede ser necesario para una función de la biblioteca.
Usa una anulación específica del combinador de manifiestos solo cuando sea necesaria
Usa una anulación solo después de que Merged Manifest demuestre que un manifiesto de menor prioridad define el mismo componente y existe un conflicto real en el atributo exported. La declaración de mayor prioridad debe identificar el mismo componente mediante android:name.
Anula un valor exported revisado
- Declara el espacio de nombres tools en el manifiesto de mayor prioridad.
- Declara el componente coincidente con el valor de
android:exportedprevisto. - Usa
tools:replace="android:exported"solo cuando exista un conflicto real de atributos. - Inspecciona Merged Manifest para confirmar el resultado.
- Vuelve a compilar y prueba la ruta de entrada prevista del componente.
Riesgo: medio. Una anulación puede cambiar el acceso externo. Revierte el cambio eliminando la declaración de anulación del componente y tools:replace; después, vuelve a compilar.
Elimina un componente de biblioteca cuya falta de necesidad esté demostrada
- Verifica que el componente no sea necesario para la dependencia ni para una función de la aplicación.
- Agrega una declaración de componente coincidente en el manifiesto de mayor prioridad.
- Aplica
tools:node="remove"a ese componente. - Inspecciona Merged Manifest para confirmar la eliminación.
- Compila la aplicación y prueba las funciones de la dependencia que podrían usar el componente eliminado.
Riesgo: medio. Eliminar un componente puede afectar al comportamiento de una biblioteca. Revierte el cambio eliminando la declaración tools:node="remove" y volviendo a compilar.
Verifica la corrección en el manifiesto final y el comportamiento de la aplicación
- Confirma que Merged Manifest muestre un valor explícito y revisado de
android:exporteden el componente afectado. - Compila correctamente la variante afectada.
- Prueba la ruta de entrada prevista: iniciador, vínculo profundo, servicio o comportamiento del receptor, según corresponda.
- Si cambió una entrada de dependencia, prueba las funciones de la dependencia que podrían invocar o depender de ese componente.
- Para un componente accesible externamente, revisa manualmente si sus llamadores necesitan protección mediante permisos o validación del llamador además del estado exported.
Una compilación correcta confirma que se cumple el requisito de combinación, pero no demuestra por sí sola que el componente sea seguro o se comporte según lo previsto. Compartir URI de archivos es un problema de control de acceso independiente: consulta la guía para compartir archivos con FileProvider en lugar de exponer URI de archivos en vez de exportar componentes de forma general. Del mismo modo, los errores de la política de seguridad de red de Android son independientes de este fallo del combinador de manifiestos.
Preguntas frecuentes
¿Debo establecer android:exported=”true” para corregir este error?
No. Usa true solo cuando otras aplicaciones deban invocar el componente. Usa false para actividades, servicios y receptores solo internos; después, verifica la salida combinada.
¿Por qué el error continúa después de modificar mi actividad de inicio?
El componente que falla puede ser otra actividad, servicio o receptor, o puede proceder de una dependencia, un módulo de pruebas, una variante o un manifiesto generado. Revisa Merged Manifest y sus fuentes.
¿Puedo usar tools:replace=”android:exported”?
Solo cuando un manifiesto de mayor prioridad defina el mismo componente y exista un conflicto real en el atributo exported. Inspecciona el resultado combinado final y prueba la ruta de entrada prevista del componente.

