Cómo crear compilaciones para miles de millones de usuarios

El uso de Internet (junto a la penetración de los smartphones) crece con mayor rapidez en mercados con conectividad baja, intermitente o costosa. Para tener éxito en estos mercados, las apps deben poder funcionar en diferentes dispositivos y configuraciones de velocidad, además de conservar y compartir información sobre el consumo de datos y batería.

Para ayudarte a abordar estas consideraciones importantes, compilamos la siguiente lista de comprobación. Estos elementos no siguen un orden en particular y, como siempre, te convendrá investigar las peculiaridades del mercado o país al que apuntes.

Conectividad

En todo el mundo, más de la mitad de los usuarios siguen usando las apps en conexiones  2G. Si quieres mejorar la experiencia de estos, aplica optimizaciones para entornos con conexiones lentas o sin ellas. Para entornos con conexiones lentas o sin ellas, almacena datos, pon solicitudes en cola y administra imágenes a fin de obtener un rendimiento óptimo.

Optimiza las imágenes

Ofrece imágenes WebP

  • Ofrece archivos WebP en la red. WebP disminuye los tiempos de carga de las imágenes, ahorra ancho de banda en la red y, a menudo, permite obtener archivos de tamaño inferior al de sus versiones PNG y JPG con una calidad de imagen igual o superior. Incluso en configuraciones de compresión con pérdida, WebP puede producir una imagen casi idéntica. Android ha ofrecido soporte de WebP para compresión con pérdida desde la versión 4.0 (nivel de API 14: Ice Cream Sandwich) y soporte para compresión sin pérdida/ transparente de WebP desde la versión 4.2 (nivel de API 17: Jelly Bean).

Tamaño dinámico de imágenes

  • Haz que las apps soliciten imágenes con el tamaño de representación buscado y que el servidor proporcione dichas imágenes en el ajuste adecuado. El tamaño de representación buscado variará según las especificaciones del dispositivo. De esta forma, se minimiza la sobrecarga de la red y disminuye la cantidad de memoria necesaria para almacenar cada imagen. En consecuencia, mejora el rendimiento y aumenta la satisfacción del usuario.
  • La experiencia del usuario se degrada cuando debe esperar que se descarguen imágenes. Si se usan los tamaños de imagen adecuados, será más fácil solucionar estos problemas. Una buena idea es realizar las solicitudes de tamaños de imagen según el tipo o la calidad de la red; es posible que este tamaño sea inferior al de representación de destino.
  • Los marcadores de posición dinámicos, como valores de paleta ya calculados o miniaturas en baja resolución, pueden mejorar la experiencia del usuario mientras se busca la imagen.

Usa bibliotecas de carga de imágenes

  • La app no tendría que buscar una imagen más de una vez. Las bibliotecas de carga de imágenes, como Glide y Picasso , buscan la imagen, la almacenan en caché y proporcionan enlaces a tus vistas para mostrar imágenes con marcador de posición hasta que las imágenes reales estén listas. Debido a que las imágenes se encuentran almacenadas en caché, estas bibliotecas mostrarán las copias locales cuando se vuelvan a solicitar.
  • Las bibliotecas de carga de imágenes gestionan su caché; conservan las imágenes más recientes para que el almacenamiento de tu app no aumente indefinidamente.

Optimiza las redes

Permite que tu app funcione sin conexión

  • En lugares como subterráneos, aviones, ascensores y estacionamientos es común que los dispositivos pierdan la conectividad de red. Si creas un estado sin conexión que sea útil, los usuarios podrán interactuar siempre con la app suministrando información almacenada en caché. Asegúrate de que tu app pueda usarse sin conexión o con conectividad de red deficiente almacenando los datos de forma local y en caché, y poniendo en cola solicitudes de salida para cuando se recupere la conectividad.
  • Si es posible, las apps no deben notificar al usuario que se perdió la conectividad. Solo será necesario notificarlo cuando realice una operación que requiera conexión de forma imprescindible.
  • Cuando un dispositivo no tenga conexión, tu app deberá acumular solicitudes de red—para el usuario—a fin de que se ejecuten cuando se recupere la conexión. Como ejemplo, podemos considerar un cliente de correo electrónico que permita a los usuarios redactar, enviar, leer, mover y borrar correos electrónicos existentes aun cuando el dispositivo no tenga conexión. Estas operaciones pueden almacenarse en caché y ejecutarse cuando se recupere la conexión. De esta forma, la app podrá ofrecer una experiencia de usuario similar cuando el dispositivo tenga conexión o no.

