The Android Developer Challenge is back! Submit your idea before December 2.

Cómo empaquetar y distribuir apps para Wear

Con Wear OS by Google, un usuario puede visitar Play Store en un reloj y descargar una app para Wear directamente allí. Asimismo, puede instalar una app directamente en su reloj mediante Play Store en la Web.

Todos los dispositivos que ejecutan Wear 2.0 usan Android 7.1.1 (nivel de API 25). Si tu app solo es compatible con dispositivos que ejecutan Wear 2.0 o versiones posteriores, el nivel de API mínimo y de destino debería ser 25. Si es compatible con Wear 1.x y 2.0, el nivel de API mínimo y de destino puede ser 23. Todas las apps para Wear deben orientarse a la API de nivel 23 o versiones posteriores, por lo que se requieren permisos en tiempo de ejecución.

Además, puedes consultar Apps independientes.

Cuando una app para Wear 2.0 tiene una app complementaria, puedes usar la misma clave para firmar ambas apps. Este requisito también se aplica a apps para Wear 1.x (que siempre tienen una app complementaria).

Cómo planificar la publicación en Play Store

Para que tu app aparezca en Play Store en los relojes, debes subir el APK de reloj en Play Console de la misma manera que lo harías con cualquier APK. Si solo tienes un APK de reloj, y no tienes uno de teléfono, no debes realizar ninguna acción adicional.

Si además del APK de reloj tienes uno de teléfono, debes usar el método de publicación con varios APK.

Distribución a relojes con Wear 2.0

En los dispositivos que ejecutan Wear 2.0, cuando un usuario instala una app para teléfonos que tiene un app para relojes asociada (ya sea un APK incorporado o un APK subido mediante Play Console), este recibe una notificación en el reloj sobre la app para relojes disponible. Al presionar la notificación, se abre Play Store en el reloj y se proporciona al usuario la opción para instalar la app para relojes.

Además:

  • Cuando actualizas un APK de teléfono con un nuevo APK de reloj incorporado, se actualiza automáticamente el APK de reloj del usuario.
  • Cuando subes un APK de reloj mediante Play Console, puedes actualizar tu APK de Wear por separado del APK de teléfono, y los usuarios recibirán las actualizaciones en Play Store del reloj.
  • En al caso de un APK de reloj incorporado, el APK de reloj del usuario se actualiza automáticamente cuando se actualiza el APK de teléfono. En el caso de varios APK, el comportamiento de las actualizaciones depende de la configuración de Play Store (actualización automática de apps). No se recomienda tener un APK incorporado y varios APK a la vez en tu app si no tienen la misma versión. Por ejemplo, imagina que tienes un APK v1 incorporado y varios APK v2. Si se instala primero el APK incorporado, la versión de varios APK reemplazará al APK incorporado, ya que es una versión posterior. Más adelante, si un desarrollador actualiza el APK de teléfono a v3, se instalará automáticamente un APK incorporado que anulará la versión posterior proporcionada por varios APK.

Distribución a relojes Wear 1.x y 2.0

El modelo de distribución estándar para Wear 1.x incorporaba una app para relojes dentro de la app para teléfonos. Wear OS ahora te permite distribuir tu app para Wear de la misma manera para las versiones 1.0 y 2.0. Cuando un usuario instala tu app para teléfonos, si tienes una app para Wear compatible en Play Store, esta se instalará automáticamente en los relojes con Wear 1.0. Esta función te permite detener la incorporación de apps para Wear dentro del APK de la app para teléfonos. Puedes proporcionar versiones independientes del APK de reloj en Play Store tanto para relojes con Wear 1.0 como 2.0.

Especifica el código de la versión

Para asegurarte de que un APK independiente actualice un APK de Wear incorporado existente en un reloj, el código de la versión del APK independiente de Wear debería ser superior al código de la versión del APK de Wear incorporado. (El esquema del código de la versión del APK de teléfono puede ser independiente del de un APK de reloj, pero debe ser único). Sin embargo, los códigos de versión del APK independiente y del APK de Wear incorporado pueden ser iguales si los APK son equivalentes.

Si no lo son, pero los códigos de versión son iguales, cuando un reloj se actualice de Wear 1.x a 2.0, el reloj podrá obtener un APK nuevo únicamente después de esperar un período prolongado.

Por el momento, no es posible crear un solo APK que funcione en un teléfono y en un reloj.

Si el APK de Wear y el APK complementario comparten código y requieren versiones coordinadas, debes reservar los últimos dos dígitos del código de la versión para las variantes de APK. Un ejemplo de una variante de APK es la arquitectura de la CPU. Por ejemplo, puedes consultar Compatibilidad con varias arquitecturas de CPU.

