Errores del desarrollo instantáneo de Google Play



Hola Habr! Mi nombre es Kamo Spertsyan, estoy involucrado en el desarrollo de Android en PROFI.RU. Recientemente escribí una aplicación de lanzamiento instantáneo para nuestros clientes. Si no estás familiarizado con la tecnología, te invito a que primero visites Desarrolladores de Android .

Han pasado más de dos años desde la presentación de Instant Apps (Google Play Instant) en Google I / O 2016. Hay muchos artículos en la web sobre cómo crear aplicaciones con inicio instantáneo. A juzgar por ellos, no hay nada complicado en esto. Pero en realidad esto no es del todo cierto. Trataré de describir las principales dificultades por las que tuve que pasar desde la creación de un proyecto vacío hasta la publicación de la aplicación instantánea en Google Play. Espero que este artículo sea útil para los desarrolladores que aún no han llegado.

Elección de enfoque


La mayoría de las fuentes describen el proceso de convertir la aplicación completa a la aplicación instantánea. Sin embargo, nuestra aplicación no alcanzó el límite de 4 MB de ninguna manera y proporcionó mucha más funcionalidad de la requerida para familiarizarnos con el servicio antes de la instalación. Ahora en modo de prueba, Google ha aumentado el tamaño permitido de la aplicación con un lanzamiento instantáneo a 10 MB.

Tuve la opción de dos enfoques para crear la aplicación instantánea. El primero es tomar la aplicación terminada y eliminar funcionalidades innecesarias. El segundo es crear un proyecto vacío y transferir la funcionalidad que se necesita en él. Habiendo considerado que la primera opción era rápida, mis colegas y yo la probamos en un hackatón local y al mismo tiempo nos convencimos de su desesperanza. En primer lugar, tomó mucho tiempo (alrededor de 40 horas hombre). En segundo lugar, el tamaño de la aplicación resultó ser muy grande debido al exceso de código y recursos. En tercer lugar, el código extra complicaba el mantenimiento. Intentamos frenéticamente ajustar la aplicación resultante en 4 MB durante el hackathon, y al final todavía no tuvimos tiempo.

Transferencia de funciones


Enseñado por la amarga experiencia, creé un proyecto vacío y comencé a copiar solo los módulos de aplicación necesarios. Apoyamos la arquitectura modular, por lo que fue fácil de hacer. Aquí me encontré con el primer problema: no puedes usar los servicios en las aplicaciones instantáneas. En mi caso, esta restricción no fue crítica: utilizamos el servicio para cargar fotos, y en la aplicación instantánea rechazamos esta función, motivando a los usuarios a descargar la aplicación principal. Pero vale la pena considerar este punto si su aplicación también utiliza servicios.

Para mi sorpresa, la aplicación obtenida copiando solo las piezas de código necesarias todavía no cabía en los 4 MB válidos y pesaba unos 5 MB. En este artículo, Google da consejos sobre este caso, pero me han ayudado un poco. Lo único que podíamos rechazar eran las fuentes personalizadas, pero su peso no afectaba significativamente el tamaño de la APK.

Entonces recordé que ProGuard en nuestro proyecto estaba deshabilitado en los ensamblajes de depuración. Inclusión simple

minifyEnabled true 

redujo el tamaño de la aplicación a casi la mitad. ¡Oh milagro! ¡Se ha alcanzado el límite de 4 MB!

Migración de datos


A continuación, el problema de la migración de datos debía resolverse. Como sabe, las aplicaciones instantáneas son compatibles con el sistema operativo Android desde la versión 5.0. Al mismo tiempo, la migración automática de datos solo funciona desde Android 8.0. Para hacer esto, es suficiente usar archivos de preferencias compartidos con el mismo nombre en ambas aplicaciones. Para las versiones 5.0 a 7.1, la migración debe escribirse manualmente utilizando la API de cookies o la API de almacenamiento . Utilicé Cookie y no encontré ningún problema especial; sin embargo, esto requirió cambios no solo en el lado de la aplicación instantánea, sino también en la aplicación instalada. Así que al final tuve que lanzar una nueva versión de la aplicación y presentarla a toda la audiencia para el lanzamiento de la aplicación instantánea.

Depuración


Con la depuración, todo resultó no ser tan simple.

Primero, Google Play Instant no admite conexiones de red inseguras, así que olvídate de http, solo https. Para mí, esto significaba probar en servidores de producción, ya que todos los bancos de prueba funcionaban en http. No es crítico, pero no lo suficientemente agradable.

En segundo lugar, el lanzamiento de la aplicación instantánea en sí: puede probar la aplicación como normal, instalable, pero solo por el momento. Al comenzar a través de Android Studio, es imposible verificar la actualización de la aplicación instantánea a una aplicación "completa". Por ejemplo, para probar qué tan correctamente se transfieren los datos del usuario. Para hacer esto, ejecute la aplicación con inicio instantáneo al igual que la aplicación instantánea. Hay dos formas de hacer esto:

  1. inicie la aplicación utilizando una utilidad especial del SDK de Android;
  2. póngalo en la consola para pruebas internas y recorra Play Market.

El primer método es bastante conveniente. La utilidad está incluida en el SDK de Android, pero no está instalada de manera predeterminada. Para instalar en Android Studio, debe seguir estos pasos:

  1. vaya a Preferencias -> Apariencia y comportamiento -> Configuración del sistema -> SDK de Android ;
  2. seleccione la pestaña Herramientas del SDK ;
  3. marque la casilla junto al SDK de desarrollo instantáneo de Google Play y haga clic en Aplicar .