Usa GcmNetworkManager o proveedores de contenido

  • Verifica que tu app almacene todos los datos en disco a través de una base de datos o estructura similar para que el rendimiento sea óptimo, independientemente de las condiciones de la red (por ejemplo, a través de SQLite + ContentProvider). El administrador de redes de GCM ( GcmNetworkManager) puede ser un mecanismo robusto para sincronizar datos con servidores mientras los proveedores de contenido (ContentProvider) almacenan esos datos en caché. Juntos pueden proporcionar una arquitectura que habilite un estado sin conexión de utilidad.
  • Las apps deben almacenar en caché el contenido que se busca en la red. Antes de realizar solicitudes posteriores, las apps deben mostrar los datos almacenados en caché de forma local. De esta forma, se garantiza que la app funcionará aunque el dispositivo se encuentre sin conexión, o bien en una red lenta o no confiable.

Elimina duplicaciones de solicitudes de red

  • Una arquitectura que priorice la condición sin conexión primero intenta buscar datos almacenados de forma local. Si esto falla, solicita datos en la red. Cuando se obtienen los datos de la red, se almacenan en el caché de forma local para su recuperación posterior. Esto ayuda a garantizar que las solicitudes de red que incluyan un mismo bloque de datos solo existan una vez; el resto de las solicitudes se satisfarán a nivel local. Para ello, usa una base de datos local destinada a los datos de larga duración (por lo general, android.database.sqlite o SharedPreferences).
  • En una arquitectura que prioriza la condición sin conexión siempre se buscan primero los datos de forma local y luego se realiza la solicitud en la red. La respuesta se almacena en caché y luego se muestra de forma local. En este tipo de arquitectura se simplifican los flujos de la app entre los estados sin conexión y con conexión, ya que en un extremo se realiza la búsqueda en la red y el almacenamiento en caché, mientras que en el otro se recuperan los datos del caché para mostrárselos al usuario.
  • Para los datos transitorios, usa un caché de disco limitado, como DiskLruCache . Los datos que generalmente no cambian solo deben solicitarse una vez en la red y almacenarse en caché para usarse posteriormente. Las imágenes y los documentos no temporales, como los artículos de noticias o las publicaciones en redes sociales, son ejemplos de estos datos.

Optimiza la transferencia de datos

Prioriza el ancho de banda

  • Los desarrolladores de apps no deberían dar por sentado que todas las redes a las que se conecte el dispositivo serán de larga duración o confiables. Por esta razón, las apps deben priorizar las solicitudes de red para que se muestre al usuario la información más útil lo antes posible.
  • Presentar al usuario información visible y relevante de forma inmediata supone una mejor experiencia para el usuario cuando se compara con hacerlo esperar por información que tal vez no sea necesaria. Así, disminuye el tiempo de espera del usuario y aumenta la utilidad de la app en redes lentas.
  • Para lograr esto, secuencia tus solicitudes de red a fin de obtener texto antes que rich media. Por lo general, las solicitudes de texto son más pequeñas, tienen una mejor compresión y, por lo tanto, se transfieren más rápido. Esto significa que tu app podrá mostrar contenido útil rápidamente. Para obtener más información sobre la administración de solicitudes de red, visita la capacitación de Android sobre la administración del uso de red.

Usa menos ancho de banda en conexiones más lentas

  • La capacidad de tu app para transferir datos de manera oportuna depende de la conexión de red. La detección de la calidad de la red y el ajuste de la forma en que la app la usa pueden ayudar a brindar una excelente experiencia del usuario.
  • Puedes usar los siguientes métodos para detectar la calidad de la red subyacente. Con los datos de estos métodos, tu app podrá personalizar el uso de la red y seguir proporcionando una respuesta oportuna a las acciones del usuario:
  • En conexiones más lentas, considera descargar únicamente los medios de menor resolución o, tal vez, no descargar ninguno. De esta forma, te asegurarás de que los usuarios puedan seguir usando la app en conexiones lentas. Cuando no tengas una imagen o la imagen tarde en cargarse, siempre deberías colocar un marcador de posición. Puedes crear un marcador de posición dinámico si usas la biblioteca Palette para generar colores de marcadores de posición que coincidan con la imagen deseada.
  • Prioriza las solicitudes de red para obtener texto antes que rich media. Por lo general, las solicitudes de texto son más pequeñas, tienen una mejor compresión y, por lo tanto, se transfieren más rápido. Esto significa que tu app podrá mostrar contenido útil rápidamente. Para obtener más información sobre cómo ajustar el ancho de banda según la conexión de red, consulta la capacitación de Android sobre la administración del uso de red.
  • En dispositivos con Android 7.0 (nivel de API 24) y versiones posteriores, los usuarios pueden activar la configuración de Reducir datos, que ayuda a minimizar el uso de datos. Android 7.0 amplía ConnectivityManager para detectar la configuración de Reducir datos . Para obtener más información sobre esta función, consulta Reducir datos.

