Pièges du développement instantané de Google Play



Bonjour, Habr! Je m'appelle Kamo Spertsyan, je suis engagé dans le développement Android chez PROFI.RU. J'ai récemment écrit une application de lancement instantané pour nos clients. Si vous n'êtes pas familier avec la technologie, je vous invite à visiter d'abord les développeurs Android .

Plus de deux ans se sont écoulés depuis la présentation des applications instantanées (Google Play Instant) sur Google I / O 2016. Il existe de nombreux articles sur le Web sur la façon de créer des applications avec un lancement instantané. A en juger par eux, il n'y a rien de compliqué à cela. Mais en réalité, ce n'est pas entièrement vrai. Je vais essayer de décrire les principales difficultés que j'ai eu à traverser de la création d'un projet vide à la publication d'Instant App sur Google Play. J'espère que cet article sera utile aux développeurs qui n'ont pas encore venir.

Choix de l'approche


La plupart des sources décrivent le processus de conversion de l'application entière vers l'application instantanée. Cependant, notre application n'a en aucun cas respecté la limite de 4 Mo et a fourni beaucoup plus de fonctionnalités que nécessaire pour nous familiariser avec le service avant l'installation. Maintenant en mode test, Google a augmenté la taille autorisée de l'application avec un lancement instantané à 10 Mo.

J'avais le choix entre deux approches pour créer l'application instantanée. La première consiste à prendre l'application terminée et à en supprimer les fonctionnalités inutiles. La seconde consiste à créer un projet vide et à y transférer les fonctionnalités nécessaires. Ayant considéré la première option comme étant rapide, mes collègues et moi l'avons testée sur un hackathon local et en même temps nous sommes convaincus de son désespoir. Tout d'abord, cela a pris beaucoup de temps (environ 40 heures-homme). Deuxièmement, la taille de l'application s'est avérée très importante en raison d'un excès de code et de ressources. Troisièmement, la maintenance compliquée du code supplémentaire. Nous avons frénétiquement essayé d'intégrer l'application résultante dans 4 Mo pendant le hackathon, et à la fin nous n'avions toujours pas le temps.

Transfert de fonctionnalités


Enseigné par une expérience amère, j'ai créé un projet vide et j'ai commencé à y copier uniquement les modules d'application nécessaires. Nous prenons en charge l'architecture modulaire, c'était donc facile à faire. Ici, je suis tombé sur le premier problème - vous ne pouvez pas utiliser les services dans Instant Apps. Dans mon cas, cette restriction n'était pas critique: nous avons utilisé le service pour télécharger des photos, et dans l'application instantanée, nous avons refusé cette fonctionnalité, motivant les utilisateurs à télécharger l'application principale. Mais ce point mérite d'être considéré si votre application utilise également des services.

À ma grande surprise, l'application obtenue en copiant uniquement les morceaux de code nécessaires ne cadrait toujours pas dans les 4 Mo valides et pesait environ 5 Mo. Dans cet article, Google donne des conseils sur cette affaire, mais ils m'ont un peu aidé. La seule chose que nous pouvions refuser était les polices personnalisées, mais leur poids n'affectait pas de manière significative la taille de l'APK.

Ensuite, je me suis souvenu que ProGuard dans notre projet était désactivé sur les assemblys de débogage. Inclusion simple

minifyEnabled true 

réduit la taille de l'application de près de la moitié. Oh miracle - la limite de 4 Mo est atteinte!

Migration de données


Ensuite, le problème de la migration des données devait être résolu. Comme vous le savez, les applications instantanées sont prises en charge par le système d'exploitation Android à partir de la version 5.0. Dans le même temps, la migration automatique des données ne fonctionne que depuis Android 8.0. Pour ce faire, il suffit d'utiliser des fichiers de préférences partagées portant le même nom dans les deux applications. Pour les versions 5.0 à 7.1, la migration doit être écrite manuellement à l'aide de l' API cookie ou de l' API de stockage . J'ai utilisé Cookie et je n'ai rencontré aucun problème particulier - cependant, cela a nécessité des modifications non seulement du côté de l'application instantanée, mais également dans l'application installée. Donc, à la fin, j'ai dû publier une nouvelle version de l'application et la diffuser à l'ensemble du public pour la sortie d'Instant App.

Débogage


Avec le débogage, tout n'était pas si simple.

Tout d'abord, Google Play Instant ne prend pas en charge les connexions réseau non sécurisées, alors oubliez http, uniquement https. Pour moi, cela signifiait des tests sur les serveurs de production, car tous les bancs de test fonctionnaient sur http. Pas critique, mais pas assez agréable.

Deuxièmement, le lancement de l'application instantanée elle-même: vous pouvez tester l'application comme normale, installable, mais uniquement pour le moment. Lors du démarrage d'Android Studio, il est impossible de vérifier la mise à jour instantanée de l'application pour une application "complète". Par exemple, pour tester le transfert correct des données utilisateur. Pour ce faire, exécutez l'application avec un lancement instantané, tout comme l'application instantanée. Il existe deux façons de procéder:

  1. lancer l'application à l'aide d'un utilitaire spécial à partir du SDK Android;
  2. mettez-le dans la console pour les tests internes et parcourez le Play Market.

La première méthode est assez pratique. L'utilitaire est inclus dans le SDK Android, mais n'est pas installé par défaut. Pour installer dans Android Studio, vous devez suivre ces étapes:

  1. allez dans Préférences -> Apparence et comportement -> Paramètres système -> SDK Android ;
  2. sélectionnez l'onglet Outils SDK ;
  3. cochez la case en regard du SDK de développement instantané de Google Play et cliquez sur Appliquer .


