Cada app para Android tiene un ID de aplicación exclusivo similar a un nombre de paquete de Java (por ejemplo, com.example.myapp). Ese ID permite identificar de manera exclusiva tu app en el dispositivo y en Google Play Store. Si deseas subir una nueva versión de tu app, el ID de aplicación (y el certificado con el que la firmas) deberá ser el mismo que el artefacto original. Si cambias el ID de aplicación, Google Play Store tratará la carga como una app completamente diferente. Por lo tanto, una vez que publiques tu app, no cambies su ID.
El ID de aplicación se define con la propiedad applicationId
en el archivo build.gradle
de tu módulo, como se muestra aquí:
Groovy
android { defaultConfig { applicationId "com.example.myapp" minSdkVersion 15 targetSdkVersion 24 versionCode 1 versionName "1.0" } ... }
Kotlin
android { defaultConfig { applicationId = "com.example.myapp" minSdkVersion(15) targetSdkVersion(24) versionCode = 1 versionName = "1.0" } ... }
Cuando creas un proyecto nuevo en Android Studio, el objeto applicationId
coincide de forma exacta 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 esa 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 guion bajo [a-zA-Z0-9_].
Nota: El ID de aplicación solía estar vinculado directamente 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 el ID de aplicación. No es necesario que compartas el verdadero nombre de paquete de tu código fuera del código de la app.
Precaución: Si usas el objeto WebView
, procura utilizar el nombre de tu paquete como un prefijo del ID de aplicación. De lo contrario, es posible que se generen problemas, como se describe en el error 211768.
Cómo cambiar el ID de aplicación para variantes de compilación
Cuando compilas un APK o una AAB para tu app, las herramientas de compilación etiquetan la app 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 fichas separadas en Google Play Store, como una versión "gratis" y otra "pro", por ejemplo, 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 una variante de producto diferente. Para cada variante del bloque productFlavors
, puedes volver a definir la propiedad applicationId
o, en su lugar, agregar un segmento al ID de aplicación predeterminado usando el objeto applicationIdSuffix
, como se muestra aquí:
Groovy
android { defaultConfig { applicationId "com.example.myapp" } productFlavors { free { applicationIdSuffix ".free" } pro { applicationIdSuffix ".pro" } } }
Kotlin
android { defaultConfig { applicationId = "com.example.myapp" } productFlavors { create("free") { applicationIdSuffix = ".free" } create("pro") { applicationIdSuffix = ".pro" } } }
De esta forma, el ID de aplicación para la variante de producto "gratis" es "com.example.myapp.free".
También puedes usar el elemento applicationIdSuffix
para agregar un segmento según tu tipo de compilación, como se muestra aquí:
Groovy
android { ... buildTypes { debug { applicationIdSuffix ".debug" } } }
Kotlin
android { ... buildTypes { getByName("debug") { applicationIdSuffix = ".debug" } } }
Dado que Gradle aplica la configuración de tipo de compilación después de la variante 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 lanzamiento en el mismo dispositivo, debido a que no puede haber dos apps con el mismo ID de aplicación.
En el caso de las apps heredadas que se distribuyen con APK en Google Play (que se crearon antes de agosto de 2021), si deseas usar la misma ficha de app para distribuir varios APK que se orienten a una configuración del 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. La publicación con AAB no se ve afectada, ya que usa un solo artefacto que utiliza un solo código de versión y un ID de aplicación de forma predeterminada.
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 usarán el nombre de paquete del archivo AndroidManifest.xml
como ID de aplicación. En ese caso, refactorizar el nombre de tu paquete también 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 por el ID de aplicación real. Para obtener más información, consulta Cómo insertar 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 el elemento .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 será necesario, podrás cambiar el ID de aplicación definiendo la propiedad testApplicationId
en el 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 deseas cambiar el nombre del paquete, 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 dos aspectos:
- Aplican 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 usan para resolver cualquier nombre de clase relativo que se declare en el archivo de manifiesto.
Ejemplo: Con el manifiesto anterior, se determina que una actividad declarada como
<activity android:name=".MainActivity">
escom.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 también de actualizar 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 automáticamente. (Si no lo hacen, el código de tu app no resolverá la clase R
porque ya no se encontrará 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 cuentas con archivos de manifiesto adicionales (por ejemplo, para una variante de producto o un tipo de compilación), ten en cuenta que, en el manifiesto fusionado final, siempre se usa el nombre del paquete proporcionado por el archivo de manifiesto de mayor prioridad.
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 elemento applicationId
de Gradle, las herramientas de compilación copian el ID de aplicación en el archivo del manifiesto final de tu app al final de la compilación. Por lo tanto, si inspeccionas tu archivo AndroidManifest.xml
luego de una compilación, no debería sorprenderte que haya cambiado el atributo package
. El atributo package
es el lugar que Google Play Store y la plataforma de Android en realidad inspeccionan a fin de 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.