Detecta los cambios en la red y modifica el comportamiento de la app

  • La calidad de las redes no es estática: varía según la ubicación, el tráfico de red y la densidad de la población local. Las apps deben detectar los cambios en la red y ajustar el ancho de banda de manera correspondiente. De esta forma, la app puede personalizar la experiencia del usuario según la calidad de la red. Detecta el estado de la red con los siguientes métodos:
  • A medida que se degrade la calidad de la red, reduce la cantidad y el tamaño de las solicitudes. A medida que mejore la calidad de la conexión, podrás aumentar las solicitudes para alcanzar niveles óptimos.
  • En redes de mayor calidad y sin medición de uso, se recomienda buscar los datos con anticipación para que estén disponibles con anterioridad. Desde el punto de vista de la experiencia del usuario, esto puede implicar que las apps de noticias solo obtengan tres artículos a la vez en 2G, pero logren capturar veinte en Wi-Fi. Para obtener más información sobre cómo configurar el comportamiento de la app de acuerdo con los cambios en la red, consulta la capacitación de Android sobre la supervisión del estado de la conectividad.
  • La transmisión CONNECTIVITY_CHANGE se envía cuando ocurre un cambio en la conectividad de la red. Cuando tu app esté en primer plano, podrás llamar a registerReceiver para recibir esta transmisión. Tras recibir la transmisión, debes revaluar el estado de la red actual, y adaptar tu IU y el uso de la red de manera acorde. No debes declarar este receptor en tu manifiesto, ya que esta función no está disponible en Android 7.0 (nivel de API 24) y versiones posteriores. Para obtener más información sobre este y otros cambios en Android 7.0, consulta Cambios en Android 7.0.

Recursos relacionados

Capacidad del dispositivo

Si quieres llegar a nuevos usuarios, debes proporcionar compatibilidad con una mayor variedad de versiones de plataformas de Android y más especificaciones de dispositivo. Optimiza la app para RAM, tamaños de pantalla y resoluciones convencionales a fin de mejorar la experiencia del usuario.

Compatibilidad con diferentes tamaños de pantalla

Usa píxeles independientes de la densidad (dp)

  • Definir dimensiones de diseño con píxeles es un problema, ya que las diferentes pantallas tienen distintas densidades de píxeles. Por lo tanto, el mismo número de píxeles puede corresponder a diferentes tamaños físicos en distintos dispositivos. Un píxel independiente de la densidad (dp) corresponde al tamaño físico de un píxel con 160 puntos por pulgada (densidad mdpi).
  • Definir diseños con dp garantiza que el tamaño físico de la interfaz de usuario será constante en cualquier dispositivo. Visita la guía de Android Compatibilidad con diferentes pantallas para conocer las mejores prácticas con píxeles independientes de la densidad.

Prueba los gráficos en densidades de pantalla ldpi/mdpi

  • Asegúrate de que los diseños de tu app funcionen bien en pantallas de densidad baja y media (ldpi/mdpi) porque estas son las densidades convencionales, sobre todo en dispositivos de menor costo. Si realizas pruebas en pantallas de menor densidad, será más fácil comprobar que tus diseños serán legibles en pantallas de menor densidad.
  • En las pantallas de menor densidad, es posible que el texto sea poco claro en lugares donde no se vean los detalles más sutiles. En las pautas de Material Design se describen métricas y líneas claves para garantizar que tus diseños puedan escalarse en distintas densidades de pantalla.
  • Las especificaciones de hardware de los dispositivos con pantallas de menor densidad suelen ser inferiores. Para asegurarte de que tu app funcione bien en estos dispositivos, considera disminuir o eliminar cargas pesadas, como animaciones y transiciones. Para obtener más información sobre la compatibilidad con diferentes densidades, consulta la capacitación de Android sobre la compatibilidad con diferentes densidades de pantalla.

