Skip to content

Most visited

Recently visited

navigation

Manifiesto de la app

Todas las aplicaciones deben tener un archivo AndroidManifest.xml (con ese nombre exacto) en el directorio raíz. El archivo de manifiesto proporciona información esencial sobre tu aplicación al sistema Android, información que el sistema debe tener para poder ejecutar el código de la app.

Entre otras cosas, el archivo de manifiesto hace lo siguiente:

Nota: Cuando prepares tu app de Android para que se ejecute en equipos Chromebook, debes tener en cuenta ciertas limitaciones importantes de funcionalidad de hardware y software. Si deseas obtener más información, consulta el documento Compatibilidad con manifiestos de apps para equipos Chromebook.

Estructura del archivo de manifiesto

El siguiente fragmento de código muestra la estructura general del archivo de manifiesto y todos los elementos que puede contener. Cada elemento, junto con todos sus atributos, se documenta por completo en un archivo separado.

Sugerencia: Para ver información detallada sobre cualquiera de los elementos mencionados en este documento, solo debes hacer clic en el nombre del elemento.

A continuación, se ofrece un ejemplo de archivo de manifiesto:

<?xml version="1.0" encoding="utf-8"?>

<manifest>

    <uses-permission />
    <permission />
    <permission-tree />
    <permission-group />
    <instrumentation />
    <uses-sdk />
    <uses-configuration />  
    <uses-feature />  
    <supports-screens />  
    <compatible-screens />  
    <supports-gl-texture />  

    <application>

        <activity>
            <intent-filter>
                <action />
                <category />
                <data />
            </intent-filter>
            <meta-data />
        </activity>

        <activity-alias>
            <intent-filter> . . . </intent-filter>
            <meta-data />
        </activity-alias>

        <service>
            <intent-filter> . . . </intent-filter>
            <meta-data/>
        </service>

        <receiver>
            <intent-filter> . . . </intent-filter>
            <meta-data />
        </receiver>

        <provider>
            <grant-uri-permission />
            <meta-data />
            <path-permission />
        </provider>

        <uses-library />

    </application>

</manifest>

La siguiente lista contiene todos los elementos que pueden aparecer en el archivo manifiesto (en orden alfabético):

Nota: Estos son todos los elementos permitidos; no puedes agregar elementos o atributos propios.

Convenciones del archivo

En esta sección, se describen las convenciones y las reglas que generalmente se aplican a todos los elementos y atributos del archivo de manifiesto.

Elementos
Solo se requieren los elementos <manifest> y <application>. Cada uno de ellos debe estar presente y solo puede ocurrir una vez. La mayoría de los otros elementos pueden ocurrir varias veces o ninguna. Sin embargo, al menos algunos de ellos deben estar presentes para que el archivo de manifiesto sea útil.

Si un elemento contiene algo, serán otros elementos. Todos los valores se establecen mediante atributos, en lugar de datos de caracteres en un elemento.

Por lo general, los elementos de un mismo nivel no están ordenados. Por ejemplo, los elementos <activity>, <provider> y <service> se pueden alternar en cualquier secuencia. Hay dos excepciones importantes a esta regla:

  • Un elemento <activity-alias> debe seguir el <activity> en el que funciona como alias.
  • El elemento <application> debe ser el último dentro del elemento <manifest>. En otras palabras, la etiqueta de cierre de </application> debe aparecer inmediatamente antes de la etiqueta de cierre de </manifest>.
Atributos
En términos formales, todos los atributos son opcionales. Sin embargo, existen algunos atributos que deben especificarse para que un elemento cumpla con su propósito. Usa la documentación como guía. Para los atributos realmente opcionales, se menciona un valor predeterminado o se indica lo que sucede si no se especifica ningún valor.

Excepto para algunos atributos del elemento raíz <manifest>, todos los nombres de los atributos comienzan con un prefijo android:. Por ejemplo, android:alwaysRetainTaskState. Debido a que el prefijo es universal, en la documentación suele omitirse cuando se hace referencia a los atributos por nombre.

Declaración de nombres de clases
Muchos elementos corresponden a objetos Java, incluidos los elementos para la aplicación en sí (el elemento <application>) y sus componentes principales: actividades (<activity>), servicios (<service>), receptores de mensajes (<receiver>) y proveedores de contenido (<provider>).