En el último paso, preste atención al directorio en el que se instalará la utilidad. Más adelante en este camino, nos interesará el archivo ./extras/google/instantapps/ia . Con él, puede simular un inicio instantáneo de la aplicación ejecutando el comando

 ia run <  APK-, bundle-  URL> 

Hasta el momento en que me encontré con esta utilidad, utilicé el segundo método, con la publicación constante de la aplicación en Google Play Console. Pero dado que la aplicación publicada no aparece en la tienda de inmediato, pero después de un tiempo indefinido (me llevó de media hora a un día), esta forma de prueba no fue buena. Sin embargo, no está destinado a esto. Por cierto, si publica la aplicación instantánea en Google Play Console con gran frecuencia, le aconsejo que considere la posibilidad de determinar el código de versión de la aplicación después del lanzamiento. De lo contrario, puede ser difícil entender si se lanzó la última versión publicada o la anterior.

Publicar


Finalmente, cuando su aplicación esté probada y lista para su publicación, ¡no se apresure a relajarse! En primer lugar, el código de versión ( versionCode ) de la aplicación instantánea no debe exceder el código de versión de la aplicación instalada. Te recomiendo que dejes espacio de antemano para la creatividad: cuando liberes la aplicación principal, especifica el valor obviamente significativo del código para no atar tus manos. La eliminación de la aplicación instantánea lanzada de la consola para "liberar" el código de versión para otro ensamblado fallará. Formalmente, tiene oportunidades de NM para iniciar la aplicación instantánea mientras tiene la aplicación principal con versionCode = N y la aplicación con inicio instantáneo con versionCode = M en Google Play.

Además, para el lanzamiento de la aplicación instantánea, asegúrese de que no esté disponible para un público más amplio que la aplicación principal. En otras palabras, cada usuario de la aplicación instantánea debería poder instalar la aplicación principal.

La audiencia se ve afectada principalmente por los permisos de la aplicación especificada en el archivo de Manifiesto ( permisos ): deben ser los mismos para ambas aplicaciones (con la excepción de los permisos que no afectan a la audiencia). Diga, si su aplicación principal requiere permiso para determinar la geolocalización, y en la aplicación instantánea esto no es necesario, aún debe especificarla allí y allí.

Además, algunas bibliotecas compatibles pueden reducir el círculo de usuarios finales. Así fue en nuestro caso. La consola arrojó un error de "diferencia de apuntado de apk" , aunque los permisos de ambas aplicaciones eran los mismos. En la búsqueda de una solución, me encontré con este problema con Stack Overflow, donde se recomienda ejecutar los archivos APK de la aplicación a través de la utilidad aapt . Mostrará información detallada sobre los archivos, incluidas todas las dependencias. Después de calcular la diferencia en la salida de ambos archivos, noté una pista: la aplicación que se estaba instalando tenía la línea uses-gl-es: '0x20000' , que estaba ausente en la aplicación instantánea. Una breve navegación por la red me llevó a una solución: esta línea dice que la aplicación usa la biblioteca OpenGL, que, a su vez, se usa en los mapas. De hecho, nuestra aplicación principal usaba la biblioteca play-services-maps , pero la aplicación Instant no. Agregar esta dependencia a la aplicación instantánea me permitió finalmente lanzar la aplicación.

Para resumir


  1. Las aplicaciones instantáneas no pueden usar servicios y redes inseguras (http). El tamaño del archivo APK final no debe exceder los 4 MB (quizás esta restricción pronto se simplifique a 10 MB).
  2. Para reducir el tamaño del archivo APK, puede usar optimizadores y ofuscadores de código (por ejemplo, ProGuard).
  3. SharedPreferences se transfieren de la aplicación instantánea a la aplicación principal automáticamente para Android 8.0+, para versiones anteriores es necesario escribir manualmente a través de la API de cookies o la API de almacenamiento . Vale la pena considerar la necesidad de lanzar una aplicación que esté preparada para la migración de datos antes de lanzar la aplicación instantánea.
  4. Para depurar la aplicación instantánea, puede usar la utilidad especial del SDK de desarrollo instantáneo de Google Play incluido en el SDK de Android.
  5. La aparición de la aplicación instantánea publicada en la consola en dispositivos finales puede ocurrir con un retraso de media hora a un día. Vale la pena ocuparse de la capacidad de determinar inequívocamente qué versión de la aplicación instantánea se ha lanzado desde Play Market.
  6. El código de versión de la aplicación instantánea no debe exceder el código de versión de la aplicación principal.
  7. La lista de dispositivos para los que estará disponible la aplicación instantánea no debe exceder la lista de dispositivos para los que está disponible la aplicación principal. Para hacer esto, debe especificar los mismos permisos en los archivos de manifiesto, así como prestar atención a las posibles limitaciones debido a las bibliotecas auxiliares.

Eso es todo Espero que encuentre útil esta información. Estaré encantado de cualquier comentario!

Fuentes utiles:


  1. Documentación instantánea de Google Play sobre desarrolladores de Android
  2. Consejos para reducir el tamaño del archivo APK de la aplicación instantánea
  3. Preguntas frecuentes de Google Play Instant
  4. Migración de cookies
  5. Migración de datos con API de almacenamiento

Source: https://habr.com/ru/post/es436780/


All Articles