Cómo establecer el ID de aplicación

Cada app para Android tiene un ID de aplicación exclusivo similar a un nombre de paquete de Java; por ejemplo, com.example.myapp. Este ID permite identificar de manera exclusiva tu app en el dispositivo y en Google Play Store. Si deseas cargar una nueva versión de tu app, el ID de aplicación (y el certificado con el que la firmaste) debe ser igual al del APK original. Si cambias el ID de aplicación, Google Play Store considera el APK como una app completamente diferente. Por lo tanto, una vez que publiques tu app, no debes cambiar el ID de aplicación.

Tu ID de aplicación se define con la propiedad applicationId en el archivo build.gradle de tu módulo, como se muestra a continuación:

android {
        defaultConfig {
            applicationId "com.example.myapp"
            minSdkVersion 15
            targetSdkVersion 24
            versionCode 1
            versionName "1.0"
        }
        ...
    }
    

Cuando creas un proyecto nuevo en Android Studio, applicationId coincide con el nombre de paquete de estilo Java que elegiste durante la configuración. Sin embargo, el ID de aplicación y el nombre de paquete son independientes entre sí más allá de este aspecto. Puedes cambiar el nombre de paquete de tu código (el espacio de nombres del código) y esta acción no tendrá efecto sobre el ID de aplicación, y viceversa (aunque, nuevamente, no debes cambiar el ID de aplicación después de la publicación). Sin embargo, cambiar el nombre del paquete tiene otras consecuencias que debes tener en cuenta, por lo tanto, consulta la sección sobre cómo cambiar el nombre del paquete.

Además, si bien el ID de aplicación es similar a un nombre de paquete de Java tradicional, las reglas de nomenclatura para el ID de aplicación son un poco más restrictivas:

  • Debe tener al menos dos segmentos (uno o más puntos).
  • Cada segmento debe comenzar con una letra.
  • Todos los caracteres deben ser alfanuméricos o debe incluirse un guión bajo [a-zA-Z0-9_].

Nota: El ID de aplicación solía estar directamente vinculado al nombre de paquete de tu código; por lo tanto, algunas API de Android usan el término "package name" en los nombres de métodos y parámetros, pero se trata en realidad del ID de aplicación. Por ejemplo, el método Context.getPackageName() muestra tu ID de aplicación. No es necesario que compartas el nombre de paquete verdadero de tu código fuera de tu código de app.

Precaución: Si usas WebView, considera usar el nombre de paquete como prefijo en el ID de aplicación; de lo contrario, puedes experimentar problemas como los que se describen en el error 211768.

Cómo cambiar el ID de aplicación para variantes de compilación

Cuando compilas un APK para tu app, las herramientas de compilación etiquetan el APK con el ID de aplicación definido en el bloque defaultConfig del archivo build.gradle (como se muestra a continuación). Sin embargo, si deseas crear diferentes versiones de tu app para que aparezcan como listas separadas en Google Play Store, como una versión "gratis" y "pro", debes crear variantes de compilación independientes, cada una con un ID de aplicación diferente.

En este caso, cada variante de compilación debe definirse como un tipo de producto diferente. Para cada tipo dentro del bloque productFlavors, puedes volver a definir la propiedad applicationId o, en su lugar, agregar un segmento al ID de aplicación predeterminado mediante applicationIdSuffix, como se muestra aquí:

android {
        defaultConfig {
            applicationId "com.example.myapp"
        }
        productFlavors {
            free {
                applicationIdSuffix ".free"
            }
            pro {
                applicationIdSuffix ".pro"
            }
        }
    }
    

De esta forma, el ID de aplicación para el tipo de producto "gratis" es "com.example.myapp.free".

También puedes usar applicationIdSuffix para agregar un segmento según tu tipo de compilación, como se muestra aquí:

android {
        ...
        buildTypes {
            debug {
                applicationIdSuffix ".debug"
            }
        }
    }
    

Como Gradle aplica la configuración de tipo de compilación después del tipo de producto, el ID de aplicación para la variante de compilación "depuración gratis" ahora es "com.example.myapp.free.debug". Esta configuración resulta útil cuando deseas tener la compilación de depuración y de versión en el mismo dispositivo, debido a que no puede haber dos APK con el mismo ID de aplicación.

Recuerda que los APK con diferentes ID de aplicación se consideran como apps distintas en Google Play Store. Por lo tanto, si en cambio deseas usar el mismo directorio de app para distribuir varios APK que apunten a una configuración de dispositivo diferente (por ejemplo, el nivel de API), debes usar el mismo ID de aplicación para cada variante de compilación, pero otorgar a cada APK un versionCode diferente. Para obtener más información, consulta la sección Compatibilidad con varios APK.

