Search for:

Einführung von Jetpack Compose in das bestehende Projekt von Ziv Kesten | Februar 2022

Erstellen Sie mit “Erinnern” eine erweiterbare Statusansicht.

Ziv Kastanie
Bild von Ziv Kesten

Betrachten wir zunächst einen Einzelfall des Objekts, das wir bauen.

  • Text, der den Untertitel des Artikels enthält.
  • Rechtspfeil-Symbol (das animiert wird, sich vertikal zu drehen, wenn wir ein Element erweitern).
@Composable
ExpandableListItem() {
Card(...) {
Row(...) {
TitleAndSubtitle(...)
Icon(...)
}
}
}

Card ein vom System geliefertes Verbundbauteil ist, kann dies einige Zeit in Anspruch nehmenelevation ich shape als Parameter, und wir können es mit a versorgenmodifier für alles andere, was wir brauchen.
Der Card ist ein Container für unser erweiterbares Listenelement, damit wir es versenden elevation und einigemodifiers :

  • padding() – Es gibt uns Platz von den Rändern.
  • clip(RoundedCornerShape(*.dp)) – wird die Karte der gelieferten beifügen RoundedCornerShape .
  • clickable() – ergibt ein Lambda, das wir später zur Abwechslung verwenden können Zustand zusammengesetzt
