Cómo configurar el módulo de la app

En esta página, se describe la configuración útil de la app en el archivo build.gradle a nivel de módulo que probablemente quieras activar o desactivar.

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). 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"
        minSdk = 15
        targetSdk = 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 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 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"> es 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 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.