Lorsque vous vous impliquez dans le programme d'accès anticipé, vous ne savez jamais à l'avance ce qui se passera à la fin. Bien sûr, vous espérez que la technologie décollera et que votre application devancera le marché et obtiendra une partie des relations publiques sur Google I / O. Et c'est une bonne motivation pour lire les codes sources au lieu de la documentation au stade initial, qui, de plus, doit être téléchargée à partir des archives secrètes.
À
AppsConf, Evgeny Saturov a montré à quoi pourrait conduire la participation à un accès anticipé en développant une application avec un lancement instantané, expliquant toutes les fonctionnalités de Google Play Instant en cours de route. En déchiffrant son rapport, nous découvrirons d'où viennent les bundles d'applications Android et ce que la livraison dynamique a à voir avec cela, nous familiariser avec les nouveaux plug-ins Gradle et apprendre à faire face aux surprises que les développeurs du SDK nous ont préparés.
À propos du conférencier: Evgeny Saturov (
saturovv ) travaille pour Surf, une entreprise
spécialisée dans le développement personnalisé Android et iOS, et plus récemment, le développement sur Flutter. Eugene Flutter est un passionné et fondateur de FlutterDevPodcast.
Une brève excursion dans l'histoire
Il y a deux ans, un gars formidable est venu chez nous à Surf et a déclaré: «Nous avons une technologie que peu de gens connaissent jusqu'à présent. Et vous avez des clients et des cas intéressants. Voyons, nous vous donnerons notre technologie, vous l'intégrez quelque part et vous obtenez une symbiose sympa. Nous en ferons la promotion sur Google I / O et tout le monde ira bien. "
En fait,
travailler avec le programme d'accès anticipé est un cochon dans un coup de coude . Vous devez travailler avec du code brut, qui, bien sûr, ne fonctionne pas toujours comme prévu et décrit. Dans notre cas:
- Tous les artefacts ont été livrés sous la forme d'une archive ZIP, qui devait être téléchargée tous les quelques jours à partir d'un stockage super secret et mise à jour sur une machine locale uniquement manuellement.
- Vous ne pouvez travailler que dans le "canari".
- Il n'y a presque pas de documentation, seulement des documents Google non structurés dispersés, plus souvent similaires au flux de pensées des développeurs.
- Le déploiement dans la nourriture, bien sûr, est impossible - cela n'est possible qu'après que la technologie a été publiée. Autrement dit, l'ensemble du déploiement est uniquement dans la piste alpha.
- Il est probable qu'après une version publique, il se révélera que le SDK a été complètement réécrit sans prise en charge de la compatibilité descendante. Vous obtenez des interfaces et des API complètement différentes - vous devez tout refaire.
Voici un bref résumé de la façon dont nous avons participé au programme d'accès anticipé.
Tout cela est devenu possible grâce à notre partenaire régulier - la société Labyrinth - la plus grande boutique en ligne de livres et de papeterie en Russie. Ils ont rejoint le projet, ne sachant même pas s'il y aurait un avantage à la fin. Et le fait qu'en 2017, Surf, en tant que studio, faisait partie du programme d'agence certifiée Google. Malheureusement, le programme a été fermé cette année.
Applications instantanées Android
En 2017, pour que l'application s'exécute sans installation, elle devait être sciée correctement en modules.