Card(
elevation = 4.dp,
modifier = Modifier
.fillMaxWidth()
.padding(start = 15.dp, top = 15.dp, end = 15.dp)
.clip(RoundedCornerShape(8.dp))
.clickable { // We will deal with the click event later }
)

Bei uns Card wir haben Row (Horizontales Äquivalent LineraLayout), die Titel und ein Symbol enthält.

Row(
horizontalArrangement = Arrangement.SpaceBetween,
modifier = Modifier.fillMaxWidth()
) {...}

U Row legen wir fest TitleAndSubtitle ich Icon die horizontal ausgerichtet werden.

Row(...) {
TitleAndSubtitle(
title = "Expandable item title",
subtitle = "There are more items below! 👇"
)
Icon(...)
}
@Composable
fun TitleAndSubtitle(
title: String,
subtitle: String
) {
Column(verticalArrangement = Arrangement.Center) {
Text(text = title)
Text(text = subtitle)
}
}

Der Icon ist ein zusammenbaubares System, wir geben es ihm imageVector die wir als Teil der kompositorischen Abhängigkeit erhalten, an align Modifikator und etwas Neues, das wir noch nicht gesehen haben … a graphicsLayer.

Icon(
imageVector = Icons.Default.ArrowDropDown,
modifier = Modifier
.align(CenterVertically)
.graphicsLayer(...)
)

Der graphicsLayer Modifikator

GraphicsLayer ist ein Modifikator, der zum Anwenden von Effekten auf Inhalte verwendet wird, z. B. Skalierung, Drehung, Deckkraft, Schatten und Beschneidung.
In unserem Fall möchten wir das Pfeilsymbol so drehen, dass sich der Pfeil nach oben dreht, wenn das Element erweitert wird.

Icon(
modifier = Modifier
.graphicsLayer(
rotationZ = animateFloatAsState(
if (expanded) 180f else 0f).value,
)
)

In Jetpack Compose zeigt das deklarative UI-Framework wieder nur Elemente, die ihre eigenen hatten Kondition geändert, wenn wir darüber sprechen Kondition Im Zusammenhang mit der Compose-Benutzeroberfläche beziehen wir uns normalerweise speziell auf einige Funktionsvariablen, die enthalten oder darstellen Kondition.

@Composable
ExpandableListItem() {
var expanded by remember { mutableStateOf(false) }
Card(modifier = Modifier.clickable { expanded = !expanded}) {
Row(...) {
TitleAndSubtitle(...)
Icon(...)
}
}
}

mutableStateOf

Wir nehmen die Initialen Kondition das Objekt, das ist falsch (extended = false) und als Standard übergeben mutableStateOf:

mutableStateOf ist eine reaktive Strömung, ähnlich LiveDate oder StateFlow und wird boolesche Werte ausgeben, wenn wir uns ändern erweitert Variable.

merken

Wir wickeln mutableStateOf tok ua remember blockieren, damit es bei allen Neuzusammenstellungen nicht vergessen wird, sonst wird das Kondition wird die Voreinstellung sein falsch jedes Mal ExpandableListItem namens.

Jetzt müssen wir am Ende unserer Komponente einen weiteren Abschnitt hinzufügen,

@Composable
ExpandableListItem() {
var expanded
Card(...) {
/// Wrap the row in a Column
Column {
Row(...) {
TitleAndSubtitle(...)
Icon(...)
}

// And add the extra items sections
Column {
ExtraItem(item = Item())
ExtraItem(item = Item())

}
}
}
}
data class Item (
val title: String,
val date: String
)
@Composable
fun ExtraItem(item: Item) {
Row(horizontalArrangement = Arrangement.SpaceBetween) {
Text(text = item.title)
Text(text = item.date)
}
}
//// Extra items sections

Divider(modifier = Modifier.height(1.dp))
Column(modifier = Modifier.padding(...)) {

Spacer(modifier = Modifier.height(10.dp))
ExtraItem(item = Item())

Spacer(modifier = Modifier.height(10.dp))
Divider(modifier = Modifier.height(1.dp))
Spacer(modifier = Modifier.height(10.dp))

ExtraItem(item = Item())

Spacer(modifier = Modifier.height(10.dp))
Divider(modifier = Modifier.height(1.dp))
Spacer(modifier = Modifier.height(10.dp))

ExtraItem(item = Item())

}

Eine der wunderbarsten Komponenten, die die Abhängigkeit vom Kompilieren einer Benutzeroberfläche beinhaltet, ist AnimatedVisibility zusammensetzbar.

@Composable
fun ExpandableListItem() {
var expanded by remember { mutableStateOf(false) }
Card() {
Row() {
TitleAndSubtitle()
Icon()
}
AnimatedVisibility(visible = expanded) {
Column {
ExtraItem(item = Item())
ExtraItem(item = Item())
}
}
}
}

Der AnimationSpec speichert die Animationsspezifikation, wir können sie verwenden, um sie zu definieren Genuss, Dauer, Verzögerungen, und andere Spezifikationen im Zusammenhang mit der Anpassung von Animationen.
Wenn wir Animationen wie z erweitern ich reduzieren Animationen für unsere Benutzeroberfläche können wir als verwenden.

AnimatedVisibility(
visible = expanded,
enter = expandVertically(
animationSpec = tween(
durationMillis = 300, easing = FastOutLinearInEasing)
)
,
exit = shrinkVertically(
animationSpec = tween(
durationMillis = 300, easing = FastOutLinearInEasing)
)

)

Wir haben heute viel gelernt! Wir haben den Pfeil mit animiert graphicsLayer Modifikator, mit dem wir die Sichtbarkeit animiert haben AnimatedVisibilityund wir haben gelernt, wie man es benutzt Kondition in Jetpack Compose mit remember ich mutableStateOf.

Das Beste von MDM im Jahr 2021

2021 war in gewisser Hinsicht das Jahr des Banners für Mobile Dev Memo: Seine Lesbarkeit, gemessen an Seitenaufrufen auf der Website und Abonnenten des Newsletters, stieg dramatisch an. Dies geschah in erster Linie, weil Apples Privacy Tracking Policy (ATT) eine Welle der Panik und Besorgnis im gesamten mobilen Ökosystem auslöste. Aber ATT hat das monopolisiert, was ich mein „Aufmerksamkeitsbudget“ nenne: eine Reihe von Themen, über die ich tief genug nachdenken kann, um mich wohl zu sezieren, da MDM nicht meine Vollzeitbeschäftigung ist und ich ihm nur begrenzt Zeit widmen kann. Infolgedessen habe ich mich in den Details der ATT-Implementierung, der Reaktion verschiedener Werbeplattformen auf ATT und einer Reihe von Beweggründen verzettelt, die erklären, warum ATT überhaupt eingeführt wurde.

Ich habe MDM vor vielen Jahren als Mittel zur persönlichen Weiterbildung gestartet. Meine These lautete: Wenn mein konzeptionelles Verständnis eines Themas stark genug ist, um daraus einen erklärenden Blogbeitrag zu machen, dann gewinne ich nicht nur Wissen durch eine disziplinierte Übung des regelmäßigen Bloggens, sondern werde dadurch auch zu einem erfahreneren und scharfsinnigeren Kommunikator . Der Umfang dieses Prozesses konzentrierte sich bisher ausschließlich auf das, was ich als Querschnitt der Erstellung, Verbreitung und des Konsums digitaler Inhalte und der wirtschaftlichen Prinzipien betrachte, die den Umgang der Benutzer mit diesen Inhalten bestimmen. Ich fühle mich wohl in diesem besonderen intellektuellen Raum, der grob durch die in meinem Buch behandelten Themen begrenzt ist, Freemium-Ökonomie2014 geschrieben

Im Jahr 2021 erweiterte sich dieser Bereich: zu kommerziellen und wettbewerbsorientierten Motiven, die nicht nur beobachtet werden können, sondern intuitiv sein müssen. Ich fühle mich in diesem Bereich weniger wohl, weil er hartnäckige Spekulationen erfordert, die funktional fast dem Verkauf ähneln. Ich mag es nicht, Annahmen und Theorien in ein überzeugendes rhetorisches Produkt zu packen. Mir macht es Spaß, komplexe, byzantinische Themen zu sezieren und sie verständlich und zugänglich darzustellen. Ich finde diesen Destillationsprozess Spaß. Ich möchte keine OpEd-Stücke schreiben.

Aber zum Thema ATT hatte ich das Gefühl, keine große Wahl zu haben. Die Berichterstattung an die Mainstream-Medien, insbesondere unmittelbar nach der WWDC 2020 – als der ATT eingeführt wurde – war, wenn ich wohltätig bin, falsch und nutzlos. Ich hatte während des Pandemoniums nach der Einführung von ATT ehrlich das Gefühl, dass, wenn ich nicht versuche, die Änderungen, die sich auf das mobile Ökosystem auswirken würden (und getan haben), zu klären, objektiv zu analysieren und aufzuschlüsseln, dass verschiedene Parteien wie Werbetechnologieanbieter, Apple selbst, und „Marketing-Gurus“ würden das Gespräch dominieren. Ich bin stolz auf die Arbeit, die ich geleistet habe, um ATT für ein breites Publikum von Marketingfachleuten, Führungskräften und Investoren an öffentlichen Märkten wie z dieses Stück, dieses Stückich dieses Stück.

Aber all diese Artikel wurden im Jahr 2020 geschrieben. Die Aufklärungsarbeit der breiten Öffentlichkeit über ATT konnte nicht mit bloßem Diskutieren enden was: das warum, die den ATT zugrunde liegenden kommerziellen Anreize darstellen, war ebenfalls wichtig. Ich habe diese Motivationen 2017 behandelt Der kommende Krieg zwischen Apple und Facebook. Es waren jedoch zeitgemäße – und fortlaufende – Kommentare erforderlich, um Marketingfachleuten dabei zu helfen, sich vorzustellen, welche Wege die Teilnehmer der öffentlichen ATT-Schlägerei zu gehen versuchten, und das war der redaktionelle Schwerpunkt dieser Website im Jahr 2021 Win-Win-Vorschlag für jeden Kommentator angesichts des aufgeladenen, polarisierten Diskurses, der ihn umgibt.

2022 plane ich, zu den Wurzeln von MDM zurückzukehren: trockene, unumstrittene und meist quantitative Analyse. Bis dahin stelle ich die 10 besten Artikel von MDM im Jahr 2021 vor, aufgelistet in absteigender Reihenfolge der Gesamtzahl der Seitenaufrufe.

In dem meistgelesenen Artikel, der 2021 auf Mobile Dev Memo veröffentlicht wurde, behaupte ich, dass Apple seine Datenschutzrichtlinie zur App-Tracking-Transparenz genutzt hat, um den Anteil des Marktes für mobile Werbung von Facebook zu übernehmen.

Ich erkläre, wie die sich verändernde digitale Datenschutzumgebung First-Party-Daten eine Betriebsprämie auferlegt und wie das von mir vorgestellte „Fortress of Content“-Konzept funktioniert dieses Stückermöglicht es großen Plattformen, die Wirksamkeit von Werbung aufrechtzuerhalten und gleichzeitig neue Datenschutzbeschränkungen einzuhalten.

Ich weise darauf hin, dass Apples Datenschutzrichtlinie zur App-Tracking-Transparenz eigene Werbenetzwerke verwendet und Strategien vorstellt, um unterschiedliche Behandlungen anzugehen.

Ich argumentiere, dass Apples Ansatz zur Verbesserung der Privatsphäre der Verbraucher durch die App „App Tracking Transparency“ nützlich ist und dass die Sprache, die in seiner Anmeldeabfrage verwendet wird, beschwerlich und einschüchternd ist.

Dies ist die Erzählung der Präsentation, die ich im Clubhausraum hielt. Diese wurde auch als Podcast-Episode veröffentlicht.

In diesem Artikel präsentiere ich eine quantitative Bewertung der Auswirkungen von ATT auf die Einnahmen von Facebook, die vom Worst-Case-, Baseline- und Best-Case-Szenario reicht. Diese Schätzung wurde Monate vor der Verbreitung von ATT berechnet; Die tatsächlichen Auswirkungen von ATT, die beobachtet wurden, nachdem Facebook im dritten Quartal 2021 Einnahmen gemeldet hatte, waren im Einklang mit meiner Worst-Case-Schätzung.

Ich gebe einen Überblick über den differenziellen Datenschutz, einen Datenschutzansatz, der in letzter Zeit zunehmendes Interesse geweckt hat, da verschiedene Plattform-Datenschutzrichtlinien und staatliche Vorschriften das Arbeitsumfeld für digitale Werbeplattformen verändern.

Ich lehne die Idee ab, dass „Ausgaben für mobile Werbung nicht einfach wegfallen können“, weil das Anzeigen-Targeting aufgrund von ATT und anderen Datenschutzinitiativen an Relevanz verliert.

In diesem Artikel enthülle ich die Logik hinter der Tatsache, dass so viele große Verbraucherprodukte Werbenetzwerke aufbauen (oder kaufen), um Werbung in ihr Kernangebot an Inhalten zu integrieren.

Ich stelle einen Rahmen für die nachhaltige Integration von NFT in die von Spielern geführte Spieleökonomie vor.

Autor des Fotos Markus Winkler bei Unsplash

Das Beste von MDM im Jahr 2021

2021 war in gewisser Hinsicht das Jahr des Banners für Mobile Dev Memo: Seine Lesbarkeit, gemessen an Seitenaufrufen auf der Website und Abonnenten des Newsletters, stieg dramatisch an. Dies geschah in erster Linie, weil Apples Privacy Tracking Policy (ATT) eine Welle der Panik und Besorgnis im gesamten mobilen Ökosystem auslöste. Aber ATT hat das monopolisiert, was ich mein „Aufmerksamkeitsbudget“ nenne: eine Reihe von Themen, über die ich tief genug nachdenken kann, um mich wohl zu sezieren, da MDM nicht meine Vollzeitbeschäftigung ist und ich ihm nur begrenzt Zeit widmen kann. Infolgedessen habe ich mich in den Details der ATT-Implementierung, der Reaktion verschiedener Werbeplattformen auf ATT und einer Reihe von Beweggründen verzettelt, die erklären, warum ATT überhaupt eingeführt wurde.

Ich habe MDM vor vielen Jahren als Mittel zur persönlichen Weiterbildung gestartet. Meine These lautete: Wenn mein konzeptionelles Verständnis eines Themas stark genug ist, um daraus einen erklärenden Blogbeitrag zu machen, dann gewinne ich nicht nur Wissen durch eine disziplinierte Übung des regelmäßigen Bloggens, sondern werde dadurch auch zu einem erfahreneren und scharfsinnigeren Kommunikator . Der Umfang dieses Prozesses konzentrierte sich bisher ausschließlich auf das, was ich als Querschnitt der Erstellung, Verbreitung und des Konsums digitaler Inhalte und der wirtschaftlichen Prinzipien betrachte, die den Umgang der Benutzer mit diesen Inhalten bestimmen. Ich fühle mich wohl in diesem besonderen intellektuellen Raum, der grob durch die in meinem Buch behandelten Themen begrenzt ist, Freemium-Ökonomie2014 geschrieben

Im Jahr 2021 erweiterte sich dieser Bereich: zu kommerziellen und wettbewerbsorientierten Motiven, die nicht nur beobachtet werden können, sondern intuitiv sein müssen. Ich fühle mich in diesem Bereich weniger wohl, weil er hartnäckige Spekulationen erfordert, die funktional fast dem Verkauf ähneln. Ich mag es nicht, Annahmen und Theorien in ein überzeugendes rhetorisches Produkt zu packen. Mir macht es Spaß, komplexe, byzantinische Themen zu sezieren und sie verständlich und zugänglich darzustellen. Ich finde diesen Destillationsprozess Spaß. Ich möchte keine OpEd-Stücke schreiben.

Aber zum Thema ATT hatte ich das Gefühl, keine große Wahl zu haben. Die Berichterstattung an die Mainstream-Medien, insbesondere unmittelbar nach der WWDC 2020 – als der ATT eingeführt wurde – war, wenn ich wohltätig bin, falsch und nutzlos. Ich hatte während des Pandemoniums nach der Einführung von ATT ehrlich das Gefühl, dass, wenn ich nicht versuche, die Änderungen, die sich auf das mobile Ökosystem auswirken würden (und getan haben), zu klären, objektiv zu analysieren und aufzuschlüsseln, dass verschiedene Parteien wie Werbetechnologieanbieter, Apple selbst, und „Marketing-Gurus“ würden das Gespräch dominieren. Ich bin stolz auf die Arbeit, die ich geleistet habe, um ATT für ein breites Publikum von Marketingfachleuten, Führungskräften und Investoren an öffentlichen Märkten wie z dieses Stück, dieses Stückich dieses Stück.

Aber all diese Artikel wurden im Jahr 2020 geschrieben. Die Aufklärungsarbeit der breiten Öffentlichkeit über ATT konnte nicht mit bloßem Diskutieren enden was: das warum, die den ATT zugrunde liegenden kommerziellen Anreize darstellen, war ebenfalls wichtig. Ich habe diese Motivationen 2017 behandelt Der kommende Krieg zwischen Apple und Facebook. Es waren jedoch zeitgemäße – und fortlaufende – Kommentare erforderlich, um Marketingfachleuten dabei zu helfen, sich vorzustellen, welche Wege die Teilnehmer der öffentlichen ATT-Schlägerei zu gehen versuchten, und das war der redaktionelle Schwerpunkt dieser Website im Jahr 2021 Win-Win-Vorschlag für jeden Kommentator angesichts des aufgeladenen, polarisierten Diskurses, der ihn umgibt.

2022 plane ich, zu den Wurzeln von MDM zurückzukehren: trockene, unumstrittene und meist quantitative Analyse. Bis dahin stelle ich die 10 besten Artikel von MDM im Jahr 2021 vor, aufgelistet in absteigender Reihenfolge der Gesamtzahl der Seitenaufrufe.

In dem meistgelesenen Artikel, der 2021 auf Mobile Dev Memo veröffentlicht wurde, behaupte ich, dass Apple seine Datenschutzrichtlinie zur App-Tracking-Transparenz genutzt hat, um den Anteil des Marktes für mobile Werbung von Facebook zu übernehmen.

Ich erkläre, wie die sich verändernde digitale Datenschutzumgebung First-Party-Daten eine Betriebsprämie auferlegt und wie das von mir vorgestellte „Fortress of Content“-Konzept funktioniert dieses Stückermöglicht es großen Plattformen, die Wirksamkeit von Werbung aufrechtzuerhalten und gleichzeitig neue Datenschutzbeschränkungen einzuhalten.

Ich weise darauf hin, dass Apples Datenschutzrichtlinie zur App-Tracking-Transparenz eigene Werbenetzwerke verwendet und Strategien vorstellt, um unterschiedliche Behandlungen anzugehen.

Ich argumentiere, dass Apples Ansatz zur Verbesserung der Privatsphäre der Verbraucher durch die App „App Tracking Transparency“ nützlich ist und dass die Sprache, die in seiner Anmeldeabfrage verwendet wird, beschwerlich und einschüchternd ist.

Dies ist die Erzählung der Präsentation, die ich im Clubhausraum hielt. Diese wurde auch als Podcast-Episode veröffentlicht.

In diesem Artikel präsentiere ich eine quantitative Bewertung der Auswirkungen von ATT auf die Einnahmen von Facebook, die vom Worst-Case-, Baseline- und Best-Case-Szenario reicht. Diese Schätzung wurde Monate vor der Verbreitung von ATT berechnet; Die tatsächlichen Auswirkungen von ATT, die beobachtet wurden, nachdem Facebook im dritten Quartal 2021 Einnahmen gemeldet hatte, waren im Einklang mit meiner Worst-Case-Schätzung.

Ich gebe einen Überblick über den differenziellen Datenschutz, einen Datenschutzansatz, der in letzter Zeit zunehmendes Interesse geweckt hat, da verschiedene Plattform-Datenschutzrichtlinien und staatliche Vorschriften das Arbeitsumfeld für digitale Werbeplattformen verändern.

Ich lehne die Idee ab, dass „Ausgaben für mobile Werbung nicht einfach wegfallen können“, weil das Anzeigen-Targeting aufgrund von ATT und anderen Datenschutzinitiativen an Relevanz verliert.

In diesem Artikel enthülle ich die Logik hinter der Tatsache, dass so viele große Verbraucherprodukte Werbenetzwerke aufbauen (oder kaufen), um Werbung in ihr Kernangebot an Inhalten zu integrieren.

Ich stelle einen Rahmen für die nachhaltige Integration von NFT in die von Spielern geführte Spieleökonomie vor.

Autor des Fotos Markus Winkler bei Unsplash

Oh verdammt! Testen Sie das Bild mit Jetpack Compose von Anders Ullnæss | Januar 2022

# beachbod2022

Screenshot-Tests (oder Screenshot-Tests, ich werde beide Begriffe abwechselnd verwenden) ist eine Art von Tests, die uns hilft sicherzustellen, dass sich unsere Benutzeroberfläche nicht unbeabsichtigt ändert.

Der Testschuss besteht aus 2 Schritten:

  1. Aufzeichnen
  2. Bestätigen Sie

Aufzeichnen

Wenn wir mit der Erstellung eines Teils der Benutzeroberfläche fertig sind, egal ob es sich um einen Vollbildmodus oder nur um eine Schaltfläche handelt, schreiben wir eine Testaufnahme und nehmen auf. Der Screenshot wird in unserem Quellcode gespeichert und definiert die Baseline für unsere Benutzeroberfläche.

Bestätigen Sie

Wir werden höchstwahrscheinlich später auf einen Code eingehen, der die Benutzeroberfläche von unserem ursprünglichen Screenshot ändern kann oder auch nicht.
Bei der Überprüfung nimmt die Testaufnahme einen neuen Screenshot auf und vergleicht die beiden Bilder. Wenn sie nicht identisch sind, schlägt unsere Testaufnahme fehl.

“Aber was, wenn ich daran denke, die Benutzeroberfläche zu ändern?” Ruiniert das nicht meine Testaufnahme?“
Ja er wird. Wenn wir die Benutzeroberfläche absichtlich ändern, erfassen wir nur erneut.
Als netter Bonus zeigt unsere Auszahlungsanfrage den Look vorher und nachher, was unsere bewerteten Freunde glücklich macht!

Wer hätte gedacht, dass Designer ihre Meinung ändern könnten?

Meiner Erfahrung nach ist das Testen von Videos bei iOS-Entwicklern sehr beliebt, und es wird selten von Android-Entwicklern gesprochen. Ich habe noch nie an Projekten gearbeitet, bei denen dies zuvor für Android durchgeführt wurde. Einer der Gründe könnte sein, dass das iOS-Tool fantastisch und einfach zu starten ist. (Meine Kollegen verwenden https://github.com/pointfreeco/swift-snapshot-testing). Nicht so sehr für Android, obwohl ich denke, dass sich die Dinge verbessern.

In jedem Fall haben wir uns von iOS-Kollegen inspirieren lassen und wollten es selbst ausprobieren. Wir haben auch mit der Arbeit an Jetpack Compose begonnen und dachten, es wäre schön, alle unsere neuen Compose-UI-Komponenten zu testen.

Der erste Schritt war, die richtige Bibliothek zu finden. Von den wenigen Bibliotheken fanden wir nur eine, die Compose erwähnte, also war es eine einfache Wahl:
https://github.com/pedrovgs/Shot

Für Grundlagen zum Schreiben eines Screenshot-Tests für Jetpack Compose lesen Sie hier den Blogbeitrag der Bibliothek:
https://blog.karumi.com/jetpack-compose-screenshot-testing-with-shot/

Da dieser Blogbeitrag bereits die Grundlagen behandelt, werde ich mich auf die zusätzlichen Schritte konzentrieren, die wir unternommen haben:

  1. Durchführung von Aufnahmetests im Rahmen von CI/CD
  2. Arbeiten Sie mit Screenshots, die auf verschiedenen Emulatorarchitekturen aufgenommen wurden
  3. Machen Sie Tests schnell und einfach zu schreiben

In unserem Projekt verwenden wir Bitrise für CI / CD, aber unser Ansatz sollte auch für andere Einstellungen funktionieren. Mit Shot führen Sie Screenshot-Tests durch die Gradle-Aufgabe durch ./gradlew internalDebugExecuteScreenshotTests wo internalDebug ist Ihre Variante der Herstellung.

Wenn Sie wie wir bereits einige UI-Tests haben, die keine Screenshots sind, müssen Sie etwas Spezifischeres einstellen. Wir tun dies, indem wir eine Namenskonvention verwenden und alle unsere Screenshot-Tests benennen *ScreenshotTest und führen Sie den Build-Befehl wie folgt aus:

./gradlew internalDebugExecuteScreenshots -Pandroid.testIntrumentationRunnerArguments.tests_regex=.*ScreenshotTest.*

Wenn Sie ihn lokal ausführen, wird dieser Befehl auf jedem Emulator oder Gerät ausgeführt, das Sie verwenden. Wenn Sie als Teil Ihres CI/CD arbeiten, müssen Sie zuerst einen Emulator erstellen und ausführen. In Bitrise haben Sie dafür einen netten AVD-Manager-Schritt:

Beim lokalen Erstellen von Screenshots ist es wichtig, denselben Emulatortyp zu verwenden, daher haben wir auch ein Skript zum Erstellen unseres Emulators mit dem entsprechenden Namen bissig. (Dies kann auch in anderen CIs / CDs ohne den AVD-Manager-Schritt verwendet werden):

Dieses Skript ist im Laufe der Zeit etwas gewachsen, um meinen Kollegen dabei zu unterstützen, einen neuen Mac mit Apple-Silikon zu bekommen (dazu später mehr), aber ein wichtiger Teil passiert in der letzten Zeile. Erstellt einen Emulator mit den gleichen Spezifikationen wie der von Bitrise.

Nach dem Schritt AVD Manager in Bitrise müssen Sie warten, bis der Emulator bereit ist, bevor Sie die Screenshot-Tests ausführen. Ich habe eine Weile gebraucht, um herauszufinden, warum es nicht funktioniert hat, da die Fehlermeldung, die Sie erhalten, nicht sehr klar ist.
Dazu gibt es natürlich einen Schritt:

Geduld ist eine Tugend

Wir führen dieses Skript lokal aus, um die Screenshots auszuführen (zu überprüfen):

Das Skript zum Erfassen von Screenshots ist sehr ähnlich, jedoch mit dem Capture-Parameter:

Beide verwenden dieses Skript, um den Emulator auszuführen:

Ich habe die Abbruchleitung des Emulators eingeschaltet, als die Tests vorbei waren. Ohne sie würden Sie einen neuen Emulator erhalten, der jedes Mal ausgeführt würde, wenn Sie das Skript ausführen (und Tests würden auf allen gleichzeitig ausgeführt).

Wir zahlen derzeit nicht für die schnellsten Maschinen in Bitrise, daher ist die Pipeline leider zu langsam (25-30 Minuten), um für jede Auszahlungsanforderung ausgeführt zu werden. Das Ausführen der Aufnahmen selbst ist nicht so schlimm, aber das Erstellen und Ausführen des Emulators ist ziemlich langsam. Wenn Sie den Emulator zuvor erstellt und ausgeführt haben, dauert es beim lokalen Start nur 1-2 Minuten, um unsere ~ 50 Tests auszuführen, und diese Zahl erhöht sich nicht wesentlich, wenn neue Tests hinzugefügt werden.

Anstelle jeder Auszahlungsanforderung führen wir die Pipeline jede Nacht aus und senden sie an den Teams-Kanal, wenn sie fehlschlägt. Nicht ideal, aber gut genug:

Vielleicht sollte ich unsere Testaufnahmen reparieren, anstatt Blogbeiträge zu schreiben?

Beim Vergleich von Screenshots, die auf Emulatoren mit unterschiedlichen Architekturen aufgenommen wurden, kann es Unterschiede geben, die für das menschliche Auge nicht sichtbar sind, aber unser Testbild wird trotzdem fehlschlagen. Auf dem neuen Apple-Silikon-Mac meines Kollegen kann kein x86_64-Emulator wie auf meinem älteren Mac oder dem Ubuntu-Docker-Image von Bitrice ausgeführt werden.

Unsere suboptimale Lösung dafür besteht darin, unseren Aufnahmetests etwas Toleranz hinzuzufügen. Wir lassen die Tests erfolgreich sein, wenn der Unterschied zwischen den beiden Screenshots weniger als 2 % beträgt.

Dies kann zu kleinen unbeabsichtigten Änderungen an der Benutzeroberfläche führen, die von Tests nicht erkannt werden. Dies kann ein echtes Problem sein und wir hatten bereits einige Fälle, in denen Screenshot-Tests keine Änderung in der Benutzeroberfläche festgestellt haben:

  1. Ändern Sie ein Symbol in den Vollbildmodus
  2. Es verändert die Marge ein wenig

Das Schreiben von Filmmaterialtests kann mühsam und repetitiv sein, daher möchten wir, dass sie einfach zu schreiben sind und sich nicht wie eine Verpflichtung anfühlen.

Mit Jetpack Compose erstellen wir regelmäßig Reviews unserer Komponenten, die unterschiedliche Konfigurationen zeigen.

Wenn wir Footage-Tests erstellen, wollen wir das Gleiche.
Also haben wir angefangen, Testaufnahmen unserer Bewertungen zu erstellen:

Mit der Philosophie, für jede Rezension einen Screenshot-Test zu machen, können wir sehen, dass alle Screenshots sehr ähnlich aussehen werden.

Fürs Erste haben wir eine Live-Vorlage in Android Studio erstellt, um sie schneller zu schreiben.

Schreiben Sie einfach einen Snap, drücken Sie auf die Registerkarte und geben Sie den Namen Ihrer Bewertung ein. Dies ist schneller, als sie jedes Mal von Hand zu schreiben, aber eine zusätzliche Verbesserung könnte darin bestehen, ein Skript zu erstellen, das einen Test für jede Überprüfungsnotiz generiert.

Das Testen der Aufzeichnung ist für Android immer noch etwas umfangreicher als für iOS, und die von uns verwendete Bibliothek hat keine großartige Integration mit Android Studio. Sie können einen Screenshot-Test nicht einfach mit der Wiedergabetaste ausführen / aufzeichnen, Sie müssen die Gradle-Aufgabe verwenden.

Der HTML-Bildverifizierungsbericht zeigt Ihnen, wenn Änderungen an Ihrer Benutzeroberfläche vorgenommen werden

Aber für mich machen diese Vorteile es immer noch wertvoll:

  1. Wir können sicher sein, dass sich unsere Benutzeroberfläche nicht unbeabsichtigt ändert
  2. Unsere Auszahlungsanträge erhalten nette Bewertungen der neuen UI, die wir vorgenommen haben, und der UI-Änderungen, die wir “kostenlos” vorgenommen haben.
  3. Wir können aufhören, die Art von Espresso-Tests zu schreiben, die prüfen, ob alle Elemente der Benutzeroberfläche auf dem Bildschirm angezeigt werden
Ich werde das nicht vermissen

Hinterlasse einen Kommentar oder kontaktiere mich, wenn du einen Snapchat haben möchtest. Wenn Sie Fragen oder Verbesserungsvorschläge zu unserem eigenen Setup haben oder Hilfe beim Einrichten für Ihr eigenes Projekt benötigen. Hier oder auf Twitter: https://twitter.com/andersullnass.

Danke an Alex von der niederländischen Android-Slack-Benutzergruppe (https://twitter.com/alex_caskey) für die großartige Hilfe, als ich dies ursprünglich gepostet habe, und vielen Dank an meinen Kollegen Cristan, der mit mir daran gearbeitet hat, die Art und Weise, wie wir die Aufnahmen testen, zu verbessern, und für die Überprüfung dieses Blog-Beitrags.

Das Versprechen und die Herausforderung von Web3-Gaming

In der Folge dieser Woche spreche ich mit Kanaan Linder ich Atif KhanGeschäftsführer bzw. Chief Operating Officer Sternenstaub, eine Plattform, die es Spieleentwicklern ermöglicht, Kryptowährungen in ihre Spiele zu integrieren. In dieser Folge sprechen wir über die Herausforderung einiger der verschiedenen Kernkonzepte, die Web3-Spiele unterstützen – wie die Interoperabilität von In-Game-Elementen, die als NFT ausgedrückt werden – sowie über das potenzielle Versprechen in Bezug auf erweitertes Gameplay und Spielvergnügen, das sie darstellen . Wir besprechen auch die Fähigkeiten, die erforderlich sind, um Web3-Spiele zu entwickeln, den richtigen Weg zur Vermarktung von Web3-Spielen und welche Infrastruktur diese Spiele benötigen, um erfolgreich zu sein.

Der Mobile Dev Memo-Podcast ist verfügbar unter: