Consejos para desarrollar una aplicación de Android: mis lecciones aprendidas
Publicado: 2022-03-11¡Hola! Soy Ivan y he sido desarrollador de aplicaciones para Android durante bastante tiempo. O eso parece. En el pasado (estamos hablando de 2009), Android era solo un bebé y desde entonces vi crecer al Little Green Man . Me temo que hace algún tiempo, Android logró superarme.
Hoy en día, Android no está solo en decenas de miles de teléfonos y tabletas diferentes. Está en su muñeca, en su sala de estar, en su automóvil, y tan pronto como comencemos a asignar direcciones IP a objetos inanimados, estará prácticamente en todas partes a nuestro alrededor. ¡Mucho terreno para que lo cubra incluso un desarrollador de Android experimentado!
También hay más de un millón de aplicaciones solo en Google Play, sin contar Amazon AppStore o mercados en los que generalmente no estamos interesados, como China. No olvidemos las innumerables empresas de desarrollo de aplicaciones móviles que generan miles de millones en ingresos cada año.
Entonces, ¿cómo puede un desarrollador independiente crear una aplicación exitosa en este enorme mercado con grandes jugadores? ¡No tengo idea, no he hecho una aplicación exitosa! Pero, hice uno lindo, y me gustaría compartir mi historia con ustedes.
Lección 1: Conectar los puntos
El éxito (generalmente) no ocurre de la noche a la mañana y esta no es mi primera aplicación. Tengo algunos que van desde éxitos de desarrollo inesperados durante el fin de semana como Calendario ortodoxo macedonio , con más de 30 000 usuarios en un idioma que no pueden entender más de 4 millones de personas, hasta fallas más exitosas como TweetsPie , una aplicación con una gran cobertura mediática y una terrible base de usuarios de poco más de 600 usuarios activos. ¡Muchas lecciones allí!
Si bien estas aplicaciones me ayudaron a comprender un poco mejor la mente de la "escurridiza criatura llamada Usuario", la que me inspiró fue un proyecto de dos horas. Originalmente desarrollado para hacerme millonario, una vez que 1,428,571 usuarios compraron la aplicación, ya que Google toma 30 centavos de cada dólar, The Dollar App se creó para probar mi cuenta de comerciante.
No sabía que años más tarde recibiría un correo electrónico de una madre feliz que decía que era el mejor dólar que había gastado desde que su hijo sonreía cada vez que mi aplicación le daba un abrazo.
¡Y así nació una idea! ¿Por qué no utilizar la necesidad humana fundamental de un abrazo y hacerlo bonito? Hágalo para una audiencia específica, interactivo, desafiante, divertido de usar y aún más divertido de compartir.
Lección 2: Comprender el Android Market
Todas las cosas que mencioné anteriormente se sumaron a una aplicación de fondo de pantalla en vivo. Los conceptos básicos no son tan difíciles de adivinar. Android tiene una cuota de mercado mayor que iOS, pero los usuarios de iOS compran más. Las aplicaciones de mensajería son muy populares, pero los juegos freemium superan las ganancias. China, India, Brasil y Rusia son mercados emergentes, pero carecen de hábitos de gasto. Puede leer el Índice de App Annie para obtener más información.
Entonces, ¿cómo encaja una aplicación de fondo de pantalla en vivo en esto? En primer lugar, elimina la mayoría de las plataformas, ya que un fondo de pantalla en vivo es algo de Android. En segundo lugar, esta función se agregó en Android 2.1, por lo que tiene una gran comunidad y bastantes ejemplos hermosos. En particular, Paperland y el Muzei de código abierto de Roman Nurik, probablemente el mejor punto de referencia para el desarrollo de Android.
Si bien hay muchos fondos de pantalla en vivo, la mayoría de ellos se incluyen en la categoría de paisaje/clima, y muy pocos se incluyen en la categoría de sobrecarga de ternura. Esto es algo que queríamos cambiar y ofrecer algo que te haga sonreír cada vez que desbloqueas tu teléfono, aunque lo hayas desbloqueado por una razón completamente diferente. Te dimos un lindo bulto de alegría para que te abrace antes de irte a la cama por la noche o cuando apagues la alarma por la mañana. Y aún mejor, hágalo personal y personalizable.
Sin más preámbulos, y antes de entrar en detalles técnicos, con orgullo les presento: Ooshies - The Live Wallpaper
Cuenta con:
- aplicación de fondo de pantalla en vivo gratis que te da abrazos
- 12 ooshies únicos para elegir
- contenido gratuito, desbloqueable y adquirible
- actualizaciones meteorológicas actuales
- inicio de sesión social y sincronización de datos
- saludos de temporada
- muchas sorpresas
- un gato ninja
- ¿Mencionamos abrazos?
Lección 3: Trate de hacer que suceda
Ooshies parecía una idea de aplicación de Android bastante sencilla. Pinta un fondo, superpone algunas nubes y estrellas, coloca un oso con un globo encima y listo. Pero no, ¡es Android! Lo que parece fácil suele ser bastante difícil y tendemos a repetir los mismos errores comunes una y otra vez. Aquí hay un resumen rápido de los desafíos que enfrenté:
Aceleración de hardware: ¿por qué dibujar usando la CPU cuando la GPU es mucho mejor en eso? Bueno, resulta que dibujar mapas de bits en un lienzo no se puede acelerar por hardware. Al menos no por el momento.
OpenGL: si queremos aceleración de hardware, debemos usar OpenGL ES o, mejor aún, un marco que haga la mayor parte del trabajo por nosotros.
Carga de mapa de bits: un problema de consumo de memoria bien conocido. Necesitamos asignar 1 byte [0-255] de memoria, para cada canal en el #ARGB, para mostrar un solo píxel. Además, las imágenes que usamos suelen tener resoluciones más altas que la pantalla del dispositivo. Cargarlos todos resultará rápidamente en OutOfMemroyException.
Lanzadores de inicio: el fondo de pantalla en vivo se alojará en el proceso del iniciador de inicio, y diferentes lanzadores tienden a dar diferentes devoluciones de llamada al servicio de fondo de pantalla en vivo (sobre todo Nova y TouchWiz).
Duración de la batería: si no se hace correctamente, los fondos de pantalla en vivo y los widgets pueden consumir mucha batería. Con todo el alboroto sobre la terrible duración de la batería de Lollipop (Android 5.0), la primera aplicación que se lanzará será el fondo de pantalla en vivo.
Por lo tanto, superponer un mapa de bits, pintarlo en un lienzo y luego cambiar de cuadro al tacto para dar un abrazo, no parece gran cosa, incluso si se hace en la CPU, ¿verdad? Así es, no es un problema. Pero, ¿quién quiere un fondo de pantalla en vivo estático? Supera el propósito. El fondo de pantalla debe responder a tus toques, debe moverse a medida que te desplazas por las pantallas de inicio, debe realizar actos de bondad al azar y hacerte sentir feliz.
Y hay un truco de desarrollo de Android para eso. Hay un término llamado efecto de paralaje para agregar profundidad en un espacio bidimensional. Imagínate conduciendo un coche. La casa más cercana a ti se mueve más rápido que la montaña a lo lejos. Se puede lograr el mismo efecto moviendo objetos a diferente velocidad en un lienzo. Aunque todos están en el mismo plano, tu cerebro percibe que los objetos que se mueven más rápido están más cerca de ti. Al igual que agregar sombras paralelas, el efecto de paralaje agrega un eje z.
¡Y aquí es donde se desata el infierno! En la mayoría de los dispositivos, mover el Ooshie, la superposición del clima y el fondo, a diferentes velocidades, produce una caída significativa de la velocidad de fotogramas. Así es como se dibuja un solo cuadro:
canvas.drawBitmap(background, 0 - offsetX / 4, 0, null); canvas.drawBitmap(weatherOverlay, 0 - offsetX / 2, 0, null); if (!validDoubleTap) { canvas.drawBitmap(ooshieNormal, positionX - offsetX, positionY, null); } else { canvas.drawBitmap(ooshieTapped, positionX - offsetX, positionY, null); }
El offset
es un porcentaje de la distancia que el usuario ha recorrido. Es una devolución de llamada que proporciona el motor de fondo de pantalla:
@Override public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep, float yOffsetStep, int xPixelOffset, int yPixelOffset){ super.onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep, xPixelOffset, yPixelOffset); // athe current offset should be a fraction of the screen offset to achieve parallax if (!isPreview()) { float newXOffset = xOffset * 0.15f; wallpaperDrawHelper.setOffsetX(newXOffset); if (isVisible() && hasActiveSurface) { wallpaperDrawHelper.drawFrame(false); } } }
¡Debo señalar que todo esto sería innecesario si supiera cómo trabajar con OpenGL! Está en mi lista TODO , ya que cualquier cosa más compleja que la que tenemos ahora requerirá una aceleración de hardware. Pero, por el momento tengo que trabajar más duro, no más inteligentemente (estoy abierto a sugerencias en los comentarios). Así que esto es lo que hicimos:
Lección 4: Trabaja con lo que tienes
Como grandes partidarios de la iniciativa minSdk=15
, desde el principio eliminamos todos los dispositivos 2.x. El esfuerzo por mantener la compatibilidad con versiones anteriores es mayor que los posibles ingresos de los usuarios que no pueden o no quieren actualizar sus teléfonos. Entonces, en la mayoría de los casos, podremos lograr una experiencia fluida con una opción adicional para desactivar el paralaje si lo deseamos.