A continuación, se muestra un esquema de código de versión sugerido:

  • Establece los dos primeros dígitos del código de la versión de la targetSdkVersion, p. ej., 25.
  • Establece los siguientes tres dígitos de la versión del producto, p. ej., 152 para la versión de un producto 1.5.2.
  • Establece los siguientes dos dígitos del número de la versión o compilación, p. ej., 01.
  • Reserva los últimos dos dígitos para una variante de varios APK, p. ej., 00.

Si se usan los valores del ejemplo (25, 152, 01 y 00) en este esquema de código de la versión sugerido, el código de la versión de la variante de APK de ejemplo sería 251520100.

Además, puedes consultar Cómo establecer la información de versión de la aplicación.

Compatibilidad con el archivo Gradle

Si tienes una app para Wear que está diseñada tanto para Wear 1.x como 2.0, considera usar clases de productos. Por ejemplo, si quieres orientar a las versiones de SDK 23 y 25, debes actualizar el archivo build.gradle del módulo de Wear para que incluya lo siguiente en caso de que una app para Wear 1.x existente tenga una versión mínima del SDK de 23:

    android {
        // Allows you to reference product flavors in your
        // phone module's build.gradle file
        publishNonDefault true
        ...
        defaultConfig
        {
           // This is the minSdkVersion of the Wear 1.x app
           minSdkVersion 23
           ...
        }
        buildTypes {...}
        productFlavors {
            wear1 {
              // Use the defaultConfig value
            }
            wear2 {
                minSdkVersion 25
            }
        }
    }
    

Una variante de compilación es una combinación de la clase de producto y del tipo de compilación. En Android Studio, selecciona la variante de compilación adecuada cuando depures o publiques tu app. Por ejemplo, si wear2 es una clase de producto, selecciona wear2Release como la variante de compilación de la versión.

A efectos del código que es específico de Wear 2.0 o de Wear 1.x, considera usar conjuntos de orígenes para las variantes de compilación.

Cómo migrar un APK de Wear 1.0 de un APK incorporado a varios APK

Nota: Debido a un problema de latencia que afecta la disponibilidad de la app en relojes con Wear 1.x, puedes incorporar un APK de Wear en lugar de usar el método de publicación con varios APK (para relojes con Wear 1.x).

Tradicionalmente, los APK de Wear 1.0 se incorporaban en los APK de teléfono para la distribución de apps para wearables a usuarios. Wear OS ahora te permite subir los APK de Wear 1.0 directamente en Play Store, en lugar de incorporarlos. De esta manera, se reduce el tamaño del APK de teléfono y permite mayor flexibilidad al crear las versiones de los APK. Si tienes un APK de Wear 1.0 incorporado existente, puedes seguir estos pasos para configurarlo, compilarlo y subirlo a Play Store:

  1. Agrega una opción de configuración wearAppUnbundled true en el archivo build.gradle de tu módulo de teléfono. Solo debes hacerlo si publicaste previamente una app para Wear incorporada en Play Store.
  2.     android {
          ...
          defaultConfig {
            ...
            wearAppUnbundled true
          }
        }
        
  3. Quita la siguiente regla de dependencia wearApp del archivo build.gradle de tu app para teléfonos:
  4.     dependencies {
            ...
            wearApp project(path: ':wear', configuration: 'wear1Release')
        }
        
  5. Asegúrate de que la siguiente restricción de función esté especificada en el archivo de manifiesto de tu app para Wear:
  6.     <manifest package="com.example.standalone"
            xmlns:android="http://schemas.android.com/apk/res/android">
            <uses-feature
                android:name="android.hardware.type.watch"/>
            ...
        </manifest>
        
  7. Establece la versión mínima del SDK en 23 en el archivo build.gradle de tu módulo de Wear.
  8. Si lo deseas, puedes especificar tu app para Wear como independiente, luego de revisar la página de Apps independientes.
  9. Crea tu APK de Wear y usa Google Play Console para implementarlo.

En el caso de la versión de SDK mínima de tu app para Wear, considera lo siguiente:

  • Si tienes diferentes APK para Wear 1.0 y Wear 2.0, asegúrate de establecer la versión de SDK mínima más alta en 25 en el archivo build.gradle del módulo de Wear 2.0. De esta manera, se garantiza que Play Store distribuya el APK de Wear 2.0 a dispositivos con Wear 2.0 únicamente y no a los que tengan Wear 1.0.
  • Si ya tienes una app para Wear 2.0 y quieres distribuirla a dispositivos con Wear 1.0, debes asegurarte de que esta funcione correctamente en dispositivos con Wear 1.0 antes de establecer la versión mínima del SDK en 23.

