Wenn Sie am Early Access-Programm teilnehmen, wissen Sie nie im Voraus, was sich am Ende herausstellen wird. Natürlich hoffen Sie, dass sich die Technologie durchsetzt und Ihre Anwendung dem Markt einen Schritt voraus ist und einen Teil der PR auf Google I / O erhält. Und dies ist eine gute Motivation, in der Anfangsphase Quellcodes anstelle von Dokumentation zu lesen, die außerdem aus dem geheimen Archiv heruntergeladen werden muss.
Auf der
AppsConf zeigte Jewgeni Saturov, wie die Teilnahme an Early Access dazu führen kann, als Beispiel für die Entwicklung einer Anwendung mit sofortigem Start, und erläuterte dabei alle Funktionen von Google Play Instant. Bei der Entschlüsselung seines Berichts werden wir herausfinden, woher die Android App Bundles stammen und was Dynamic Delivery damit zu tun hat, uns mit den neuen Gradle-Plug-Ins vertraut machen und lernen, wie wir mit den Überraschungen umgehen können, die die SDK-Entwickler für uns vorbereitet haben.
Über den Sprecher: Evgeny Saturov (
Saturovv ) arbeitet für Surf, ein Unternehmen, das
sich auf benutzerdefinierte Android- und iOS-Entwicklung und in jüngerer Zeit auf Flutter-Entwicklung spezialisiert hat. Eugene Flutter ist ein Enthusiast und Gründer von FlutterDevPodcast.
Ein kurzer Ausflug in die Geschichte
Vor zwei Jahren kam ein wunderbarer Mann zu uns zu Surf und sagte: „Wir haben eine Technologie, die bisher nur wenige Menschen kennen. Und Sie haben Kunden und interessante Fälle. Lassen Sie uns Ihnen unsere Technologie geben, Sie integrieren sie irgendwo und Sie erhalten eine coole Symbiose. Wir werden dies auf Google I / O bewerben und allen wird es gut gehen. “
Tatsächlich ist die
Arbeit mit dem Early Access-Programm ein Kinderspiel . Sie müssen mit Rohcode arbeiten, der natürlich nicht immer wie beabsichtigt und beschrieben funktioniert. In unserem Fall:
- Alle Artefakte wurden in Form eines ZIP-Archivs geliefert, das alle paar Tage aus einem geheimen Speicher heruntergeladen und nur manuell auf einem lokalen Computer aktualisiert werden musste.
- Sie können nur im "Kanarienvogel" arbeiten.
- Es gibt fast keine Dokumentation, nur verstreute unstrukturierte Google Text & Tabellen, die häufiger dem Gedankenfluss von Entwicklern ähneln.
- Der Einsatz in Lebensmitteln ist natürlich nicht möglich - dies ist erst möglich, nachdem die Technologie veröffentlicht wurde. Das heißt, die gesamte Bereitstellung befindet sich nur in der Alpha-Spur.
- Es ist wahrscheinlich, dass sich nach einer öffentlichen Veröffentlichung herausstellt, dass das SDK ohne Unterstützung der Abwärtskompatibilität vollständig neu geschrieben wurde. Sie erhalten völlig unterschiedliche Schnittstellen und APIs - Sie müssen alles erneut wiederholen.
Dies ist eine kurze Zusammenfassung unserer Teilnahme am Early Access-Programm.
All dies wurde möglich dank unseres regelmäßigen Partners - der Firma Labyrinth - dem größten Online-Shop für Bücher und Schreibwaren in Russland. Sie schlossen sich dem Projekt an und waren sich nicht einmal sicher, ob es am Ende irgendeinen Nutzen geben würde. Und die Tatsache, dass Surf 2017 als Studio Teil des Google Certified Agency-Programms war. Leider wurde das Programm dieses Jahr geschlossen.
Android Instant Apps
Damit die Anwendung 2017 ohne Installation ausgeführt werden konnte, musste sie korrekt in Module zersägt werden.