Si defines una subclase, como lo harías generalmente para las clases de componentes (Activity, Service, BroadcastReceiver y ContentProvider), la subclase se declara mediante un atributo name. El nombre debe incluir la designación completa del paquete. Por ejemplo, una subclase Service podría declararse de la siguiente manera:

<manifest . . . >
    <application . . . >
        <service android:name="com.example.project.SecretService" . . . >
            . . .
        </service>
        . . .
    </application>
</manifest>

Sin embargo, si el primer carácter del string es un punto, el nombre del paquete de la aplicación (tal como lo especifica el atributo package del elemento <manifest>) se adjunta al string. La siguiente asignación es la misma que se mostró anteriormente:

<manifest package="com.example.project" . . . >
    <application . . . >
        <service android:name=".SecretService" . . . >
            . . .
        </service>
        . . .
    </application>
</manifest>

Cuando inicia un componente, el sistema Android crea una instancia de la subclase mencionada. Si no se especifica una subclase, crea una instancia de la clase base.

Varios valores
Si se puede especificar más de un valor, el elemento se repite casi siempre, en lugar de enumerar varios valores en un único elemento. Por ejemplo, en un filtro de intents se pueden enumerar varias acciones:
<intent-filter . . . >
    <action android:name="android.intent.action.EDIT" />
    <action android:name="android.intent.action.INSERT" />
    <action android:name="android.intent.action.DELETE" />
    . . .
</intent-filter>
Valores de recursos
Algunos atributos tienen valores que se pueden mostrar a los usuarios, como una etiqueta y un ícono para una actividad. Los valores de estos atributos deben localizarse y establecerse desde un recurso o tema. Los valores de los recursos se expresan en el siguiente formato:

@[<i>package</i>:]<i>type</i>/<i>name</i>

Puedes omitir el nombre de package si el recurso se encuentra en el mismo paquete de la aplicación. type es un tipo de recurso, como una string o un drawable (elemento de diseño). name es el nombre que identifica al recurso específico. A continuación, te mostramos un ejemplo:

<activity android:icon="@drawable/smallPic" . . . >

Los valores de un tema se expresan de manera similar, aunque con un ? al inicio en lugar de @:

?[<i>package</i>:]<i>type</i>/<i>name</i>

Valores de strings
Cuando el valor de un atributo sea una string, debes usar doble barra invertida (\\) para diferenciarlo de los caracteres, como \\n para una nueva línea o \\uxxxx para un carácter Unicode.

Funciones del archivo

En las siguientes secciones, se describe la manera en que algunas de las funciones de Android se reflejan en el archivo de manifiesto.

Filtros de intents

Los componentes centrales de una aplicación (como sus actividades, servicios y receptores de mensajes) se activan mediante intents. Una intent es un paquete de información (un objeto Intent) que describe una acción deseada, incluso los datos en los que se debe actuar, la categoría del componente que debe realizar la acción y otras instrucciones pertinentes. El sistema Android localiza un componente apropiado para responder a la intent, inicia una instancia nueva del componente si es necesario y le pasa el objeto Intent.

Los componentes anuncian los tipos de intents a los que pueden responder mediante filtros de intents. Debido a que el sistema Android debe aprender las intents que puede manejar un componente antes de iniciarlo, los filtros de intents se especifican en el manifiesto como elementos <intent-filter>. Un componente puede tener cualquier cantidad de filtros, cada uno de los cuales describe una capacidad diferente.

Una intent que nombre explícitamente un componente de destino activará ese componente; el filtro no participa. Una intent que no nombra explícitamente un componente de destino puede activar un componente únicamente si pasa por uno de los filtros del componente.

Para obtener información sobre cómo se prueban los objetos Intent en filtros de intents, consulta el documento sobre las intents y los filtros de las intents.

Íconos y etiquetas

Varios elementos tienen atributos icon y label para un ícono pequeño y una etiqueta de texto que se pueden mostrar a los usuarios. Algunos también tienen un atributo description para un texto explicativo más extenso que también se puede mostrar en pantalla. Por ejemplo, el elemento <permission> tiene estos tres atributos. Cuando se pregunta al usuario si otorga permiso a una aplicación que lo solicitó, se le proporciona un ícono que representa el permiso, el nombre del permiso y una descripción de lo que implica.