Prueba diseños en pantallas de tamaño reducido o mediano

  • Realiza pruebas en pantallas más pequeñas para verificar que tus diseños puedan escalarse a valores inferiores. Debido a que las pantallas se achican, selecciona cuidadosamente los elementos visibles de la IU porque habrá poco espacio para ellos.
  • Las especificaciones de hardware de los dispositivos con pantallas más pequeñas suelen ser inferiores. Para asegurarte de que tu app funcione bien en estos dispositivos, intenta disminuir o eliminar cargas pesadas, como las animaciones o transiciones. Para obtener más información sobre la compatibilidad con diferentes tamaños de pantalla, consulta la capacitación de Android sobre la compatibilidad con diferentes tamaños de pantalla.

Compatibilidad con versiones anteriores

Configura correctamente tu targetSdkVersion y minSdkVersion

  • Las apps deben compilarse y orientarse para una versión reciente de Android a fin de garantizar el comportamiento más actualizado en una amplia variedad de dispositivos. Esto preservará la compatibilidad con versiones anteriores. A continuación, se enumeran las mejores prácticas para apuntar correctamente a los niveles de API:
    • targetSdkVersion debe ser la última versión de Android. El perfilamiento hacia la versión más reciente garantizará que tu app herede comportamientos de tiempo de ejecución más nuevos cuando se ejecuten versiones de Android más recientes. Asegúrate de probar tu app en versiones de Android más recientes cuando actualices targetSdkVersion, ya que puede influir en el comportamiento de la app.
    • minSdkVersion establece la mínima versión de Android compatible. Usa Android 4.0 (nivel de API 14: Ice Cream Sandwich) o Android 4.1 (nivel de API 16: Jelly Bean). Estas versiones proporcionan la máxima cobertura en dispositivos nuevos. Si configuras minSdkVersion, también será posible que las herramientas de compilación de Android notifiquen el uso incorrecto de nuevas API que posiblemente no estén disponibles en versiones anteriores de la plataforma. De esta forma, los desarrolladores evitan problemas accidentales relacionados con la compatibilidad con versiones anteriores.
  • Consulta los paneles de Android, la Google Play Developer Console de tu app y los informes de la industria en tus mercados de destino para determinar las versiones de Android que conviene abarcar según tus usuarios de destino.

Usa las bibliotecas de compatibilidad de Android

  • Usa las bibliotecas de compatibilidad que provee Google, como la de diseño y AppCompat, para asegurarte de que tu app brinde una experiencia uniforme en distintas versiones de SO. El paquete de la biblioteca de compatibilidad de Android es un conjunto de bibliotecas de código que proporciona versiones de API del framework de Android compatibles con versiones anteriores y funciones que solo están disponibles a través de las API de la biblioteca.
  • Entre los aspectos destacados, se incluyen los siguientes:
    • Biblioteca de compatibilidad para v4 y v7: Muchas API de framework para versiones anteriores de Android, como ViewPager, ActionBar, RecyclerView y Palette.
    • Biblioteca de compatibilidad de diseño: varias API para poder agregar patrones y componentes de material design a tus apps.
    • Biblioteca de compatibilidad con multidex: compatibilidad con apps de gran tamaño que tengan más de 65 mil métodos. Esto puede ocurrir si tu app usa muchas bibliotecas.
  • Para obtener más información sobre las bibliotecas de compatibilidad disponibles, consulta la sección sobre las funciones de las bibliotecas de compatibilidad en el sitio para desarrolladores de Android.

Usa Google Play Services

  • Google Play Services ofrece lo mejor de las Google API, independientemente de la versión de la plataforma Android. Considera usar funciones de Google Play Services para ofrecer la experiencia de Google más optimizada en dispositivos Android.
  • Google Play Services también incluye API útiles, como GcmNetworkManager, que proporciona la mayoría de los elementos de la API JobScheduler de Android 5.0 para versiones anteriores de Android.
  • Google Play Store distribuye automáticamente las actualizaciones de Google Play Services y las nuevas versiones de la biblioteca del cliente se distribuyen mediante Android SDK Manager.