Wir haben neue Gradle-Plugins, die die entsprechenden Artefakte erzeugen:
- Instant App Module - ein Anwendungs-Plugin, das ein ZIP-Archiv mit einer APK generiert hat, eines für jedes Funktionsmodul der Anwendung;
- Installierbares App-Modul - Generierte APK.
Eine zweistufige Hierarchie aus Feature-Modulen wurde angezeigt. Es konnte immer nur ein Basisfunktionsmodul geben, das den gesamten Basiscode enthielt, der für alle Funktionen, Ressourcen, Abhängigkeiten usw. verfügbar war. Das Feature-Modul der obersten Ebene enthielt die Implementierung bestimmter Bildschirme.
Aber
es war aus mehreren Gründen
lang und teuer :
- Die starre modulare Struktur an sich ist eine große Einschränkung. Es ist kaum vorstellbar, dass ein großes Unternehmen seine sich entwickelnde und perfekt funktionierende Anwendung im Laufe der Jahre in einen Haufen Rauchermodule verwandeln wird, um eine neue Technologie zu unterstützen, deren Start noch nicht bekannt ist oder nicht.
- Strenge Beschränkung der Größe der Baugruppe, dh eine Funktion sollte 4 MB nicht überschreiten. Dies ist eine objektiv kleine und manchmal völlig unerreichbare Grenze, zum Beispiel aufgrund starker Abhängigkeiten oder Ähnlichem.
- Stellen Sie sicher, dass Sie AppLinks verwenden, da dies der einzige Weg ist, um in die Sofort-App zu gelangen. Der Benutzer klickte auf den Link aus der Mail, dem Messenger und den Suchergebnissen und kam durch das Abfangen des Links zu Ihrem Bildschirm.
- Schließlich eine große Anzahl von technischen Einschränkungen. Anfangs war es sogar unmöglich, NDK zu verwenden. Sie können keine Push-Benachrichtigungen senden, keine vertraulichen Daten empfangen, Geräteeinstellungen ändern und keine Hintergrundprozesse starten. Dienste, Rundfunkempfänger und Inhaltsanbieter konnten nicht verwendet werden. Nur Aktivität.
Die Hauptaufgabe der Instant App ist nur eine Demonstration der Benutzeroberfläche und nichts weiter. Refactoring war sehr schmerzhaft und daher wird diese Geschichte in der Produktion fast nie gefunden.
Fairerweise führte die Implementierung der Instant App im Labyrinth zu einer Steigerung der Einkäufe über den mobilen Client um 5%.
2019. Google Play Instant
Zwei Jahre sind vergangen, auf dem Hof von 2019 - Instant Apps gibt es immer noch, aber nicht als eigenständige Technologie. Es ist immer noch sehr selten in der Produktion, ich habe nicht absichtlich danach gesucht, aber ich kenne nur einige Beispiele: Sports.ru, Vimeo. Es ist unwahrscheinlich, dass Google bei der Ankündigung dieser Technologie mit einem solchen Ergebnis gerechnet hat.
Jetzt heißt die Instant App anders - Google Play Instant. Die Namensänderung half dabei, irrelevante Unterlagen auszusortieren. Wenn Sie die Android Instant App sehen, ist sofort klar, dass dies nicht mehr relevant ist.
Neben dem Namen hat sich auch alles andere geändert, einschließlich des modularen Aufbaus.
Die Forderungen sind loyaler geworden . Die Technologie integriert sich auf ganz andere Weise in das Projekt und erfordert kein derart schmerzhaftes Refactoring, was sicherlich gut ist.
Was jedoch weniger offensichtlich und meiner Meinung nach viel wichtiger ist, ist, dass diese Technologie, die sehr nisch und selten bleibt, zum Vorläufer einer ganzen Familie von Technologien geworden ist, zu denen sie jetzt gehört.
Zunächst positionierte Google die Instant App als eine Technologie, die Menschen für Unternehmen und nicht für Anwendungen attraktiv macht. Es gab eine Designrichtlinie, die Landeanwendungen mit einer einzigen Schaltfläche „Vollständige Anwendung herunterladen“ verbot. Aber ein anderes grundlegendes Problem wurde von der Seite gelöst, und ich vermute, dass dies zufällig passiert ist.
Im Februar dieses Jahres erblickte das bemerkenswerte Gerät Samsung Galaxy S10 + mit 1 TB Speicher an Bord das Licht. Denken Sie nur daran - ein Terabyte! Warum brauchst du so viel ?!
Laut offiziellen Google-Statistiken hat sich die durchschnittliche Größe von APKs in den letzten 7 Jahren um das 5,5-fache erhöht.

Die Größe des Builds ist wirklich wichtig.
Untersuchungen zu diesen Statistiken zeigen:
- Jede weitere 6 MB Baugruppe reduziert den Umsatz in der Installation um 1%.
- 70% der Benutzer überprüfen die Größe der Anwendung vor dem Herunterladen.
- 50% der Benutzer sind daran interessiert, wie viel Speicherplatz die Anwendung nach der Installation auf dem Gerät beansprucht.
Dies ist umso wichtiger, wenn Ihre Zielgruppe volljährige Personen oder Personen mit nicht sehr hohem Einkommen sind oder es sich um Schwellenländer handelt.
Letztere sind immer schwieriger zu ignorieren, da Indien im Jahr 2018 eine unglaubliche Zunahme der Installationen verzeichnete.

Bitte beachten Sie, dass es nur sehr wenige iOS-Geräte gibt und die Gesamtzahl der Installationen von Android-Anwendungen die in den USA, Brasilien und Indonesien zusammen übersteigt.
Jetzt ist klar, welches Problem mit Google Play Instant gelöst werden kann. Sie können zu unverständlichen Begriffen gehen.
Android App Bundle
Android App Bundle - ein neues Format zum Veröffentlichen von Anwendungen auf Google Play. Im Inneren unterscheidet sich nicht alles sehr von der APK: dieselben Dex-Dateien, Manifeste, Ressourcen, Assets usw. usw. Es gibt aber auch Metadaten, die nicht auf das Gerät des Benutzers gelangen.