Precaución: En lo que respecta a la compatibilidad con herramientas de SDK anteriores, si no defines la propiedad applicationId en tu archivo build.gradle, las herramientas de compilación usan el nombre de paquete del archivo AndroidManifest.xml como ID de aplicación. En ese caso, la refactorización de tu nombre de paquete modifica el ID de tu aplicación.

Sugerencia: Si debes hacer referencia al ID de aplicación en el archivo de manifiesto, puedes usar el marcador de posición ${applicationId} en cualquier atributo del manifiesto. Durante una compilación, Gradle reemplaza esta etiqueta con el ID de aplicación real. Para obtener más información, consulta Cómo inyectar variables de compilación en el manifiesto.

Cómo cambiar el ID de aplicación para realizar pruebas

De manera predeterminada, las herramientas de compilación aplican el ID de aplicación a tu APK de prueba de instrumentación usando el ID de aplicación para la variante de compilación específica y agregándole .test. Por ejemplo, un APK de prueba para la variante de compilación com.example.myapp.free tiene el ID de aplicación com.example.myapp.free.test.

Si bien no debería ser necesario, puedes cambiar el ID de aplicación si defines la propiedad testApplicationId en tu bloque defaultConfig o productFlavor.

Cómo cambiar el nombre de paquete

Aunque el nombre de paquete de tu proyecto coincide con el ID de aplicación de manera predeterminada, puedes cambiarlo. Sin embargo, si lo haces, ten en cuenta que ese nombre (según lo define la estructura del directorio del proyecto) siempre debe coincidir con el atributo package del archivo AndroidManifest.xml, como se muestra aquí:

<?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.myapp"
        android:versionCode="1"
        android:versionName="1.0" >
    

Las herramientas de compilación de Android usan el atributo package para los siguientes dos aspectos:

  • Aplica este nombre como espacio de nombres para la clase R.java generada de tu app.

    Ejemplo: Con el manifiesto anterior, la clase R será com.example.myapp.R.

  • Lo usa para resolver cualquier nombre de clase relativo que se declare en el archivo de manifiesto.

    Ejemplo: Con el manifiesto anterior, una actividad declarada como <activity android:name=".MainActivity"> se resuelve para ser com.example.myapp.MainActivity.

Como tal, el nombre del atributo package siempre debe coincidir con el nombre de paquete básico de tu proyecto, en el que guardas tus actividades y otros tipos de código de la app. Desde luego, puede haber subpaquetes en tu proyecto, pero esos archivos deben importar la clase R.java con el espacio de nombres del atributo package y cualquier componente de la app declarado en el manifiesto debe agregar los nombres de los subpaquetes faltantes (o usar nombres de paquete completos).

Si deseas refactorizar por completo el nombre de tu paquete, asegúrate de actualizar también el atributo package. Siempre y cuando uses las herramientas de Android Studio para cambiar los nombres de tus paquetes y refactorizarlos, estos permanecerán sincronizados de forma automática. (Si no permanecen sincronizados, el código de tu app no resolverá la clase R porque ya no se encuentra en el mismo paquete, y el manifiesto no identificará tus actividades ni otros componentes).

Siempre debes especificar el atributo package en el archivo AndroidManifest.xml principal de tu proyecto. Si tienes archivos de manifiesto adicionales (por ejemplo, para un tipo de producto o compilación), ten en cuenta que el nombre del paquete proporcionado por el archivo de manifiesto de mayor prioridad siempre se usa en el manifiesto fusionado final. Para obtener más información, consulta Cómo fusionar varios archivos de manifiesto.

Otro aspecto que debes saber: Si bien es posible que tengas un nombre diferente para el manifiesto package y el de Gradle applicationId, las herramientas de compilación copian el ID de aplicación en el archivo del manifiesto final de tu APK al final de la compilación. Por lo tanto, si inspeccionas tu archivo AndroidManifest.xml después de una compilación, no te sorprendería ver que el atributo package cambió. El atributo package es el lugar que Google Play Store y la plataforma de Android en realidad inspeccionan para identificar tu app; por lo tanto, una vez que la compilación usa el valor original (para asignar un espacio de nombres a la clase R y resolver los nombres de clase del manifiesto), descarta ese valor y lo reemplaza por el ID de aplicación.