Uso eficaz de la memoria

Reduce la superficie de memoria en dispositivos de bajo costo

  • Si ajustas dinámicamente la superficie de memoria, será más fácil garantizar la compatibilidad en dispositivos con distintas configuraciones de RAM.
  • Los métodos, como isLowRamDevice() y getMemoryClass(), ayudan a determinar las restricciones de memoria durante el tiempo de ejecución. A partir de esta información, puedes reducir el uso de memoria. Por ejemplo, puedes usar imágenes de menor resolución en dispositivos con poca memoria.
  • Para obtener más información sobre la administración de memoria en apps, consulta la capacitación de Android sobre la administración de la memoria de tu app.

Evita procesos de ejecución prolongada

  • Los procesos de ejecución prolongada quedan en la memoria y pueden hacer que el dispositivo funcione con lentitud. En la mayoría de los casos, la app debe activarse para un evento en particular, procesar los datos y cerrarse. Deberías usar Google Cloud Messaging (GCM) y/o GcmNetworkManager para evitar servicios de ejecución prolongada en segundo plano y disminuir la exigencia de memoria en el dispositivo del usuario.

Evalúa el consumo de memoria

  • Android Studio proporciona herramientas para evaluar y generar perfiles de memoria. De esta forma, te permite medir el uso de memoria durante el tiempo de ejecución. La evaluación de la superficie de memoria de tu app te permite controlar el uso de memoria en distintas versiones de la app. Esto ayuda a detectar crecimientos involuntarios de superficie de memoria. Estas herramientas se pueden usar de las siguientes maneras:
    • Usa la herramienta Monitor de memoria para saber si hay patrones no deseados de eventos de recolección de elementos no usados que provocan problemas de rendimiento.
    • Ejecuta Heap Viewer para identificar tipos de objeto que se asignen o queden asignados de forma inesperada o innecesaria.
    • Usa Allocation Tracker para identificar la ubicación del problema en el código.
  • Para obtener más información sobre la evaluación del uso de memoria, consulta las herramientas de generación de perfiles de memoria en el sitio para desarrolladores de Android.

Recursos relacionados

Costo de los datos

En algunos países, el costo de los planes de datos puede superar el 10 % del ingreso mensual. Conserva datos y brinda control para optimizar la experiencia del usuario. Disminuye el consumo de datos y permite que los usuarios controlen el uso de datos de tu app.

Reduce el tamaño de la app

Reduce el tamaño de los elementos gráficos del APK

  • A menudo, los elementos gráficos son los que más amplían el tamaño del APK. La optimización de estos elementos puede implicar descargas más pequeñas y, en consecuencia, menores tiempos de instalación para los usuarios.
  • Para los elementos gráficos como íconos, usa el formato de gráficos vectoriales escalables (SVG). El tamaño de las imágenes SVG es relativamente muy pequeño y estas se pueden representar durante el tiempo de ejecución en cualquier resolución. La Biblioteca de compatibilidad de Android proporciona una implementación para recursos vectoriales que es compatible con versiones anteriores, hasta Android 2.1 (nivel de API 7). Consulta esta publicación de Medium para comenzar a trabajar con vectores.
  • Para imágenes no vectoriales, como las fotografías, usa WebP. WebP disminuye los tiempos de carga de las imágenes, ahorra ancho de banda en la red y está comprobado que permite obtener archivos más pequeños que PNG y JPG con una calidad de imagen igual o superior. Incluso en configuraciones de compresión con pérdida, WebP puede producir una imagen casi idéntica. Android ha ofrecido soporte de WebP para compresión con pérdida desde la versión 4.0 (nivel de API 14: Ice Cream Sandwich) y soporte para compresión sin pérdida/ transparente de WebP desde la versión 4.2 (nivel de API 17: Jelly Bean).
  • Si tienes muchas imágenes grandes en diferentes densidades, considera usar la compatibilidad con múltiples APK para dividir tu APK según la densidad. Esto da como resultado compilaciones destinadas a densidades específicas, lo cual significa que los usuarios con dispositivos de baja densidad no sufrirán la penalidad de no usar elementos de alta densidad.
  • Para obtener más información sobre cómo disminuir el tamaño del APK, consulta Reducir el tamaño del APK y Reducir tu código y tus recursos. Además, puedes encontrar una guía detallada sobre cómo disminuir el tamaño del APK en esta serie de publicaciones de Medium.