Metadaten werden durch drei Dateien dargestellt: resources.pb, assets.pb, native.pb. Tatsächlich handelt es sich hierbei um Korrespondenztabellen von Ressourcen, die sich in den Montage- und Konfigurationseinstellungen von Geräten befinden.
Android Dynamic Delivery
Jeder kennt die Existenz von App Signing von Google Play. Aber nicht jeder ist bereit, den Release-Schlüssel seiner Anwendung bei Google Play zu speichern, da es kein Zurück mehr geben wird.
Das Verlassen der App Signieren mit Google Play ist nicht möglich.Nachdem Sie Google Play einmal den Freigabeschlüssel gegeben haben, können Sie Ihre Anwendung niemals mehr wie zuvor auf Ihrer Seite signieren. Im Gegenzug können Sie das Android App Bundle als Format nutzen. Und der Signaturprozess für die Baugruppe sieht jetzt etwas anders aus.

Sie werden die Assembly noch vor der Veröffentlichung bei Google Play signieren, aber Sie werden sie mit dem Upload-Schlüssel signieren, der nicht eindeutig ist. Es kann von der Konsole abgerufen und erneut freigegeben werden, wenn es kompromittiert wird oder verloren geht. Sie geben Ihren Freigabeschlüssel an die Konsole weiter und verabschieden sich davon. Google signiert nun die Assembly für Sie und schwört, dass Ihr Schlüssel sicher aufbewahrt wird.
Wenn Sie Google Play jedoch keinen Release-Schlüssel geben, können Sie in Ihrem Projekt nichts verwenden, was weiter unten erläutert wird. Google zieht die Schrauben fest, und selbst die Instant App kann nicht bereitgestellt werden, ohne den Schlüssel preiszugeben.
Tatsächlich ist dies überhaupt nicht lustig, da die Personen, die die Sofort-App-Aktion gekauft und sich mit der gesamten Geschichte befasst haben, ihre Anwendungen überarbeitet haben, aber aus irgendeinem Grund ihren Schlüssel nicht an Google Play weitergeben können (oder die Sicherheitsabteilung kategorisch dagegen ist oder aus anderen objektiven Gründen) sich in einer Situation befanden, in der sie diese Entscheidung nicht mehr unterstützen können. Hunderte von Arbeitsstunden wurden tatsächlich in den Müll geworfen.
2014. Split APK-Unterstützung wird in Android Lollipop angezeigt
Da wir heute nostalgisch sind, werden wir noch früher in die Vergangenheit zurückkehren - 2014.
Ich erinnere mich noch daran, wie auf meinem NEXUS 5, dem besten Telefon der Welt, die Android Lollipop-Baugruppe mit einem unglaublichen Materialdesign eingeflogen ist, das nur bombardiert aussah. Aber es gab Änderungen, die von vielen unbemerkt blieben - dies ist die Unterstützung für die Split APK.
APK teilen - Ein Mechanismus, mit dem Sie die Anwendung in kleine APKs aufteilen und diese bei der Installation auf einem Gerät als einzelne Anwendung verhalten können.
Denken Sie daran und fahren Sie fort.
Android Dynamic Delivery ist ein neues Anwendungsverteilungsformat bei Google Play.

Früher hatten wir eine APK, jetzt erscheint das Android App Bundle als Alternative. AAB fungiert als Inkubator-Generator für diese sehr geteilten APKs. AAB rollt das APK-Brötchen aus, das dann als reguläre Anwendung verwendet werden kann, indem es parallel installiert wird.
Mal sehen, was für eine Art von APK es ist.