Nous avons de nouveaux plugins Gradle qui génèrent les artefacts correspondants:
- Module d'application instantanée - un plugin d'application qui a généré une archive ZIP avec un APK, un pour chaque module de fonctionnalité de l'application;
- Module d'application installable - APK généré.
Une hiérarchie à deux niveaux des modules d'entités est apparue. Il ne pouvait toujours y avoir qu'un seul module de fonctionnalités de base et contenait tout le code de base disponible pour toutes les fonctionnalités, ressources, dépendances, etc. Le module Feature de niveau supérieur contenait l'implémentation d'écrans spécifiques.
Mais
c'était long et cher pour un certain nombre de raisons:
- La structure modulaire rigide en soi est une grande limitation. Il est difficile d'imaginer qu'une grande entreprise transformera son application en cours de développement et parfaitement fonctionnelle en une pile de modules fumeurs au fil des ans juste pour prendre en charge une nouvelle technologie qui ne sait toujours pas si elle va décoller ou non.
- Restriction stricte sur la taille de l'assemblage, c'est-à-dire qu'une fonction ne doit pas dépasser 4 Mo. Il s'agit d'une limite objectivement petite, et parfois complètement inaccessible, par exemple, en raison de fortes dépendances ou quelque chose comme ça.
- Assurez-vous d'utiliser AppLinks, car c'est le seul moyen d'accéder à l'application instantanée. L'utilisateur a cliqué sur le lien depuis le courrier, le messager, les résultats de la recherche et est arrivé à votre écran via l'interception du lien.
- Enfin, un grand nombre de limitations techniques. Au début, il était même impossible d'utiliser NDK. Vous ne pouvez pas envoyer de notifications push, recevoir des données sensibles, modifier les paramètres de l'appareil et démarrer des processus d'arrière-plan. Les services, les récepteurs de diffusion et les fournisseurs de contenu n'ont pas pu être utilisés. Seule activité.
La mission principale de l'application instantanée est juste une démonstration de l'interface utilisateur et rien de plus. Le refactoring a été très douloureux, et donc cette histoire est encore presque jamais trouvée en production.
Mais en toute honnêteté, la mise en œuvre de l'application instantanée dans le Labyrinthe a donné une augmentation de 5% des achats via le client mobile.
2019. Google Play Instantané
Deux ans se sont écoulés, dans la cour de 2019 - Instant Apps existe toujours, mais pas en tant que technologie indépendante. Il est encore très rare en production, je ne l'ai pas cherché exprès, mais je ne connais que quelques exemples: Sports.ru, Vimeo. Il est peu probable que Google comptait sur un tel résultat lorsqu'il a annoncé cette technologie.
Désormais, l'application instantanée est appelée différemment - Google Play Instant. Le changement de nom a permis d'éliminer la documentation non pertinente. Si vous voyez l'application instantanée Android, il est immédiatement clair que cela n'est plus pertinent.
En plus du nom, tout le reste a changé, y compris la structure modulaire.
Les demandes sont devenues plus fidèles . La technologie s'intègre de manière complètement différente dans le projet et ne nécessite pas un refactoring aussi douloureux, ce qui est certainement bon.
Mais ce qui est moins évident et à mon avis beaucoup plus important, c'est que cette technologie, restée très niche et rare, est devenue l'ancêtre de toute une famille de technologies dont elle fait désormais partie.
Au départ, Google a positionné l'application instantanée comme une technologie qui attire les gens vers les entreprises, pas vers les applications. Il y avait une directive de conception qui interdisait les demandes d'atterrissage avec un seul bouton "Télécharger la demande complète". Mais un autre problème fondamental a été résolu de côté, et je soupçonne que cela s'est produit par accident.
En février de cette année, le remarquable appareil Samsung Galaxy S10 + avec 1 To de mémoire à bord a vu le jour. Pensez-y juste - un téraoctet! Pourquoi avez-vous tant besoin?!
Selon les statistiques officielles de Google, au cours des 7 dernières années, la taille moyenne des APK a été multipliée par 5,5.

La taille de la construction est vraiment importante, la
recherche sur ces statistiques montre:
- chaque 6 Mo de montage supplémentaire réduit la conversion de l'installation de 1%;
- 70% des utilisateurs vérifient la taille de l'application avant de télécharger;
- 50% des utilisateurs sont intéressés par l'espace que l'application prendra sur l'appareil après l'installation.
Cela est encore plus important si votre public cible est des personnes âgées, ou avec des revenus pas très élevés, ou s'il s'agit de marchés émergents.
Ces derniers sont de plus en plus difficiles à ignorer, car en 2018, c'est l'Inde qui a connu une augmentation incroyable des installations.

Veuillez noter qu'il existe très peu d'iOS et que le nombre total d'installations d'applications Android dépasse celui des États-Unis, du Brésil et de l'Indonésie réunis.
Maintenant, il est clair quel problème peut être résolu avec Google Play Instant. Vous pouvez utiliser des termes incompréhensibles.
Ensemble d'applications Android
Android App Bundle - un nouveau format pour publier des applications sur Google Play. À l'intérieur, tout n'est pas très différent de l'APK: tous les mêmes fichiers dex, manifeste, ressources, actifs, etc. etc. Mais il existe également des métadonnées, qui ne parviennent pas à l'appareil de l'utilisateur.

Les métadonnées sont représentées par trois fichiers: resources.pb, assets.pb, native.pb. En fait, ce sont des tableaux de correspondance des ressources qui se trouvent dans les paramètres d'assemblage et de configuration des appareils.
Livraison dynamique Android
Tout le monde connaît l'existence de la signature d'application par Google Play. Mais tout le monde n'est pas prêt à stocker la clé de version de son application sur Google Play, car il n'y aura pas de retour en arrière.
Il est impossible de quitter la signature d'application par Google Play.Après avoir donné une fois la clé de libération à Google Play, vous ne pouvez plus jamais signer votre demande comme avant, de votre côté. Mais en échange de cela, vous pouvez profiter pleinement du pack d'applications Android en tant que format. Et le processus de signature de l'assemblage sera maintenant un peu différent.