Cómo configurar la orientación para un reloj

En el archivo de manifiesto de Android, debes establecer el elemento uses-feature en android.hardware.type.watch. No establezcas el atributo required en false. Por el momento, no se admite un solo APK para dispositivos Wear y que no sean Wear.

Por lo tanto, si un APK tiene la siguiente configuración, Google Play solo proporciona el APK para relojes:

    <manifest package="com.example.standalone"
        xmlns:android="http://schemas.android.com/apk/res/android">
        <uses-feature
            android:name="android.hardware.type.watch"/>
        ...
    </manifest>
    

La configuración de android.hardware.type.watch que se muestra más arriba puede combinarse con otros criterios como la versión del SDK, la resolución de pantalla y la arquitectura de CPU. Por lo tanto, los diferentes APK de Wear pueden orientarse a distintas configuraciones de hardware.

Cómo especificar una app como independiente

Wear 2.0 requiere un elemento meta-data en el archivo de manifiesto de Android de las apps para relojes como elemento secundario del elemento <application>. El nombre del elemento meta-data es com.google.android.wearable.standalone y su valor debe ser true o false. Este indica si tu app para relojes es una app independiente. Si la configuración del elemento es true, tu app podrá estar disponible en Play Store para relojes sincronizados con iPhones, siempre y cuando el valor de tus APK activos en todos los canales (p. ej. en el canal beta) esté establecido en true. Si no todos los APK (Alfa, Beta y producción) que se publican actualmente a los usuarios tienen la configuración anterior, tu app no estará disponible cuando la busquen en un reloj sincronizado con un iPhone.

Una app para relojes puede considerarse independiente o no. Además, puede categorizarse de una de las siguientes maneras:

  • Completamente independiente de una app para teléfonos
  • Parcialmente independiente (no se requiere una app para teléfonos y solo proporciona funciones opcionales)
  • Dependiente de una app para teléfonos

Si una app para relojes es completamente independiente o semiindependiente, establece el valor del elemento meta-data nuevo en true:

    <application>
    ...
      <meta-data
        android:name="com.google.android.wearable.standalone"
        android:value="true" />
    ...
    </application>
    

Como una app independiente (es decir, independiente o parcialmente independiente) puede ser instalada por un usuario de iPhone o un usuario de teléfono Android que no tiene Play Store, la app para relojes debe poder usarse sin la app para teléfonos Android.

Si una app para relojes depende de una app para teléfonos, establece el valor del elemento meta-data que se muestra arriba en false. Establecerlo en false implica que la app para relojes debe instalarse solo en un reloj que esté sincronizado con un teléfono con Play Store.

Nota: Incluso si el valor es false, la app para relojes puede instalarse antes que la app para teléfonos.

Si tu app para Wear 2.0 tiene una app para teléfonos complementaria, usa el mismo nombre de paquete para ambas versiones.

Cómo usar Play Console

Puedes usar Play Console para subir un APK de Wear independiente en una ficha de la app.

También puedes consultar Compatibilidad con varios APK y Cómo administrar tu app. Antes de subir un APK como se describe debajo, debes firmarlo.

Cómo subir y publicar tu APK

Para subir y publicar tu APK mediante Play Console, haz lo siguiente:

  1. Ve a Play Console.
  2. En el menú izquierdo, selecciona Administración de versiones > Versiones de la app.

    Nota: Si tu APK está en modo de borrador, selecciona Versiones de la app directamente en el menú izquierdo.

  3. Junto al tipo de versión (producción, Alfa o Beta) que quieras crear, selecciona Administrar.
  4. Para crear una nueva, selecciona Crear versión.
  5. Selecciona Agregar APK desde biblioteca para agregar tu APK de Wear independiente. De manera alternativa, puedes arrastrar y soltar tu archivo APK, o bien seleccionar Explorar archivos.
  6. Cuando hayas terminado de preparar tu versión, selecciona Revisar. Se mostrará la pantalla "Revisar y lanzar versión". Aquí, puedes usar el ícono de información para revisar los detalles de tu APK, como la cantidad de dispositivos Android compatibles. Además, asegúrate de haber establecido la función de hardware en android.hardware.type.Watch.
  7. Selecciona Confirmar lanzamiento para publicar tu app.

Cómo incorporar un APK de Wear 1.x