Zumindest ist dies die grundlegende APK, die dieselbe Rolle spielt wie in der Instant App: Es ist der grundlegende Code, die grundlegenden Ressourcen und die Geschäftslogik, die zwischen allen Funktionen durchsucht werden.
Erscheinen auch:
- APKs, in deren Namen verdächtig ähnliche Präfixe für grafische Ressourcenmodifikatoren vorhanden sind (oberste Zeile im Diagramm).
- Eine andere Familie von APKs erinnert uns an Prozessorarchitekturen.
- Lokalisierungs-APKs.
Vor ungefähr zwei Jahren, als Vektorgrafiken nicht so verbreitet waren, enthielten viele Anwendungen hauptsächlich Rasterressourcen, die auf den Bildschirmen auf unterschiedliche Pixeldichten zugeschnitten wurden. Die Montage könnte ziemlich schwer werden. Benutzer haben alle diese Ressourcen heruntergeladen, und die meisten davon wurden mit Eigengewicht auf dem Gerät gespeichert.
Mit einem solchen Mechanismus kann der Benutzer nur die Ressourcen empfangen, die speziell für sein Gerät benötigt werden. Eine Person kommt zu Google Play, wählt die Anwendung aus, Google Play versteht die Eigenschaften des Geräts des Benutzers und gibt die erforderlichen Split-APKs an - eine APK aus jeder Kategorie.
Arten der dynamischen Lieferung APK:
- Eine und nur eine Basis APK.
- Die Konfigurations-APK besteht aus maximal drei Typen: res * x, Assets * y, lib * z. Hier: x ist die Anzahl der verwendeten Ressourcenmodifikatoren; y ist die Anzahl der verwendeten Architekturtypen; z ist die Anzahl der Sprachlokalisierungen. Wenn das Projekt beispielsweise keinen nativen Code und keine nativen Bibliotheken verwendet, ist dem nativen Code keine Kategorie zugeordnet, und es verbleiben zwei APKs.
- Unbegrenzte dynamische Funktion APK.
Dynamic Feature APK wird nachstehend ausführlicher erläutert. Aber zuerst verabschieden wir uns vom Split-Block.
Auf Wiedersehen Split
Sie können argumentieren, dass Sie früher etwas Ähnliches tun könnten, indem Sie manuell eine Reihe von APKs mit nur den richtigen Ressourcen generieren. Dann wird alles manuell für Google Play bereitgestellt.
android { splits { density { enable true exclude "ldpi", "xxhdpi", "xxxhdpi" compatibleScreens 'small', 'normal', 'large', 'xlarge' } } }
Dieses Unterfangen an sich ist eher zweifelhaft, und jetzt wird dies alles einfach ignoriert. Wenn Sie das Android App Bundle erstellen, wird ein Bundle-Block angezeigt, mit dem Sie die Projektaufteilung in eine der Kategorien manuell deaktivieren können.
android { bundle { language { enableSplit = false } density { enableSplit = true } abi { enableSplit = true } } }
Sie können festlegen, dass die Anwendung beispielsweise nur Russisch oder nur Englisch unterstützt, und diesen Schritt während der Montage überspringen.
Die aufmerksamsten denken jetzt wahrscheinlich darüber nach, was sie mit preLollipops machen sollen. Nur in Android 5 erschien Unterstützung für die Split APK. Wir müssen irgendwie aus dieser Situation herauskommen, denn das Min SDK ist keineswegs das ganze 21..
Für preLollipops ist die Situation ziemlich ungeschickt, aber nur möglich. Google Play sammelt Multi-APKs für preLollipops, die alle Arten von Kombinationen von Konfigurations-APKs enthalten. Es gibt nur eine APK, aber es gibt viele Optionen.
Android App Bundle verändert unser Leben
Und sehr bedeutsam. Erstens ist es möglicherweise viel einfacher, ein Projekt zu erstellen, insbesondere wenn Sie das Split APK manuell erstellt haben. Aber nach meinen Beobachtungen gibt es nicht sehr viele solcher Leute.
Zweitens riskieren Sie nicht länger, den Release-Schlüssel zu verlieren oder zu gefährden. Es wird keine große Tragödie geben. Wenn Sie Ihren Upload-Schlüssel verlieren, können Sie ihn zurückrufen und erneut ausstellen.
Wir werden nicht mit dem Finger zeigen - oben im russischen Google Play gibt es Anwendungen, die auf w3bsit3-dns.com lange Zeit Release-Schlüssel haben. Alle benutzerdefinierten Assemblys sind mit einem Release-Schlüssel signiert, und in den nächsten fünf Jahren ist damit nichts zu tun. Es bleibt noch auf den Übergang zu Signing V3 zu warten, der mit nur 28 APIs angezeigt wurde.
Der zweifelsfreie Vorteil des Android App Bundle: Benutzer geben keinen Datenverkehr und keinen Speicherplatz mehr für Ressourcen aus, die sie nicht benötigen. Dies verbessert die Beibehaltung der Anwendung erheblich.
Wenn Sie jedoch alle Grafiken im Vektor, zwei Lokalisierungen und keine nativen Bibliotheken haben, ist der Vorteil mikroskopisch.
Dynamisches Funktionsmodul
Das Dynamic Feature Module ist ein Funktionsmodul, das bei der Installation der Anwendung nicht mitgeliefert wird, sondern von Google Play heruntergeladen und nur bei Bedarf installiert wird.
Solche Module sind mit der Basis-APK vergleichbar.