Reduce el tamaño del código

  • Ten cuidado con el uso de bibliotecas externas porque no todas las bibliotecas están pensadas para funcionar en apps para dispositivos móviles. Asegúrate de que las bibliotecas de tu app estén optimizadas para dispositivos móviles.
  • Cada biblioteca de tu proyecto de Android agrega a tu APK código que posiblemente no se use. También existen algunas bibliotecas que no están pensadas para desarrollos destinados a plataformas móviles. Estas bibliotecas pueden propiciar un crecimiento considerable del APK.
  • Una buena idea es optimizar el código compilado con alguna herramienta, como ProGuard. ProGuard identifica el código que no se usa y lo quita del APK. Además, puedes activar la disminución de recursos en el momento de la compilación si estableces minifyEnabled=true y shrinkResources=true en build.gradle. De esta forma, se quitan automáticamente los recursos no empleados de tu APK.
  • Cuando uses los servicios de Google Play, debes incluir de forma selectiva solo las API necesarias en tu APK.
  • Para obtener más información sobre cómo disminuir el tamaño del código de tu APK, consulta la capacitación de Android sobre cómo evitar frameworks de inserción de dependencias.

Permite que la app se pueda mover a un almacenamiento externo (SD)

  • A menudo, los dispositivos de bajo costo cuentan con poco almacenamiento integrado. Los usuarios pueden ampliar el almacenamiento con tarjetas SD; sin embargo, las apps deben declarar explícitamente que admiten instalaciones en almacenamiento externo antes de que los usuarios puedan moverlas.
  • Permite que la app se instale en almacenamientos externos usando la marca android:installLocation en tu AndroidManifest. Para obtener más información sobre cómo lograr que tu app se pueda mover a un almacenamiento externo, consulta la guía de Android sobre la ubicación de instalación de las apps.

Reduce el uso de disco de tu app tras la instalación

  • Si tu app ocupa poco espacio en disco, es menos probable que los usuarios la desinstalen cuando su dispositivo tenga poco espacio libre. Si usas cachés, es importante que establezcas límites en ellos. De esta forma, evitas que el uso de disco de tu app crezca indefinidamente. Asegúrate de colocar los datos almacenados en caché en getCacheDir(). El sistema puede borrar los archivos de esta ubicación según sea necesario, por lo que no se mostrarán como almacenamiento destinado a la app.

Ofrece uso de red configurable

Ofrece experiencias de incorporación para elecciones subjetivas de los usuarios

  • Las apps que les permiten a los usuarios disminuir el uso de datos son bien vistas, incluso si exigen grandes requisitos de datos. Si tu app consume un ancho de banda considerable (por ejemplo, las apps de transmisión de video por Internet), puedes ofrecer una experiencia de incorporación para que los usuarios configuren el uso de la red. Por ejemplo, puedes permitir que el usuario fuerce la transmisión de video por Internet con baja tasa de bits si se trata de una red móvil.
  • Otras configuraciones para que los usuarios controlen la sincronización de datos, la captura previa y el comportamiento del uso de la red (por ejemplo, capturar todas las categorías de noticias con estrellas solo en Wi-Fi) también ayudan a los usuarios a personalizar el comportamiento de la app según sus necesidades.
  • Para obtener más información sobre cómo administrar el uso de la red, consulta la capacitación de Android sobre la administración del uso de red.

Proporciona una pantalla con preferencias de red

  • Mediante una pantalla con preferencias de red, puedes navegar hasta a la configuración de red de la app sin necesidad de entrar en ella. Puedes invocar esta pantalla desde la pantalla de configuración del sistema o la pantalla de uso de datos del sistema.
  • Para proporcionar una pantalla con preferencias de la red a la cual los usuarios puedan tener acceso desde la app y desde la configuración del sistema, incluye una actividad que admita la acción ACTION_MANAGE_NETWORK_USAGE en tu app.
  • Para obtener más información sobre cómo agregar una pantalla con preferencias de red, consulta la capacitación de Android sobre la implementación de una actividad de preferencias.

Recursos relacionados

Consumo de la batería

El acceso a suministros de energía confiables puede variar y los apagones pueden interrumpir las cargas planeadas. Protege las baterías de los usuarios contra el consumo innecesario evaluando el uso de la batería, evitando las funciones wakelock, programando tareas y controlando las solicitudes de sensores.