Los procesos de esta sección se mantienen como referencia. Si un APK de Wear 1.x se empaqueta en un APK de app para teléfonos, el sistema instala la app para Wear en el reloj sincronizado cuando los usuarios descargan la app para teléfonos.

Nota: Esta opción no funciona cuando firmas tus apps con una clave de depuración. Durante el desarrollo, se requiere que se instalen las apps con adb install o Android Studio directamente en el reloj.

Cómo empaquetar una app para Wear 1.x con Android Studio

Nota: Debido a un problema de latencia que afecta la disponibilidad de la app en relojes con Wear 1.x, puedes incorporar un APK de Wear en lugar de usar el método de publicación con varios APK (para relojes con Wear 1.x).

Sigue estos pasos a fin de empaquetar una app para Wear 1.x en Android Studio:

  1. Asegúrate de que los módulos de la app para teléfonos y la app para relojes tengan el mismo nombre de paquete.
  2. Declara una dependencia de Gradle en el archivo build.gradle de la app para teléfonos dirigida al módulo de la app para relojes. La declaración es similar a la siguiente, pero consulta las versiones más recientes en Cómo configurar los Servicios de Google Play y Biblioteca de compatibilidad v4:
        dependencies {
           compile 'com.google.android.gms:play-services-wearable:10.0.1'
           compile 'com.android.support:support-compat:25.1.0'
           wearApp project(':wearable')
        }
        
  3. Sigue las instrucciones que aparecen en Cómo firmar la compilación de la versión para especificar el almacén de claves de la versión y firmar tu app. Android Studio exporta (en la carpeta raíz de tu proyecto) una app para teléfonos firmada que incluye una app para relojeses incorporada.

    De manera alternativa, puedes firmar ambas apps desde la línea de comandos mediante el wrapper de Gradle. Se deben firmar ambas apps para habilitar la instalación automática de la app para relojes. Consulta Cómo firmar tu app.

Cómo firmar la app para Wear 1.x y la app para teléfonos por separado

Si el proceso de compilación requiere que se firme la app para relojes por separado de la app para teléfonos, puedes declarar la siguiente regla de Gradle en el archivo build.gradle del módulo del teléfono a fin de incorporar la app para relojes firmada previamente:

    dependencies {
      ...
      wearApp files('/path/to/wearable_app.apk')
    }
    

Luego, firma la app para teléfonos como desees (con el elemento de menú Compilación > Generar APK firmado… de Android Studio o con las reglas signingConfig de Gradle).

Cómo empaquetar manualmente una app para Wear 1.x

Puedes empaquetar una app para relojes en una app para teléfonos manualmente si usas otro IDE, o bien otro método de compilación:

  1. Asegúrate de que tanto los APK para dispositivos móviles como para relojes tengan el mismo nombre de paquete y el mismo número de versión.
  2. Copia la app para relojes firmada en el directorio res/raw del proyecto de tu teléfono. Nos referiremos al APK como wearable_app.apk.
  3. Crea un archivo res/xml/wearable_app_desc.xml que contenga información sobre la ruta de acceso y la versión de la app para relojes. Por ejemplo:
        <wearableApp package="wearable.app.package.name">
          <versionCode>1</versionCode>
          <versionName>1.0</versionName>
          <rawPathResId>wearable_app</rawPathResId>
        
        </wearableApp>
        

    Los valores para package, versionCode y versionName son los mismos que en el archivo de manifiesto de la app para relojes. El rawPathResId es el nombre de la variable estática del recurso APK. Por ejemplo, para wearable_app.apk, el nombre de la variable estática es wearable_app.

  4. Agrega una etiqueta meta-data a la etiqueta <application> de tu app para teléfonos, que hará referencia al archivo wearable_app_desc.xml.
          <meta-data android:name="com.google.android.wearable.beta.app"
                         android:resource="@xml/wearable_app_desc"/>
        

    Nota: No se debe cambiar la etiqueta meta-data que se muestra más arriba. Se requiere com.google.android.wearable.beta.app.

  5. Compila y firma la app para teléfonos.

Cómo desactivar la compresión de recursos

Android Studio no comprime tu APK de forma predeterminada, pero si usas otro proceso de compilación, asegúrate de que la app para relojes no se comprima dos veces. Muchas herramientas de compilación comprimen automáticamente los archivos que se agregan al directorio res/raw de una app de Android. El APK de reloj ya está comprimido, por lo que vuelve a comprimirse. Como resultado, el instalador de la app para relojes no puede leerlo, por lo que la instalación falla y el PackageUpdateService registra el siguiente error: "Este archivo no se puede abrir como descriptor de archivo; es probable que esté comprimido".