En cada caso, el ícono y la etiqueta establecidos en un elemento contenedor se convierten en la configuración predeterminada de icon y label para todos los subelementos del contenedor. Por lo tanto, el ícono y la etiqueta establecidos en el elemento <application> son el ícono y la etiqueta predeterminados para cada componente de la aplicación. Igualmente, el ícono y la etiqueta establecidos para un componente, como un elemento <activity>, son la configuración predeterminada de cada elemento <intent-filter> del componente. Si un elemento <application> establece una etiqueta, pero una actividad y su filtro de intents no lo hacen, la etiqueta de la aplicación se considera como la etiqueta de la actividad y del filtro de intents.

El ícono y la etiqueta establecidos para un filtro de intents se usan para representar un componente cuando el componente se presenta al usuario y cumple la función indicada en el filtro. Por ejemplo, un filtro con las configuraciones android.intent.action.MAIN y android.intent.category.LAUNCHER indica que la actividad inicia una aplicación. Es decir, como una que se debe mostrar en el lanzador de la aplicación. El ícono y la etiqueta establecidos en el filtro se muestran en el lanzador.

Permisos

Un permiso es una restricción que limita el acceso a una parte del código o a datos en el dispositivo. La limitación se impone para proteger datos y códigos claves que podrían usarse incorrectamente para distorsionar o afectar la experiencia del usuario.

Cada permiso se identifica con una etiqueta única. Con frecuencia, la etiqueta indica la acción que está restringida. A continuación, se nombran algunos permisos definidos por Android:

Una funcionalidad se puede proteger con un solo permiso.

Si una aplicación necesita acceso a una característica protegida por un permiso, debe declarar que requiere el permiso con un elemento <uses-permission> en el manifiesto. Cuando la aplicación se instala en el dispositivo, el instalador determina si otorgará el permiso solicitado controlando las autoridades que firmaron los certificados de la aplicación y, en algunos casos, preguntándole al usuario. Si se otorga el permiso, la aplicación puede usar las características protegidas. De lo contrario, los intentos de acceder a esas características fallarán y no habrá notificaciones para el usuario.

Una aplicación también puede proteger sus propios componentes con permisos. Puede emplear cualquiera de los permisos definidos por Android (enumerados en android.Manifest.permission) o declarados por otras aplicaciones. También puede definir sus propios permisos. Un permiso nuevo se declara con el elemento <permission>. Por ejemplo, una actividad se puede proteger de la siguiente manera:

<manifest . . . >
    <permission android:name="com.example.project.DEBIT_ACCT" . . . />
    <uses-permission android:name="com.example.project.DEBIT_ACCT" />
    . . .
    <application . . .>
        <activity android:name="com.example.project.FreneticActivity"
                  android:permission="com.example.project.DEBIT_ACCT"
                  . . . >
            . . .
        </activity>
    </application>
</manifest>

Ten en cuenta que, en este ejemplo, el permiso DEBIT_ACCT no solo se declara con el elemento <permission>; su uso también se solicita con el elemento <uses-permission>. Debes solicitar su uso para que otros componentes de la aplicación inicien la actividad protegida, aunque la protección se imponga a través de la propia aplicación.

En el mismo ejemplo, si el atributo permission estuviera establecido en un permiso declarado en otro lugar (como android.permission.CALL_EMERGENCY_NUMBERS), no sería necesario volver a declararlo con un elemento <permission>. Sin embargo, seguiría siendo necesario solicitar su uso con <uses-permission>.

El elemento <permission-tree> declara un espacio de nombres para un grupo de permisos definidos en código y <permission-group> define una etiqueta para un conjunto de permisos (aquellos declarados en el manifiesto con elementos <permission> y aquellos declarados en otro lugar). Esto solo afecta la agrupación de los permisos cuando se presentan al usuario. El elemento <permission-group> no especifica los permisos pertenecientes al grupo, pero le asigna el nombre. Puedes disponer un permiso en el grupo si asignas el nombre de este al elemento <permission> del atributo permissionGroup.

Bibliotecas

Todas las aplicaciones están vinculadas con la biblioteca predeterminada de Android, que incluye los paquetes básicos para crear aplicaciones (con clases comunes como Activity, Service, Intent, View, Button, Application y ContentProvider).

Sin embargo, algunos paquetes se encuentran en sus propias bibliotecas. Si tu aplicación usa código de alguno de estos paquetes, debe solicitar explícitamente su vinculación con ellos. El manifiesto debe contener un elemento <uses-library> separado para nombrar cada una de las bibliotecas. En la documentación del paquete puedes encontrar el nombre de la biblioteca.

This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a one-minute survey?
Help us improve Android tools and documentation.