Otra gran optimización es cómo manejamos los mapas de bits. Se puede lograr un efecto de paralaje muy similar dibujando dos mapas de bits en lugar de tres:
Superposición de Ooshie: mapa de bits de Ooshie recortado y cuidadosamente escalado (se puede personalizar)
Superposición combinada: un mapa de bits combinado de fondo y clima que se mueve con una fracción de la velocidad de Ooshie
Este truco de desarrollo de Android ahorra memoria y acelera el tiempo de dibujo, para una ligera degradación del efecto de paralaje.
Al desplazarse por las pantallas de inicio, los marcos se dibujarán con bastante frecuencia (idealmente, más de 30 veces por segundo). Es crucial no dibujarlos cuando la pantalla de inicio no está visible (algunas pantallas de bloqueo, algunos cajones de aplicaciones, abrir/cambiar aplicaciones, etc.) para minimizar el uso de la CPU.
Todo esto está estrechamente relacionado con las actualizaciones meteorológicas. Inicialmente, había una tarea repetitiva, que se ejecutaba cada una o dos horas, para sincronizar el clima, pero en realidad era una exageración. Si el usuario no puede ver el fondo de pantalla, la información meteorológica es irrelevante. Entonces, ahora, las actualizaciones del clima ocurren solo cuando el fondo de pantalla está visible.
long lastUpdate = prefStore.getLong(SharedPrefStore.Pref.WEATHER_TIMESTAMP); if (System.currentTimeMillis() - lastUpdate > Consts.WEATHER_UPDATE_INTERVAL){ // update the weather if obsolete Intent intent = new Intent(getApplicationContext(), WeatherUpdateService.class); startService(intent); }
Entonces, básicamente, aquí está la lista de verificación para un dibujo de mapa de bits de software fluido optimizado para memoria:
- Combinar mapas de bits una vez
- Dibujar menos mapas de bits
- Redibujar solo bajo demanda
- Evita las tareas en segundo plano
- Ofrezca a los usuarios cierto control sobre el proceso
Lección 5: Prueba. Prueba. Prueba
¡No puedo enfatizar lo importante que es esto! ¡Nunca, repito NUNCA , libere su aplicación antes de probarla! Y no quiero decir que USTED deba hacer la prueba. Usted escribió el código, sabe cómo funciona e influye en el resultado al conocer las expectativas. No estoy hablando de pruebas JUnit (aunque se recomiendan), sino de implementaciones por etapas, es decir, pruebas alfa y beta.
Si está interesado en el desarrollo de software de Android, los términos son sencillos, pero aquí hay un resumen rápido:
Probadores alfa: un pequeño grupo de personas compuesto por sus compañeros de equipo y personas de la industria, preferiblemente desarrolladores de Android. Lo más probable es que tengan dispositivos de gama alta y jueguen con las opciones de los desarrolladores. Le enviarán seguimientos de pila, informes de errores e incluso le darán algunos consejos y trucos de optimización de código/UI. Perfecto para lanzamientos anticipados con características parciales o faltantes.
Beta testers: una audiencia mucho más amplia con varios datos demográficos. Las versiones estables deben publicarse aquí. Incluso si su nivel de ninja es demasiado alto, nunca puede predecir, y mucho menos tener en cuenta, todas las posibles distribuciones de Android y las formas en que las personas usan sus teléfonos.
Una vez que pasamos el alfa, pensé que habíamos terminado. Pero, chico, ¿me equivoqué? ¡Resultó que no todos los usuarios de Android tienen dispositivos Nexus con el software más reciente! ¿Quién lo sabría? :)
Aquí hay algunos problemas de desarrollo de Android basados en esta revelación:
Los diferentes lanzadores tienen diferentes pantallas de inicio predeterminadas, generalmente la primera o la del medio y, que yo sepa, no hay forma de saber su posición.
Es difícil centrar el Ooshie sin conocer la posición predeterminada de la pantalla de inicio, por lo tanto, el control deslizante de configuración para ajustar el desplazamiento de paralaje.
Un usuario promedio no sabe lo que significa el desplazamiento de paralaje ; se debe usar una terminología mucho más simple en la página de configuración.
Un usuario aleatorio sugerirá su próxima característica.
Así que me gustaría agradecer a todos nuestros probadores beta por el arduo trabajo que hicieron. Espero que obtener todas las funciones más recientes antes que nadie sea una recompensa decente por su dedicación. Si lo desea, también puede ser parte de nuestra comunidad beta de Google+.
Lección 6: Deje que los datos hablen
Hacer una aplicación de Android que se destaque hoy en día es un poco más difícil que hacer una aplicación de calculadora, cuando no había ninguna en 2009. Hacer la aplicación perfecta es difícil. Principalmente porque la perfección está en el ojo del que mira. Lo que es bueno para mí, no significa necesariamente que sea bueno para ti. Por eso es importante dejar que la aplicación crezca. Nuestra lista de comprobación de la hoja de ruta para nuevas funciones muestra que tenemos suficiente trabajo para todo 2015. Entre otras cosas, pronto incluiremos:
- Sonidos
- Fondos de temporada
- Personalizaciones (color de fondo, paquetes meteorológicos, máscaras de ooshie, etc.)
- Ooshies específicos de la región (por ejemplo, babushkas)
- Muchos ooshies nuevos y formas de desbloquearlos.
Ahora, es posible que hayamos mantenido la aplicación en versión beta hasta que todo esté listo, pero de esa manera estamos desperdiciando datos valiosos. No todos los probadores beta dedicarán una parte de su día a enviarle comentarios. Ahí es donde puede beneficiarse al usar herramientas para obtener retroalimentación. Puede utilizar Google Analytics, Flurry, Mixpanel, Crashalytics, ACRA, etc. para recopilar datos de uso.
Por ejemplo, al analizar los datos, notamos que los usuarios no hacen mucho clic en el botón de configuración, por lo que lo hicimos más evidente y agregamos un tutorial rápido para ajustar la configuración.
Aunque se trata de un proceso en segundo plano, se puede utilizar para mejorar aún más la experiencia del usuario. ¿Por qué no mostrarle al usuario cuántas veces:
- él/ella recibió un abrazo
- cuantos dias de lluvia fueron iluminados por una sonrisa
- cuántos toques se necesitaron para desbloquear un Ooshie con un minijuego
- cuántos amigos instalaron la aplicación gracias a ti
Esto es importante porque proporciona consecuencias por sus acciones. No cometas el mismo error que comete nuestro sistema educativo, convirtiendo a los usuarios en consumidores pasivos de contenidos. Hágalos a cargo. Deles la opción de controlar sus propios dispositivos y crear su propia experiencia personal. Si logra empaquetar todo esto en un paquete lindo que roba una sonrisa en el primer toque, entonces no es demasiado descabellado pedirle al usuario favores de spam para desbloquear contenido.
Al final, debe evolucionar el desarrollo de su aplicación de Android en función de estos datos como guía. Aunque está destinada principalmente a madres/niños, esta aplicación puede volverse popular en otros grupos demográficos. Puede que no encaje en nuestra visión original, pero se deben satisfacer las necesidades de los usuarios. De lo contrario, encontrarán a alguien que pueda.
Conclusión
Volvamos a mi TweetsPie fallido más exitoso. A pesar de un par de premios y una gran cobertura mediática, la aplicación no logró retener a sus usuarios (las razones por las que están fuera del alcance de este artículo).
El éxito no siempre es aparente. Gracias a toda la experiencia aprendí mucho. Di, al menos, una docena de conferencias sobre cómo (no) fracasar como startup en varios eventos y hackatones, y logré conseguir un par de clientes en Toptal.
Aún más importante, trato de no repetir los mismos errores de desarrollo de Android con Ooshies siguiendo los consejos y trucos de esta guía.
Para concluir esta larga guía, lo que definimos como un éxito está, en una etapa posterior, estrechamente relacionado con lo que establecimos como objetivo al principio. La medida de éxito más común es, por supuesto, ganar mucho dinero. No importa si su aplicación lo logra o no, debe intentar que suceda, y créame, al final se convertirá en una mejor persona (con suerte, una que logre aprender OpenGL). Harás nuevos amigos, pocos enemigos y, si tienes la suerte o la inteligencia, harás felices a muchos usuarios.
Puede consultar nuestro sitio web o descargar Ooshies para probarlo.