Es ist wichtig, dass jedes dieser Funktionsmodule selbst auch eine Reihe von Konfigurations-Split-APKs enthält. Dementsprechend kann sich die Gesamtzahl der APKs über alle Maßen erhöhen. Dies ist jedoch überhaupt nicht Ihr Anliegen, Google Play tut dies.
Anwendungen für dynamische Funktionsmodule:
Funktionen, die von einem sehr kleinen Prozentsatz des Publikums verwendet werden , aber dennoch wichtig für Ihr Produkt sind. Dies ist beispielsweise eine Content-Entertainment-Anwendung, und 95% der Benutzer konsumieren Inhalte. Es gibt jedoch nur einen sehr geringen Prozentsatz von Editoren, die Inhalte generieren. Für sie gibt es einen coolen Video-Editor, der wirklich viel wiegt und unglaublich cool funktioniert. Dann macht es keinen Sinn, die Baugruppe für alle und jeden zu gewichten. Sie können diese Funktion in das Modul für dynamische Funktionen einfügen und sie nur denjenigen zur Verfügung stellen, die sie benötigen, und sie später herunterladen.
Schwere Funktionen, die nicht mit dem Hauptanwendungsszenario der Anwendung zusammenhängen. Zum Beispiel AR-Navigation in einem Kartendienst. Jede AR-Funktion ist am besten geeignet, um sie in das dynamische Funktionsmodul aufzunehmen.
Funktionen, die Benutzern zur Verfügung stehen sollten, ohne die Anwendung selbst zu installieren (z. B. Auswahl eines Produkts im Katalog und Bestellung). Das stimmt zwar sehr verdächtig an alles.
Android Instant Apps ist jetzt das Instant-Enabled Dynamic Feature Module.
Es stellt sich also heraus, dass es zwei Arten von dynamischen Funktionsmodulen gibt:
- Allgemeine dynamische Funktionsmodule sind Funktionsmodule, die getrennt von der Hauptanwendung heruntergeladen und auf einem Gerät installiert werden. Sie leben dort, solange die Anwendung selbst lebt. Bis Sie es löschen, wird das Dynamic Feature Module sein.
- Sofort aktivierte dynamische Funktionsmodule - Funktionsmodule, die ausgeführt werden können, ohne auf dem Gerät installiert zu werden. Dieses Modul ist zeitlich begrenzt.
Die zweite Art von Anwendungen bei Google Play kann durch das Vorhandensein der Schaltfläche "Testen" unterschieden werden. Wenn Sie darauf klicken, wird die Standard-URL ersetzt und Sie können sehen, wie die Anwendung zumindest als Beispiel für eine Hauptfunktion aussieht.
Dies kann oft in der Rubrik mit Spielen gefunden werden. Dies ist bequemer und sogar noch anwendbarer als für Anwendungen, da Sie einen kleinen Teil des Spiels als Demo herunterladen und sehen können, worum es geht. Lohnt es sich, Ihren Datenverkehr und Ihre Zeit zu verbringen?
Modularer Aufbau
Ich habe bereits gesagt, dass der modulare Aufbau vereinfacht wurde. Mal sehen wie.
Anfangs hatten wir eine ziemlich monströse Struktur. Unter anderem hatte es leere Module, zum Beispiel war das Instant App-Modul immer leer, es hatte keinen Code, keine Ressourcen, sondern nur die Datei build.gradle und das wars.
Die Entwickler dachten, warum dann zusätzliche Module nur produzieren, um Artefakte eines bestimmten Typs zu sammeln. Und sie haben es gesägt und die Funktionalität wurde auf das App-Modul übertragen.
Aber dann gingen sie noch weiter und dachten: Warum brauchen wir das Basisfunktionsmodul? Es gibt einige Probleme von ihm, weil wir dort alles initialisieren und seine Anwendungs-ID unterschiedlich ist. Von hier aus kommen beispielsweise Krücken, die die Anwendungs-ID vom App-Modul zum Basisfunktionsmodul übertragen und als echte Anwendungs-ID der Anwendung ersetzen, sodass in Crashlytics usw. alles nachverfolgt wird.
Infolgedessen stellte sich heraus, dass dies so war.