Reduce el consumo de batería

  • La actividad de tu app debería ser mínima cuando se encuentre en segundo plano y cuando el dispositivo funcione con carga de la batería.
  • Los sensores, como el GPS, también pueden suponer un consumo importante para la batería. Por esta razón, te recomendamos usar la API FusedLocationProvider. La FusedLocationProvider API administra la tecnología de ubicación subyacente y es una API simple que te permite especificar requisitos —(como gran precisión o poca energía)—a un alto nivel. También optimiza el uso de la batería del dispositivo, ya que almacena ubicaciones en caché y procesa solicitudes por lote entre apps. Si deseas obtener más información sobre métodos ideales para solicitar ubicaciones, consulta la guía de capacitación Cómo obtener la última ubicación conocida.
  • Los wakelocks son mecanismos que mantienen encendido el dispositivo para poder realizar actividades en segundo plano. Debes evitar usar wakelocks, ya que no permiten que el dispositivo cambie a estados de poca energía.
  • Para disminuir la cantidad de veces que el dispositivo se activa, procesa por lotes la actividad de la red. Para obtener más información sobre el procesamiento por lotes, consulta la capacitación de Android sobre la optimización de descargas para un acceso eficiente a la red.
  • GcmNetworkManager planifica tareas y permite que los servicios de Google Play procesen operaciones por lotes en el sistema. Esto simplifica mucho la implementación de patrones comunes, como la espera de conectividad de red, el estado de carga del dispositivo, los reintentos y las interrupciones. Usa GcmNetworkManager para llevar a cabo las actividades no esenciales en segundo plano cuando el dispositivo se esté cargando y esté conectado a una red sin medición de uso.
  • Para obtener más información sobre la manera en que la actividad de la red puede consumir la batería y cómo solucionar este problema, consulta Cómo reducir el consumo de batería debido a la red.

Evalúa el consumo de batería

  • Si evalúas el uso de tu app en un entorno controlado, te será más fácil saber cuáles son las tareas que consumen mucha batería en tu app. Una práctica recomendada es evaluar el uso de batería de tu app para medir la eficiencia y seguir los cambios con el tiempo.
  • Batterystats recopila los datos de la batería relacionados con tus apps y Battery Historian convierte estos datos en vistas HTML. Para obtener más información sobre cómo disminuir el uso de la batería, consulta la capacitación de Android sobre cómo optimizar la duración de la batería.

Recursos relacionados

Contenido

Verifica que tu app funcione bien en varias pantallas: ofrece gráficos de buena calidad y bien definidos, y diseños adecuados en pantallas de baja resolución y físicamente pequeñas. Asegúrate de que el diseño de tu app permita localizarla fácilmente teniendo en cuenta las variedades de idiomas: permite variaciones en el espaciado, la densidad, el orden, el énfasis y la redacción. También controla que la fecha, la hora y otros elementos similares estén internacionalizados y se muestren según la configuración del teléfono.

IU rápida y receptiva

Respuesta táctil en todos los elementos táctiles

  • La respuesta táctil incorpora sensación relacionada a la interfaz de usuario. Debes asegurarte de que tu app proporcione respuesta táctil en todos los elementos táctiles para disminuir lo más posible la latencia percibida en ella.
  • Una interacción receptiva incentiva a los usuarios a explorar más la app, ya que se crean reacciones oportunas, lógicas y muy placenteras en la pantalla tras la intervención del usuario. La interacción receptiva eleva el valor de una app, desde un servicio de suministro de información hasta una experiencia que establece comunicación usando varias respuestas visuales y táctiles.
  • Para obtener más información, consulta la capacitación de Android sobre la personalización de la respuesta táctil.