À la dernière étape, faites attention au répertoire dans lequel l'utilitaire sera installé. Plus loin sur ce chemin, nous serons intéressés par le fichier ./extras/google/instantapps/ia . Avec lui, vous pouvez simuler un lancement instantané de l'application en exécutant la commande

 ia run <  APK-, bundle-  URL> 

Jusqu'au moment où je suis tombé sur cet utilitaire, j'ai utilisé la deuxième méthode, avec la publication constante de l'application dans la console Google Play. Mais puisque l'application publiée n'apparaît pas tout de suite dans le magasin, mais après un temps indéfini (cela m'a pris une demi-heure à un jour), cette façon de tester n'était pas bonne. Cependant, il n'est pas destiné à cela. Soit dit en passant, si vous publiez l'application instantanée sur la console Google Play à grande fréquence, je vous conseille d'envisager la possibilité de déterminer le code de version de l'application après le lancement. Sinon, il peut être difficile de comprendre si la dernière version publiée ou la précédente a été lancée.

Publication


Enfin, lorsque votre application est testée et prête à être publiée, ne vous précipitez pas pour vous détendre! Premièrement, le code de version ( versionCode ) de l'application instantanée ne doit pas dépasser le code de version de l'application installée. Je vous recommande de donner de l'espace à l'avance pour la créativité: lorsque vous libérez l'application principale, spécifiez la valeur évidemment significative du code afin de ne pas vous lier les mains. La suppression de l'application instantanée publiée de la console afin de «libérer» le code de version d'un autre assembly échouera. Formellement, vous avez la possibilité NM de lancer Instant App pendant que vous avez l'application principale avec versionCode = N et l'application avec lancement instantané avec versionCode = M sur Google Play.

De plus, pour la version de l'application instantanée, assurez-vous qu'elle ne sera pas disponible pour un public plus large que l'application principale. En d'autres termes, chaque utilisateur d'Instant App devrait pouvoir installer l'application principale.

L'audience est principalement affectée par les autorisations de l'application spécifiées dans le fichier manifeste ( autorisations ) - elles doivent être les mêmes pour les deux applications (à l'exception des autorisations qui n'affectent pas l'audience). Supposons que si votre application principale nécessite une autorisation pour déterminer la géolocalisation, et dans l'application instantanée, cela n'est pas nécessaire, vous devez toujours le spécifier là et là.

De plus, certaines bibliothèques de support peuvent restreindre le cercle des utilisateurs finaux. C'était donc dans notre cas. La console a lancé une erreur de "différence d'apk de ciblage" , bien que les autorisations des deux applications soient les mêmes. À la recherche d'une solution, je suis tombé sur ce problème avec Stack Overflow, où il est conseillé d' exécuter les fichiers APK de l' application via l'utilitaire aapt . Il affichera des informations détaillées sur les fichiers, y compris toutes les dépendances. Après avoir calculé la différence de sortie pour les deux fichiers, j'ai remarqué un indice: l'application en cours d'installation avait la ligne uses-gl-es: '0x20000' , qui était absente dans l'application instantanée. Une courte navigation sur le réseau m'a conduit à une solution: cette ligne indique que l'application utilise la bibliothèque OpenGL, qui, à son tour, est utilisée dans les cartes. En effet, notre application principale utilisait la bibliothèque play-services-maps , mais pas l'application instantanée. L'ajout de cette dépendance à l'application instantanée m'a permis de finalement libérer l'application.

Pour résumer


  1. Les applications instantanées ne peuvent pas utiliser les services et les réseaux non sécurisés (http). La taille du fichier APK final ne doit pas dépasser 4 Mo (cette restriction sera peut-être bientôt simplifiée à 10 Mo).
  2. Pour réduire la taille du fichier APK, vous pouvez utiliser des optimiseurs et des obfuscateurs de code (par exemple, ProGuard).
  3. Les préférences partagées sont transférées de l'application instantanée vers l'application principale automatiquement pour Android 8.0+, pour les versions antérieures, il est nécessaire d'écrire manuellement via l' API de cookie ou l' API de stockage . Il convient de tenir compte de la nécessité de publier une application préparée pour la migration des données avant de publier Instant App.
  4. Pour déboguer l'application instantanée, vous pouvez utiliser l'utilitaire spécial du SDK de développement instantané Google Play inclus dans le SDK Android.
  5. L'apparition de l'application instantanée publiée dans la console sur les appareils finaux peut se produire avec un retard d'une demi-heure à un jour. Il convient de prendre soin de pouvoir déterminer sans ambiguïté quelle version de l'application instantanée a été lancée depuis le Play Market.
  6. Le code de version de l'application instantanée ne doit pas dépasser le code de version de l'application principale.
  7. La liste des appareils sur lesquels l'application instantanée sera disponible ne doit pas dépasser la liste des appareils sur lesquels l'application principale est disponible. Pour ce faire, vous devez spécifier les mêmes autorisations dans les fichiers manifeste, ainsi que faire attention aux limitations possibles dues aux bibliothèques auxiliaires.

C’est tout. J'espère que vous trouverez ces informations utiles. Je serai heureux de toute rétroaction!

Sources utiles:


  1. Documentation instantanée de Google Play sur les développeurs Android
  2. Conseils pour réduire la taille du fichier APK de l'application instantanée
  3. FAQ instantanée de Google Play
  4. Migration des cookies
  5. Migration des données à l'aide de l'API de stockage

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


All Articles