Sie haben das darüber angehängte App-Modul verlassen. Feature-Module - und das war's!
Übermitteln Sie nicht meine Gefühle, als ich davon erfuhr. Die Jungs von der großen Bühne sagten, dass sie eine coole Technologie haben: "Lasst uns alle Anwendungen auf diese Struktur zuschneiden!" Dies funktioniert jedoch nicht für 5 Minuten, sondern mit großen Konsequenzen.
Im Jahr 2017 war eine monolithische Anwendung noch keine Schande. Das Labyrinth war einfach so, dann hatte es noch nicht einmal die Veröffentlichung erreicht, sondern war in der Beta. Zu dem Zeitpunkt, als wir am Early Access-Programm teilnahmen, gab es dort bereits etwa 90 Bildschirme. Wir haben zwei weitere Monate damit verbracht, umzugestalten, zu testen und sicherzustellen, dass alles wirklich funktioniert.
Und danach sagen sie:
"Wir sind zu schlau, das geht viel einfacher .
"Aber zurück zur Prosa.
Gradle-Konfiguration
Um die neue Konfiguration zu unterstützen, müssen zunächst alle dynamischen Funktionsmodule in der Datei build.gradle des App-Moduls im Android-Block aufgelistet werden:
Schreiben Sie anschließend in die Datei build.gradle jedes Dynamic Feature Module die Abhängigkeit vom App-Modul:
Im Prinzip nichts kompliziertes. Es gibt aber auch eine Konfiguration von Manifesten.
Manifest Konfiguration
Im Manifest des App-Moduls können wir das True-Flag setzen, um anzuzeigen, dass diese Anwendung mindestens eine Funktion mit Sofortaktivierung enthält:
Wenn dieses Flag nicht vorhanden ist, kann es nicht in den entsprechenden Titel von Google Play eingebettet werden.
Darüber hinaus gibt es für jedes Dynamic Feature Module einzeln eine Manifestkonfiguration, in der weitere Einstellungen vorhanden sind:
Die ersten beiden Flags schließen sich leicht gegenseitig aus, da
onDemand
die übliche Grundfunktion ist und
instant
dieselbe installierbare Funktion ist.
Titel - der technische Name des Moduls, nach dem wir dieses Modul später, nachdem wir es in unserer Anwendung fest codiert haben, von Google Play pumpen werden.
Der
include
Parameter ist ein Parameter für preLollipops. Wenn Sie den Wert auf "false" setzen, werden Benutzer von preLollipops diese Funktion nie sehen und können sie nicht verwenden.
Gradle-Projektkonfiguration
Die Lebensdauer des InstantApp-Plugins und des Feature-Plugins war recht kurz, aber lebendig. Sie dauerten weniger als zwei Jahre. Seit März dieses Jahres werden sie nicht mehr unterstützt.
Jetzt gibt es nur noch ein dynamisches Funktionsmodul, das wir verwenden:
apply plugin: 'com.android.dynamic-feature'
Projektkonfiguration nur im App-Modul
Ein wichtiger Punkt: Alle Einstellungen bezüglich Signatur (Signaturkonfiguration), Assembly (ProGuard-Konfiguration), Versionscode und Versionsname müssen nur im App-Modul build.gradle vorgenommen werden.
Andernfalls werden sie ignoriert. Vermeiden Sie es, einen dieser Konfigurationsblöcke in den build.gradle-Dateien der dynamischen Feature-Module anzugeben.
Google spielt sofort
Jetzt haben wir folgendes.
Die Anforderungen an den modularen Aufbau wurden so weit wie möglich vereinfacht. Das sind wirklich gute Nachrichten für diejenigen, die sich noch nicht engagiert haben. Jetzt können Sie es versuchen, auch wenn Sie eine Anwendung mit eigener Struktur haben. Dies hat keinerlei Auswirkungen auf Sie. Sie können das Modul einfach oben anbringen und alles funktioniert einwandfrei.
Beschränkungen der Baugruppengröße sind loyaler geworden. Wenn es vorher 4 MB waren, jetzt:
- Dynamische Feature-Module sind im Allgemeinen nicht in ihrer Größe beschränkt.
- Sofort aktivierte dynamische Funktionsmodule können bis zu 10 MB benötigen.
Aber jetzt gibt es eine progressive Skala.