La IU siempre debe ser interactiva

  • Las apps que no son receptivas cuando llevan a cabo actividades en segundo plano transmiten la impresión de ser lentas y reducen la satisfacción de los usuarios. Asegúrate de que tu app siempre tenga una IU receptiva, independientemente de la actividad en segundo plano. Para lograr esto, realiza las operaciones de red o de alta exigencia en un subproceso en segundo plano (mantén el subproceso de la IU lo más libre posible).
  • Las apps de material design representan cada operación en un solo indicador de actividad. De esta manera, usan una cantidad mínima de cambios visuales cuando la app carga contenido. Evita bloquear diálogos con indicadores de carga.
  • Los estados vacíos se producen cuando el contenido convencional de una vista no se puede mostrar. Puede ser una lista sin elementos o una búsqueda sin resultados. Evita los estados completamente vacíos. En el estado vacío más básico se muestran una imagen no interactiva y una consigna de texto. Si no tienes una imagen, o esta no termina de cargarse, siempre debes mostrar un marcador de posición estático o crear un marcador de posición dinámico usando la biblioteca Palette para generar colores de marcador de posición que coincidan con la imagen en cuestión.
  • Para obtener más información, consulta la capacitación de Android sobre cómo mantener la capacidad de respuesta de tu app.

Apunta a 60 marcos por segundo en dispositivos económicos

  • Asegúrate de que tu app siempre funcione rápido y sin problemas, incluso en dispositivos económicos.
  • La superposición puede lentificar considerablemente el funcionamiento de la app; se produce cuando los píxeles se dibujan más de una vez por barrido. Una imagen con un botón encima es un ejemplo de superposición. Si bien algunas veces no es posible evitar la superposición, se debe minimizar para garantizar que el índice de fotogramas sea fluido. Ejecuta Depurar superposición GPU en tu app para controlar que la superposición sea mínima.
  • En los dispositivos Android, la pantalla se actualiza a 60 fotogramas por segundo (fps). Esto significa que tu app debe actualizar la pantalla en unos 16 milisegundos. Realiza un perfil de tu app usando herramientas del dispositivo para saber si esta no cumple con el promedio de 16 ms y cuándo sucede esto.
  • En los dispositivos más económicos, disminuye o quita las animaciones para aliviar la carga en la CPU y la GPU del dispositivo. Para obtener más información, consulta la capacitación de Android sobre cómo mejorar el rendimiento del diseño.
  • Una eficaz jerarquía de vistas puede acelerar tu app sin aumentar el consumo de memoria. Para obtener más información, consulta la sección sobre Rendimiento y jerarquías de vistas.

Si el inicio anticipado es lento, usa una pantalla de carga durante la primera ejecución

  • La pantalla de carga es la primera experiencia que tiene el usuario de tu aplicación. Si tu app arranca con una imagen negra, los usuarios percibirán un mayor tiempo de carga. Considera usar una IU con marcador de posición o una pantalla de carga con una marca para disminuir la percepción del tiempo de carga.
  • Una IU con marcador de posición es la transición de inicio más dinámica y es adecuada tanto para inicios de la app como para transiciones de actividades dentro de ella.
  • Las pantallas de carga con marca proporcionan una exposición momentánea a la marca, con lo cual se libera la IU para centrar la atención en el contenido.
  • Para obtener más información sobre la implementación de pantallas de presentación, consulta la sección de pantallas de carga en la especificación de Material Design.
  • La mejor forma de lidiar con inicios lentos es evitarlos. En la sección sobre el rendimiento del tiempo de inicio, encontrarás información que podrá ayudarte a acelerar el tiempo de inicio de tu app.

Prácticas recomendadas para IU

  • Material Design es un idioma visual que sintetiza los principios clásicos del buen diseño con la innovación y las posibilidades que ofrecen la tecnología y la ciencia. El objetivo de Material Design es desarrollar un solo sistema subyacente que permita una experiencia unificada entre plataformas y tamaños de dispositivos. Considera usar componentes claves de Material Design para que los usuarios sepan cómo usar tu app de forma intuitiva.
  • Los componentes listos para usar de Material Design están disponibles a través de la biblioteca Design Support. Android 2.1 (nivel de API 7) y versiones posteriores admiten estos componentes.

Localización

  • Los usuarios de tu app pueden vivir en cualquier parte del mundo y su lengua materna puede ser distinta de la tuya. Si no presentas tu app en un idioma que los usuarios puedan comprender, habrás perdido una oportunidad. Por lo tanto, debes localizar tu app para idiomas regionales claves.
  • Para obtener más información, visita la capacitación de Android sobre compatibilidad con varios idiomas.
  • A partir de Android 7.0 (nivel de API 24), el framework de Android pone a disposición un subconjunto con las ICU4J API, que pueden ayudarte a localizar tu app a varios idiomas. Para obtener más información, consulta ICU4J Android Framework API.

Recursos relacionados