Vous signerez toujours l'assembly avant la sortie sur Google Play, mais vous le signerez avec la clé de téléchargement, qui n'est pas unique. Il peut être rappelé depuis la console, réédité s'il est compromis ou perdu. Vous donnez votre clé de déverrouillage à la console et lui dites au revoir - Google va maintenant signer l'assemblage pour vous et jure qu'il gardera votre clé en sécurité.
Cependant, si vous ne donnez pas la clé de sortie à Google Play, vous ne pourrez pas utiliser quoi que ce soit dans votre projet qui sera discuté plus loin. Google resserre les vis, et même l'application instantanée, sans donner la clé, ne pourra plus se déployer.
En fait, ce n'est pas du tout drôle, parce que les personnes qui ont acheté la promotion Instant App et sont entrées dans toute l'histoire ont refactorisé leurs applications, mais pour une raison quelconque, elles ne peuvent pas donner leur clé à Google Play (ou le service de sécurité est catégoriquement contre ou pour d'autres raisons objectives) se sont retrouvés dans une situation où ils ne peuvent plus soutenir cette décision. Des centaines d'heures de travail ont en fait été jetées à la poubelle.
2014. Le support Split APK apparaît dans Android Lollipop
Puisque nous sommes nostalgiques aujourd'hui, nous reviendrons encore plus tôt dans le passé - en 2014.
Je me souviens encore comment sur mon NEXUS 5, le meilleur téléphone au monde, l'assemblage Android Lollipop est entré avec un design matériel incroyable qui semblait juste un bombardement. Mais il y a eu des changements qui sont passés inaperçus pour beaucoup - c'est le support de l'APK Split.
Split APK - un mécanisme qui vous permet de diviser l'application en petits fichiers APK et, en les installant sur un seul appareil, de les faire se comporter comme une seule application.
N'oubliez pas cela et continuez.
Android Dynamic Delivery est un nouveau format de distribution d'applications sur Google Play.

Nous avions un APK, maintenant le bundle d'applications Android apparaît, pour autant qu'une alternative. AAB agit comme un incubateur-générateur de ces APK très divisés. AAB déploie le chignon de l'APK, qui peut ensuite être utilisé comme une application régulière en les installant en parallèle.
Voyons de quel type d'APK il s'agit.

Au minimum, il s'agit de l'APK de base, qui joue le même rôle que dans l'application instantanée: c'est le code de base, les ressources de base et la logique métier qui sont fouillés entre toutes les fonctionnalités.
Apparaissent également:
- Fichiers APK, au nom desquels il existe des préfixes étrangement similaires aux modificateurs de ressources graphiques (la ligne supérieure du diagramme).
- Une autre famille d'APK nous rappelle les architectures de processeur.
- APK de localisation.
Il y a environ deux ans, lorsque les graphiques vectoriels n'étaient pas aussi répandus, de nombreuses applications contenaient principalement des ressources raster, qui étaient coupées à différentes densités de pixels sur les écrans. L'assemblage pourrait devenir assez lourd. Les utilisateurs ont téléchargé toutes ces ressources, et la plupart d'entre elles ont été stockées sur l'appareil avec un poids mort.
Désormais, un tel mécanisme permet à l'utilisateur de ne recevoir que l'ensemble des ressources nécessaires spécifiquement pour son appareil. Une personne vient sur Google Play, sélectionne l'application, Google Play comprend les caractéristiques de l'appareil de l'utilisateur et donne l'ensemble des fichiers APK fractionnés nécessaires - un fichier APK de chaque catégorie.
Types de livraison dynamique APK:
- Un et un seul APK de base.
- L'APK de configuration est au maximum de trois types: res * x, assets * y, lib * z. Ici: x est le nombre de modificateurs de ressources utilisés; y est le nombre de types d'architectures utilisés; z est le nombre de localisations linguistiques. Si, par exemple, le projet n'utilise pas de code natif et de bibliothèques natives, aucune catégorie ne sera associée au code natif et il restera deux fichiers APK.
- Fonctionnalité dynamique illimitée APK.
L'APK de fonctionnalité dynamique sera discuté plus en détail ci-dessous. Mais d'abord, nous dirons au revoir au bloc Split.
Au revoir Split
Vous pouvez affirmer qu'avant, vous pourriez faire quelque chose de similaire, générer manuellement un tas d'APK avec uniquement le bon ensemble de ressources, puis tout est déployé manuellement sur Google Play.
android { splits { density { enable true exclude "ldpi", "xxhdpi", "xxxhdpi" compatibleScreens 'small', 'normal', 'large', 'xlarge' } } }
Cette entreprise en soi est plutôt douteuse, et maintenant tout cela est tout simplement ignoré. Si vous créez le bundle d'applications Android, un bloc Bundle apparaît, ce qui vous permet de désactiver manuellement la répartition du projet dans l'une des catégories.
android { bundle { language { enableSplit = false } density { enableSplit = true } abi { enableSplit = true } } }
Vous pouvez spécifier que l'application prend en charge, par exemple, uniquement le russe ou uniquement l'anglais, et ignorer cette étape lors de l'assemblage.
Les plus attentifs, probablement, réfléchissent maintenant à ce qu'il faut faire avec les pré-sucettes. Seulement dans Android 5 est apparu le support de l'APK Split. Nous devons en quelque sorte sortir de cette situation, car le SDK Min n'est en aucun cas le 21e.
Pour les préLollipops, la situation est assez maladroite, mais seulement possible. Google Play recueille plusieurs APK pour les pré-sucettes, qui incluent toutes sortes de combinaisons d'APK de configuration. Il n'y a qu'un seul APK, mais il y a beaucoup d'options.
Le pack d'applications Android change notre vie
Et très important. Tout d'abord, il peut être beaucoup plus facile de créer un projet, surtout si vous avez l'habitude de créer manuellement l'APK divisé. Mais d'après mes observations, il n'y en a pas beaucoup.
Deuxièmement, vous ne risquez plus de perdre ou de compromettre la clé de libération. Il n'y aura pas de grande tragédie, si vous perdez votre clé de téléchargement, vous pouvez la rappeler et la réémettre.
Nous ne pointerons pas le doigt - dans le haut du Google Play russe, il y a des applications qui ont longtemps des clés de version sur w3bsit3-dns.com, tous les assemblages personnalisés sont signés avec une clé de version, et il n'y a rien à faire avec cela dans les cinq prochaines années. Il reste à attendre la transition vers la signature V3, qui est apparue avec seulement 28 API.
L'avantage incontestable du pack d'applications Android: les utilisateurs arrêtent de dépenser du trafic et de l'espace disque sur des ressources dont ils n'ont pas besoin. Cela améliore considérablement la rétention de l'application.
Mais si vous avez tous les graphiques dans le vecteur, deux localisations et aucune bibliothèque native, l'avantage sera microscopique.
Module de fonctionnalité dynamique
Dynamic Feature Module est un module fonctionnel qui n'est pas fourni lors de l'installation de l'application, mais qui est téléchargé depuis Google Play et installé uniquement sur demande.
Ces modules sont comparables à l'APK de base.

Il est important que chacun de ces modules de fonctionnalités lui-même contienne également un ensemble de fichiers APK de configuration fractionnés. Par conséquent, le nombre total d'APK peut augmenter au-delà de toute mesure. Mais ce n'est pas du tout votre préoccupation, Google Play le fait.
Applications pour les modules d'entités dynamiques:
Des fonctionnalités utilisées par un très faible pourcentage de l'audience , mais néanmoins importantes pour votre produit. Par exemple, il s'agit d'une application de divertissement de contenu, et 95% de ses utilisateurs consomment du contenu. Mais il y a un très petit pourcentage d'éditeurs qui génèrent du contenu. Pour eux, il y a un éditeur vidéo sympa qui pèse vraiment beaucoup, fonctionne incroyablement cool. Ensuite, cela n'a aucun sens de pondérer l'assemblage pour tout le monde et tout le monde, vous pouvez mettre cette fonctionnalité dans le module de fonctionnalités dynamiques et la fournir uniquement à ceux qui en ont besoin, en la téléchargeant plus tard.
Fonctionnalités lourdes qui ne sont pas liées au scénario d'utilisation principal de l'application. Par exemple, la navigation AR dans un service de carte. Toute fonctionnalité AR est la plus à mettre dans le module de fonctionnalité dynamique.
Fonctionnalités qui devraient être disponibles pour les utilisateurs sans installer l'application elle-même (par exemple, sélectionner un produit dans le catalogue et passer une commande). Certes, c'est quelque chose de très suspect qui rappelle tout.
Les applications instantanées Android sont désormais le module de fonctionnalité dynamique activé instantanément.
Ainsi, il s'avère qu'il existe deux types de modules d'entités dynamiques:
- Les modules de fonctions dynamiques communs sont des modules de fonctions qui sont téléchargés et installés sur un périphérique séparément de l'application principale. Ils y vivent aussi longtemps que l'application elle-même existe. Jusqu'à ce que vous le supprimiez, le module de fonctions dynamiques le sera.
- Modules de fonctions dynamiques activés instantanément - modules de fonctions disponibles pour s'exécuter sans installation sur l'appareil. Ce module vit pour une durée limitée.
Le deuxième type d'applications sur Google Play se distingue par la présence du bouton Try. Lorsque vous cliquez dessus, l'URL par défaut est remplacée et vous pouvez voir à quoi ressemble l'application au moins comme exemple d'une fonctionnalité principale.
Cela peut souvent être trouvé dans la section des jeux. C'est pratique et encore plus applicable qu'aux applications, car vous pouvez télécharger un petit morceau du jeu en démo et voir de quoi il s'agit, cela vaut-il la peine de dépenser votre trafic et votre temps.
Structure modulaire
J'ai déjà dit que la structure modulaire a été simplifiée. Voyons comment.
Au départ, nous avions une structure assez monstrueuse. Entre autres choses, il avait des modules vides, par exemple, le module Instant App était toujours vide, il n'avait pas de code, pas de ressources, mais seulement le fichier build.gradle et c'était tout.
Les développeurs ont pensé, pourquoi alors produire des modules supplémentaires uniquement afin de collecter des artefacts d'un certain type. Et ils l'ont vu, et la fonctionnalité a été transférée au module d'application.
Mais ensuite, ils sont allés encore plus loin et ont pensé - pourquoi avons-nous besoin du module de fonctionnalités de base? Il a des problèmes avec lui, car nous initialisons tout là-bas et son ID d'application est différent. Les béquilles viennent d'ici, par exemple, en transférant l'ID d'application du module d'application vers le module de fonctionnalité de base et en le remplaçant comme un véritable ID d'application de l'application afin que tout soit suivi dans Crashlytics, etc.
En conséquence, cela s'est avéré comme ça.

Ils ont quitté le module d'application, attaché au-dessus des modules de fonctionnalités - et c'est tout!
Ne transmettez pas mes émotions quand je l'ai découvert. Les gars de la grande scène ont dit qu'ils avaient une technologie sympa: "Coupons tous les applications à cette structure!" Mais ce n'est pas du travail pendant 5 minutes, mais du travail avec de grandes conséquences.
En 2017, avoir une application monolithique n'était pas encore une honte. Le labyrinthe était exactement comme ça, alors il n'avait même pas atteint la version publique, mais était en version bêta. Au moment où nous nous sommes impliqués dans le Early Access Program, il y avait déjà environ 90 écrans. Nous avons passé deux mois supplémentaires pour refactoriser, tester et nous assurer que tout fonctionne vraiment.
Et après cela, ils disent:
"Nous sommes trop intelligents, cela peut être fait beaucoup plus facilement .
"Mais revenons à la prose.
Configuration Gradle
Afin de prendre en charge la nouvelle configuration, nous devons d'abord répertorier tous les modules de fonctionnalités dynamiques dans le fichier build.gradle du module d'application dans le bloc Android:
Après cela, dans le fichier build.gradle de chaque module d'entités dynamiques, écrivez la dépendance sur le module d'application:
En principe, rien de compliqué. Mais il y a aussi une configuration de manifestes.
Configuration du manifeste
Dans le manifeste du module d'application, nous pouvons définir le véritable indicateur pour indiquer qu'il existe au moins une fonctionnalité activée instantanément dans cette application:
Si ce drapeau n'est pas présent, il ne sera pas possible de s'incorporer dans la piste correspondante sur Google Play.
En outre, il existe également une configuration manifeste pour chaque module de fonctionnalité dynamique individuellement, dans laquelle il existe davantage de paramètres:
Les deux premiers drapeaux s'excluent légèrement mutuellement, car
onDemand
est la fonctionnalité de base habituelle et
instant
est la même fonctionnalité installable.
Titre - le nom technique du module, selon lequel plus tard, après l'avoir codé en dur dans notre application, nous pomperons ce module depuis Google Play.
Le paramètre
include
est un paramètre pour preLollipops. Si vous la définissez sur false, les utilisateurs de preLollipops ne verront jamais cette fonctionnalité et ne pourront pas l'utiliser.
Configuration des projets Gradle
La durée de vie du plugin Instantapp et du plugin de fonctionnalité était assez courte mais dynamique. Ils ont duré moins de deux ans. Depuis mars de cette année, ils ne sont plus pris en charge.
Maintenant, il n'y a qu'un seul module d'entités dynamiques que nous utilisons:
apply plugin: 'com.android.dynamic-feature'
Configuration du projet dans le module d'application uniquement
Un point important: tous les paramètres concernant la signature (signature-configuration), l'assemblage (ProGuard-configuration), versionCode et versionName doivent être effectués uniquement dans le module d'application build.gradle.
Sinon, ils seront ignorés. Évitez de spécifier l'un de ces blocs de configuration dans les fichiers build.gradle des modules de fonctions dynamiques.
Google play instantané
Maintenant, nous avons ce qui suit.
Les exigences pour la structure modulaire ont été simplifiées autant que possible. C'est vraiment une bonne nouvelle pour ceux qui ne se sont pas encore impliqués. Vous pouvez maintenant essayer, même si vous avez une application avec sa propre structure. Cela ne vous affectera pas du tout, vous pouvez simplement attacher le module sur le dessus, et tout fonctionnera bien.
Les restrictions sur la taille des assemblages sont devenues plus fidèles. Si auparavant c'était 4 Mo, maintenant:
- Les modules de fonctions dynamiques ne sont généralement pas limités en taille;
- Les modules de fonctions dynamiques activés instantanément peuvent prendre jusqu'à 10 Mo.
Mais maintenant, il y a une échelle progressive.

Si votre fonctionnalité:
- plus de 10 Mo, alors je suis désolé;
- de 4 à 10 Mo - accessible par le bouton "Essayer" de Google Play et c'est tout;
- moins de 4 Mo - tous les moyens d'attirer les utilisateurs vers le module Instant-Enabled sont disponibles (lancement à partir de la publicité, par lien, à partir de messages, etc.).
Un mécanisme de chargement des modules est apparu - Play Core API. Peu de gens savent que l'application instantanée était installée via Chrome.
@Override public boolean maybeLaunchInstantApp(Tab tab, String url, String referrerUrl, boolean isIncomingRedirect) { if (tab == null || tab.getWebContents() == null) return false; InstantAppsHandler handler = InstantAppsHandler.getInstance(); Intent intent = tab.getTabRedirectHandler() != null ? tab.getTabRedirectHandler().getInitialIntent() : null; if (isIncomingRedirect && intent != null && intent.getAction() == Intent.ACTION_VIEW) { Intent resolvedIntent = new Intent(intent); resolvedIntent.setData(Uri.parse(url)); return handler.handleIncomingIntent(getAvailableContext(), resolvedIntent, ChromeLauncherActivity.isCustomTabIntent(resolvedIntent)); } else { ... } return false; }
Il s'agit d'un véritable morceau de code de Chrome pour Android, qui a intercepté le lien vers votre application instantanée, est allé sur Google Play et a remplacé les applications instantanées à partir de là. Si l'application instantanée a été détectée, elle a en quelque sorte ouvert l'activité, à partir de laquelle l'application instantanée a ensuite été lancée.
Il y avait donc d'énormes problèmes avec le déploiement de cette fonctionnalité. Avec Samsung, c'est une histoire complètement différente, je soupçonne que leur navigateur intégré a légèrement plus de privilèges que Chrome. L'application instantanée n'a pas fonctionné jusqu'à la dernière.
Play Core Library vous permet d'oublier les problèmes de livraison. Il vous suffit de le brancher sous forme de package:
implementation 'com.google.android.play:core:1.4.0'
Et téléchargez les modules de fonctionnalités dont vous avez besoin sur Google Play.
La bibliothèque a une syntaxe assez fonctionnelle qui vous permet de télécharger des modules un par un:
val splitInstallManager = SplitInstallManagerFactory.create(context)
Ou immédiatement un pack de plusieurs:
val request = SplitInstallRequest .newBuilder() .addModule("feature1") .addModule("feature2") .build()
Raccrocher l'auditeur:
splitInstallManager .startInstall(request) .addOnSuccessListener { sessionId -> ... } .addOnFailureListener { exception -> ... }
Affichez-le dans l'interface utilisateur et réagissez au fait que le module a été installé.
Play Core Library est un bon début:
- Enfin, vous pouvez arrêter d'espérer peut-être face à Google Chrome.
- Vous pouvez démontrer le chargement des modules sur l'interface utilisateur comme vous le souhaitez.
- Il est possible de charger des modules d'entités par lots.
- Il existe un moyen de gérer de manière flexible les erreurs qui se produisent lors du téléchargement et de l'installation du module de fonctionnalités.
- Vous n'avez même pas besoin de redémarrer l'application après l'installation de la fonctionnalité, car il y a
SplitCompat.install()
- appelez-le et vous pouvez immédiatement accéder aux classes à partir de la fonctionnalité fraîchement installée à la volée.
Mais je vous tromperais si je disais que la bibliothèque Play Core ne vous fera pas souffrir:
- Le code est obscurci et n'est documenté en aucune façon.
- Les événements de toutes les sessions de chargement actives arrivent à un
SplitInstallStateUpdatedListener
- vous devez les trier manuellement. Il est nécessaire de sauvegarder l'ID de session quelque part à l'avance, ce qui aboutit finalement à un code pas très beau. - Gestion des états et gestion des erreurs maladroites et redondantes: 9 états possibles, 10 erreurs possibles. Les combinaisons de ces erreurs et états peuvent être interprétées différemment, tous les états et erreurs sont renvoyés en entier.
- Il n'est pas possible de tester normalement le téléchargement et l'installation de fonctionnalités sur un appareil local - c'est tout simplement impossible.
La seule option consiste à intégrer votre build sur Google Play dans le canal de test interne et à essayer ce qui s'est passé. Si vous trouvez une sorte de bogue, recommencez tout le processus, déployez les mises à jour et essayez plus loin. Si vous voulez vérifier comment cela fonctionne sans build, vous obtenez l'erreur "-2" et vous ne pouvez que deviner ce que cela signifie. Il s'agit du problème le plus courant dans le référentiel avec les échantillons officiels de Google Dynamic Features.
Il n'y a pas de bonne pratique pour naviguer entre les modules fonctionnels. Dans les exemples officiels, qui montrent comment l'interaction entre les modules de fonctionnalité se produit, ils suggèrent que la situation soit résolue tout simplement: activez la dépendance d'un module à l'autre. Chaque direction a sa propre dépendance, pourquoi revenir?

Mais alors tous les avantages de la division en modules sont perdus. Nous sommes passés à des modules bien avant qu'il ne soit nécessaire de résoudre de tels problèmes. Et ils l'ont fait en partie parce que cela simplifie le travail avec la base de code pour les développeurs inexpérimentés qui, en raison de l'inexpérience, peuvent utiliser l'activité de signature avec l'activité de base - puis recherchez-le pour une révision du code.
Si vous connectez tous les modules avec des dépendances de haut en bas, alors seul Google sera bon à partir de cela, qui n'aura rien à penser de la navigation.
Nous avons longtemps réfléchi à ce que nous allions en faire, et finalement nous avons trouvé une solution qui me fait encore frissonner. Il est appelé
Class.forName
- instanciant une classe en utilisant le
ClassPath
complet, ce qui rompt en renommant la classe de n'importe quel package à partir de son chemin, etc.
abstract class ActivityCrossFeatureRoute { override fun prepareIntent(context: Context): Intent? { try { return Intent(context, Class.forName(targetClassPath())) } catch (e: ClassNotFoundException) { Logger.e("Activity with the following classpath was not found in the current " + "application: ${targetClassPath()}. If this activity is the part of Dynamic Feature, " + "please check if this Dynamic Feature is downloaded and installed on the device" + "successfully.") } return null } }
J'ai eu honte d'en parler à quelqu'un jusqu'à ce que je me rende dans le référentiel d'applications
Plaid et que je vois qu'ils ont résolu le problème de navigation de la même manière et conseillé à tout le monde de le faire sur Stack Overflow.
Plaid est l'un des vitrines les plus cool, avec eux, Google essaie toutes ses dernières tendances, animations sympas, astuces de conception, les derniers composants de l'interface utilisateur et, en particulier, la modularité.
Beaucoup, vraiment beaucoup de bugs, de sous-ingénierie, de rugosité. Vous n'aurez pas à rechercher de bogues pendant longtemps.
- L'accès aux ressources à partir du module d'application n'est possible que le long du chemin complet.
Au lieu d'écrire comme ceci:
R.string.primaryColor
, vous devez écrire comme ceci à chaque fois dans le code:
ru.appname.package.R.string.primaryColor
. D'une manière différente, la build ne fonctionnera pas, et voici le
lien vers le tracker de problème officiel.
- Le problème avec l'exécution de JobScheduler sur les appareils O +. La solution officielle consiste à lancer manuellement le
TestJobSchedulerService
:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { Intent serviceIntent = new Intent(this, TestJobSchedulerService.class); startService(serviceIntent); }
- Erreur de gel du manifeste lors de la connexion de bibliothèques tierces, par exemple, Firebase, Fabric, AndroidX-packages, etc.
Tous utilisent des ID d'application d'espaces réservés dans le manifeste. L'ID d'application n'est pas inséré correctement, car le manifeste ne se fige pas, Android Studio ne peut pas trouver l'activité par défaut, et vous recherchez le problème pendant longtemps jusqu'à ce que vous trouviez des
conseils dans l'outil de suivi des problèmes officiel - redéfinissez tous les fournisseurs et spécifiez votre ID d'application là-bas.
<provider android:name="com.crashlytics.android.CrashlyticsInitProvider" android:authorities="ru.app.name.crashlyticsinitprovider" tools:replace="android:authorities" /> <provider android:name="com.google.firebase.provider.FirebaseInitProvider" android:authorities="ru.app.name.firebaseinitprovider" tools:replace="android:authorities" /> <provider android:name="androidx.core.content.FileProvider" android:authorities="ru.app.name.fileprovide" tools:replace="android:authorities" />
- L'impossibilité de plusieurs dépendances sur des packages tiers est l'un de mes points préférés.
Supposons que deux modules de fonctionnalité dépendent d'une bibliothèque tierce. Mais vous ne pouvez pas créer de dépendance directe car vous obtenez:
org.gradle.api.GradleException: [:feature1, :feature2] all package the same library [com.lib.Name:VeryGoodLib]
.
Réponse officielle : que faire si dans ces modules différentes versions de la bibliothèque sont indiquées.
Les développeurs conseillent: ajoutez un module de fonctionnalité à la hiérarchie, dans laquelle il n'y a rien d'autre qu'une dépendance à une bibliothèque tierce, et rendez-la dépendante de deux modules de fonctionnalité source.
- Le cache d'appels d'InstantApps.isInstantApp (contexte) dans attachBaseContext ().
Les exemples de
code de la documentation pour les développeurs Android se
attachBaseContext()
, simplement parce qu'ils offrent
attachBaseContext()
pour accéder au contexte par
this
biais, et si
context==null
, vous ne pouvez même pas vérifier si InstantApps est en cours d'exécution ou non.
override fun attachBaseContext(base: Context) { super.attachBaseContext(base) if (!InstantApps.isInstantApp(this)) { SplitCompat.install(this) } }
ConstraintLayout
affiche les ConstraintLayout
lors de l'utilisation des Groups
et des Barriers
.
Imaginez que vous ayez tout traversé: assemblé l'assemblage, deviné qu'il doit être intégré dans le canal de test sur Google Play, Google Play n'affichait pas de boîte de dialogue rouge. Avec des mains tremblantes, vous installez cet assemblage sur l'appareil, installez la fonction, allez à l'écran - et vous voyez que toute la disposition s'est regroupée en pile dans le coin supérieur gauche. En effet, si vous utilisez des
Groups
et des
Barriers
, il existe une merveilleuse méthode
getPackageName
, qui, pour une raison quelconque, ne fonctionne pas correctement. Par conséquent, toutes vos vues ne sont tout simplement pas positionnées. Toutes les contraintes s'envolent et tout se trouve au hasard sur l'écran.
Enfin, après avoir surmonté cela, vous constaterez que ...
Les fonctionnalités dynamiques sont toujours en version bêta! Vous ne pouvez pas rester bloqué en production - vous avez toujours été un testeur gratuit pour Google!

Mais pas selon Google. Si vous voulez en devenir un, vous pouvez remplir le
Formulaire d'Intérêt et peut-être aurez-vous de la chance et vous aurez accès pour être bloqué en production.
On pense qu'Instant Apps a perdu cette bataille. Il est peu probable que cela soit annoncé dans les années à venir, mais l'augmentation de l'activité d'information autour d'AMP le confirme secrètement.
La pensée que je voulais vous rappeler à vous et à moi-même -
écrire pour les gens . Réfléchissez à trois fois avant de prendre une décision, surtout si vous développez des outils que d'autres développeurs utiliseront. Chaque décision et chaque action affecteront quelqu'un et, éventuellement, lui gâteront un peu de sang.
Je ne voudrais pas causer de panne à quelqu'un.Liens utiles
Nous avons fait le programme Saint AppsConf , qui est déjà du 21 au 22 octobre à Saint-Pétersbourg, encore plus mouvementé et diversifié qu'il ne l'était au printemps. Découvrez-le!
Ou abonnez-vous à la newsletter , télégramme , fb - là, nous parlons des rapports individuels et des préparatifs de la conférence.