Wenn Ihre Funktion:
- mehr als 10 MB, dann tut es mir leid;
- von 4 bis 10 MB - Zugriff über die Schaltfläche "Ausprobieren" von Google Play und fertig.
- weniger als 4 MB - alle Möglichkeiten, Benutzer für das Instant-Enabled-Modul zu gewinnen, sind verfügbar (Start über Werbung, Link, Nachrichten usw.).
Ein Mechanismus zum Laden von Modulen wurde angezeigt - Play Core API. Nur wenige Menschen wissen, dass die Instant App früher über Chrome installiert wurde.
@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; }
Dies ist ein echter Code von Chrome für Android, der den Link zu Ihrer Instant App abfing, zu Google Play ging und von dort aus Instant Apps ersetzte. Wenn die Instant App erkannt wurde, öffnete sie irgendwie die Aktivität, von der aus die Instant App gestartet wurde.
Daher gab es große Probleme beim Rollen dieser Funktion. Bei Samsung ist dies eine ganz andere Geschichte. Ich vermute, dass der integrierte Browser etwas mehr Berechtigungen hat als Chrome. Die Instant App funktionierte dort erst zuletzt.
Mit Play Core Library können Sie Lieferprobleme vergessen. Sie schließen es einfach als Paket an:
implementation 'com.google.android.play:core:1.4.0'
Laden Sie die benötigten Funktionsmodule von Google Play herunter.
Die Bibliothek verfügt über eine ziemlich funktionale Syntax, mit der Sie Module einzeln herunterladen können:
val splitInstallManager = SplitInstallManagerFactory.create(context)
Oder sofort eine Packung mit mehreren:
val request = SplitInstallRequest .newBuilder() .addModule("feature1") .addModule("feature2") .build()
Hörer auflegen:
splitInstallManager .startInstall(request) .addOnSuccessListener { sessionId -> ... } .addOnFailureListener { exception -> ... }
Zeigen Sie dies in der Benutzeroberfläche und reagieren Sie auf die Tatsache, dass das Modul installiert wurde.
Play Core Library ist ein guter Anfang:
- Schließlich können Sie angesichts von Google Chrome aufhören, auf etwas zu hoffen.
- Sie können das Laden von Modulen auf der Benutzeroberfläche nach Ihren Wünschen demonstrieren.
- Es ist möglich, Funktionsmodule stapelweise zu laden.
- Es gibt eine Möglichkeit, Fehler, die beim Herunterladen und Installieren des Funktionsmoduls auftreten, flexibel zu behandeln.
- Sie müssen die Anwendung nach der Installation der Funktion nicht einmal neu starten, da
SplitCompat.install()
vorhanden ist. SplitCompat.install()
Sie sie auf und Sie können sofort über die neu installierte Funktion sofort auf die Klassen zugreifen.
Aber ich würde dich täuschen, wenn ich sagen würde, dass die Play Core Library dich nicht leiden lässt:
- Der Code ist verschleiert und in keiner Weise dokumentiert.
- Ereignisse aus allen aktiven
SplitInstallStateUpdatedListener
in einem SplitInstallStateUpdatedListener
- Sie müssen sie manuell sortieren. Es ist notwendig, die Sitzungs-ID irgendwo im Voraus zu speichern, was schließlich zu einem nicht sehr schönen Code führt. - Unbeholfene, redundante Zustandsverwaltung und Fehlerbehandlung: 9 mögliche Zustände, 10 mögliche Fehler. Kombinationen dieser Fehler und Zustände können unterschiedlich interpretiert werden, alle Zustände und Fehler werden als int zurückgegeben.
- Es gibt keine Möglichkeit zum normalen Testen des Herunterladens und Installierens von Funktionen auf einem lokalen Gerät - dies ist einfach unmöglich.
Die einzige Möglichkeit besteht darin, Ihren Build auf Google Play in den internen Testkanal einzubetten und zu versuchen, was passiert ist. Wenn Sie einen Fehler finden, starten Sie den gesamten Vorgang erneut, stellen Sie Updates bereit und versuchen Sie es weiter. Wenn Sie überprüfen möchten, wie es ohne Build funktioniert, erhalten Sie den Fehler "-2" und können nur raten, was es bedeutet. Dies ist das häufigste Problem im Repository mit offiziellen Beispielen von Google Dynamic Features.
Es gibt keine bewährte Methode zum Navigieren zwischen Funktionsmodulen. In den offiziellen Beispielen, die zeigen, wie die Interaktion zwischen Feature-Modulen stattfindet, deuten sie darauf hin, dass die Situation recht einfach ist: Aktivieren Sie die Abhängigkeit von einem Modul zum anderen. Jede Richtung hat ihre eigene Abhängigkeit, warum zurückkommen?

Dann gehen jedoch alle Vorteile der Aufteilung in Module verloren. Wir haben lange vor der Notwendigkeit, solche Probleme zu lösen, auf Module umgestellt. Und sie haben dies teilweise getan, weil es die Arbeit mit der Codebasis für unerfahrene Entwickler vereinfacht, die aufgrund von Unerfahrenheit Signaturaktivität mit Basisaktivität verwenden können - und dann nach einer Codeüberprüfung suchen.
Wenn Sie alle Module mit Abhängigkeiten nach oben und unten verbinden, ist nur Google davon überzeugt, das sich keine Gedanken über die Navigation machen muss.
Wir haben lange darüber nachgedacht, was wir damit anfangen sollen, und am Ende haben wir uns für eine Lösung entschieden, die mich immer noch erschaudern lässt. Es heißt
Class.forName
- Instanziieren einer Klasse mit dem vollständigen
ClassPath
, der durch Umbenennen der Klasse eines Pakets aus seinem Pfad usw.
ClassPath
wird.
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 } }
Ich schämte mich, jemandem davon zu erzählen, bis ich in das
Plaid- Anwendungsrepository ging und feststellte, dass sie das Navigationsproblem auf die gleiche Weise gelöst hatten, und riet allen, dies bei Stack Overflow zu tun.
Plaid ist einer der coolsten Showcases. Mit ihnen probiert Google alle neuesten Trends, coolen Animationen, Design-Tricks, die neuesten UI-Komponenten und insbesondere die Modularität aus.
Viele, wirklich viele Bugs, Under-Engineering, Rauheit. Sie müssen nicht besonders lange nach Fehlern suchen.
- Der Zugriff auf Ressourcen über das App-Modul ist nur über den gesamten Pfad möglich.
Anstatt wie
R.string.primaryColor
zu schreiben:
R.string.primaryColor
, müssen Sie jedes Mal so schreiben:
ru.appname.package.R.string.primaryColor
. Auf andere Weise funktioniert der Build nicht, und hier ist der
Link zum offiziellen Issue-Tracker.
- Das Problem beim Ausführen von JobScheduler auf O + -Geräten. Die offizielle Problemumgehung besteht darin, den
TestJobSchedulerService
manuell zu starten:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { Intent serviceIntent = new Intent(this, TestJobSchedulerService.class); startService(serviceIntent); }
- Manifest zum Einfrieren von Fehlern beim Verbinden von Bibliotheken von Drittanbietern, z. B. Firebase, Fabric, AndroidX-Paketen usw.
Alle verwenden Platzhalter-Anwendungs-IDs im Manifest. Die Anwendungs-ID wird dort falsch eingefügt, wodurch das Manifest nicht einfriert, Android Studio keine Standardaktivität findet und Sie lange nach dem Problem suchen, bis Sie im offiziellen Issue-Tracker
Ratschläge finden - definieren Sie alle Anbieter neu und geben Sie dort Ihre Anwendungs-ID an.
<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" />
- Die Unmöglichkeit mehrerer Abhängigkeiten von Paketen von Drittanbietern ist einer meiner Lieblingspunkte.
Angenommen, zwei Funktionsmodule sind von einer Bibliothek eines Drittanbieters abhängig. Sie können jedoch keine direkte Abhängigkeit herstellen, da Sie
org.gradle.api.GradleException: [:feature1, :feature2] all package the same library [com.lib.Name:VeryGoodLib]
erhalten:
org.gradle.api.GradleException: [:feature1, :feature2] all package the same library [com.lib.Name:VeryGoodLib]
.
org.gradle.api.GradleException: [:feature1, :feature2] all package the same library [com.lib.Name:VeryGoodLib]
.
Offizielle Antwort : Was ist, wenn in diesen Modulen verschiedene Versionen der Bibliothek angegeben sind?
Die Entwickler empfehlen: Fügen Sie der Hierarchie ein Feature-Modul hinzu, in dem nur eine Abhängigkeit von einer Bibliothek eines Drittanbieters besteht, und machen Sie es von zwei Quell-Feature-Modulen abhängig.
- Der Aufrufcache von InstantApps.isInstantApp (Kontext) in attachBaseContext ().
Die Codebeispiele aus der Dokumentation für Android-Entwickler stürzen ab, einfach weil sie
attachBaseContext()
für den Zugriff auf den Kontext anbieten. Wenn
context==null
, können Sie nicht einmal überprüfen, ob InstantApps gerade ausgeführt wird oder nicht.
override fun attachBaseContext(base: Context) { super.attachBaseContext(base) if (!InstantApps.isInstantApp(this)) { SplitCompat.install(this) } }
ConstraintLayout
zeigt ConstraintLayout
wenn Groups
und Barriers
.
Stellen Sie sich vor, Sie haben alles durchlaufen: Sie haben die Baugruppe zusammengestellt und vermutet, dass sie in den Testkanal von Google Play eingebettet werden muss. Google Play hat keinen roten Dialog angezeigt. Mit zitternden Händen installieren Sie diese Baugruppe auf dem Gerät, installieren die Funktion, gehen zum Bildschirm - und Sie sehen, dass sich das gesamte Layout in einem Stapel in der oberen linken Ecke angesammelt hat. Dies liegt daran, dass es bei Verwendung von
Groups
und
Barriers
eine wunderbare Methode
getPackageName
, die aus irgendeinem Grund falsch ist. Infolgedessen sind alle Ihre Ansichten einfach nicht positioniert. Alle Einschränkungen fliegen weg und alles liegt willkürlich auf dem Bildschirm.
Schließlich, nachdem Sie dies überwunden haben, werden Sie feststellen, dass ...
Dynamic Features befindet sich noch in der Beta! Sie können nicht in der Produktion stecken bleiben - Sie waren die ganze Zeit ein kostenloser Tester für Google!

Aber nicht laut Google. Wenn Sie einer werden möchten, können Sie das Zinsformular ausfüllen. Vielleicht haben Sie Glück und erhalten Zugang, um in der Produktion gesperrt zu werden.
Es wird angenommen, dass Instant Apps diesen Kampf verloren haben. Es ist unwahrscheinlich, dass dies in den kommenden Jahren angekündigt wird, aber die verstärkte Informationsaktivität rund um AMP bestätigt dies insgeheim.
Der Gedanke, dass ich dich und mich daran erinnern wollte -
für Menschen schreiben . Überlegen Sie dreimal, bevor Sie eine Entscheidung treffen, insbesondere wenn Sie Tools entwickeln, die andere Entwickler verwenden. Jede Ihrer Entscheidungen und Handlungen wirkt sich auf jemanden aus und verwöhnt ihn möglicherweise ein wenig.
Ich würde nicht für jemanden eine Panne verursachen wollen.Nützliche Links
Wir haben das Programm Saint AppsConf , das bereits vom 21. bis 22. Oktober in St. Petersburg stattfindet, noch ereignisreicher und abwechslungsreicher gestaltet als im Frühjahr. Probieren Sie es aus!
Oder abonnieren Sie den Newsletter , das Telegramm , fb - dort sprechen wir über individuelle Berichte und Vorbereitungen für die Konferenz.