Search for:

Auspacken der Android-Sicherheit: Teil 1 – Unsachgemäße Nutzung der Plattform Lähde: Ed George | Februar 2022

Ed George
Bildnachweis: Mohn

👋 Hallo und willkommen zu der neuen Reihe von Blogbeiträgen, in denen wir tief in die Android-Sicherheit eintauchen werden. Diese Serie konzentriert sich hauptsächlich auf Top 10 mobil Sicherheitsbedrohungen zu Open Web Application Security Project Foundation (OWASP).die führende Community für Anwendungssicherheit in unserem Bereich.

Während sich diese Posts auf die Android-Plattform konzentrieren, sind viele der Ideen und Gefühle dahinter völlig agnostisch für die Plattform, ebenso wie die OWASP-Top-10-Liste selbst.

Diese Beiträge sind auch eine Ergänzung zu meiner Rede vom Januar 2022 „Don’t Be Stunned by OWASP – An Introduction to Writing Code for Greater Android Security“, in der ich die 5 größten Probleme ausführlicher bespreche. Bitte überprüfen Sie meine Diskussionsseite für weitere Details und relevante Links. EIN begleitender Antrag die die in der Rede vorgestellten Probleme demonstriert, steht ebenfalls zum kostenlosen Download zur Verfügung.

Bitte beachten Sie, dass diese Serie zu Bildungszwecken dient nur. Denken Sie daran, nur Anwendungen zu testen, für die Sie die Erlaubnis dazu haben, und vor allem, sei nicht gemein.

Wenn Ihnen diese Serie gefällt oder Sie Feedback haben, Bitte sende mir eine Nachricht. Danke!

In diesem ersten Teil meiner Serie über Android-Sicherheit werden wir uns mit der Bedrohung Nummer 1 für die Sicherheit mobiler Apps befassen, die von OWASP als unsachgemäße Nutzung der Plattform bezeichnet wird.

Auf den ersten Blick scheint die missbräuchliche Nutzung der Plattform eine etwas vage Aussage über etwas zu sein, das sein sollte das brennendes Problem in der Sicherheit mobiler Anwendungen. Was dieser Titel jedoch subtil auszudrücken versucht, ist, dass die Hauptbedrohung für die Sicherheit unserer mobilen Anwendungen tatsächlich darin besteht uns. Geradeheraus, Wir sind das Problem! ¹

Was meine ich mit dieser hyperbolischen Aussage? Nun, normalerweise führt unbeabsichtigter Missbrauch von Entwicklern, Fahrlässigkeit oder einfach Unverständnis für die Android-Plattform zu unseren schwerwiegendsten Sicherheitsproblemen.

Niemand kann erwarten, dass er die gesamte Plattform von innen kennt, und Entwickler sind auch nicht unfehlbar. Fehler passieren unvermeidlich, aber ich hoffe, dass Sie durch die Einführung einiger der häufigsten Sicherheitsprobleme, die wir versehentlich in unseren Code schreiben, es sich zweimal überlegen, bevor Sie selbst denselben Fehler machen, und sich vor einer potenziellen Sicherheitskatastrophe bewahren.

Entschuldigung für das schreckliche Wortspiel, das erste häufige Beispiel für den Missbrauch der Android-Plattform fällt in die Definition Intent. Für diejenigen, die neu bei Android sind, profitiert die Plattform Intent Klasse als eine Möglichkeit, eine Art von Aktion zu initiieren. Dies kann in Form des Navigierens auf einem neuen Bildschirm in Ihrer App, des Startens eines Hintergrund-/Vordergrund-Dienstes oder der Registrierung eines Rundfunkempfängers erfolgen, um regelmäßige Updates von einer Quelle zu erhalten. Der Intent -Klasse bietet eine einfache Möglichkeit, Daten zu parsen und an separate Anwendungskomponenten zu übergeben, und ist die häufigste Methode, dies mithilfe eines Frameworks zu erreichen.

Allerdings ist das Android-Framework Auch ermöglicht anderen Anwendungen das Senden und Empfangen Intent Instanzen zwischen ihnen, um die „Kommunikation“ zwischen Anwendungen zu erleichtern. Hierin liegt die erste gemeinsame Falle.

Um die Kommunikation zwischen Anwendungen zu ermöglichen, die Komponente der Anwendung, die wir erhalten möchten Intent muss als gekennzeichnet sein android:exported=true Innerhalb AndroidManifest.xml Datei. Wenn Sie eine Komponente mit diesem Flag markieren, können Sie eine „ausdrückliche Absicht“ an eine andere Anwendung (oder ein anderes System) senden, um die angegebene Aktion auszuführen, die die empfangende Komponente verwalten kann.

Darüber hinaus können auch Komponenten definiert werden <intent-filter> Blöcke innerhalb des Manifests, um die Arten von Absichten anzugeben, auf die die Aktivität, der Dienst oder der Broadcast-Empfänger reagieren kann. Durch diese Definition kann eine andere Anwendung „implizite Absicht“ verwenden, um das System aufzufordern, Ihre Anwendung als kompatibel anzuzeigen, wenn sie eine bestimmte Absicht anbietet. Beispielsweise die Weiterleitung an ein implizites Intent-System, um Anwendungen anzuzeigen, die URLs verarbeiten können https://spght.dev kann eine Liste der installierten Webbrowser anbieten. Was jedoch für Anfänger vielleicht nicht offensichtlich ist, ist, dass durch die Angabe des Intent-Filters die Komponente im System als Export gekennzeichnet wird obwohl android:exported=true es ist im Manifest nicht explizit definiert.

Meiner Erfahrung nach ist es nicht ungewöhnlich, dass App-Komponenten versehentlich als „Exportieren“ gekennzeichnet werden, obwohl dies eigentlich nicht der Fall sein sollte. Diese falsch definierten Anwendungskomponenten stellen ein großes Sicherheitsrisiko dar, da sie direkt verfügbar sind und daher potenziell ausgenutzt werden können.

Der Hauptgrund, warum schlecht verwaltete Exporte so gefährlich sind, liegt darin, dass es trivial ist, diese Schwachstellen in der Anwendung zu finden und darauf abzuzielen.

Böswillige Akteure können manuell nach Reverse-Engineering-Anwendungen suchen oder Befehlszeilentools wie z drozer oder Cutter um gefährdete exportierte Komponenten zu scannen. Einmal gesammelt, kann es verwendet werden adb entweder um eine Komponente auszuführen oder um eine Absicht zu erstellen, die die gewünschte Aktion des Hackers ausführt.

Ein bemerkenswertes Beispiel dafür aus der realen Welt wurde vom Käferjäger Mehtab Zafar (mzfr) in seinem November 2020 entdeckt. Blogeintrag die detailliert beschreibt, wie die falsch konfigurierte „Deep-Link-Aktivität“ die Ausnutzung von Multi-Site-Scripting (XSS) auf der offiziellen mobilen GitHub-App ermöglichte. Huch.

Bildnachweis: https://blog.mzfr.me/posts/2020-11-07-exported-activities

U begleitender Antrag für meine Rede geschrieben wurde, wurde dies durch Fehlkonfigurationen von Aktivitäten demonstriert MainActivity dass es gemeldet werden kann, obwohl normalerweise eine “Authentifizierung” für den Zugriff von der Anwendung erforderlich ist.

Wie MainActivity exportiert wird, ist es möglich, einfach anzurufen adb dass das System die Aktivität öffnet und somit die Notwendigkeit einer Authentifizierung umgeht.

All dies mag ein wenig entmutigend klingen, aber zum Glück ist es so einfach, diesen Angriffsvektor zu stoppen, wie die relevanten Komponenten in Ihrem zu sichern AndroidManifest.xml die Datei(en) korrekt mit gekennzeichnet sind android:exported.

Tatsächlich ist es ab Android 12 (API 31) nun eine Anfrage zu setzen android:exported Eigentum an allen Ihren Activity, Serviceich BroadcastReceiver Definitionen in Ihrer Anwendung AndroidManifest.xml Datei(en), wenn Sie auf dieses SDK abzielen.

Als zusätzlichen Schutz ermöglicht die Android-Plattform der App auch, eine „benutzerdefinierte Lizenz“ zu definieren Elemente der Genehmigung im Manifest für Wechselwirkungen einschränken mit seinen exponierten Komponenten.

Beispielsweise kann eine Anwendung eine “Signatur”-Berechtigung definieren, die es ihr erlaubt, nur mit anderen Anwendungen zu interagieren, die dieselbe Berechtigung teilen. ich werden mit demselben Signaturzertifikat erstellt:

Um das Schicksal von GitHub zu vermeiden, ist es außerdem eine bewährte Methode, Inhalte zu überprüfen und zu validieren Intent die Sie erhalten, wenn Sie mit Daten umgehen von a <intent-filter>. Tu es Nein blind glauben, dass das, was Sie bekommen, das sein wird, was Sie erwarten!

In zukünftigen Beiträgen dieser Serie werden wir weitere Fälle von „Plattformmissbrauch“ und mehr als die OWASP Top 10 für mobile Geräte untersuchen.

Danke wie immer fürs Lesen! Ich hoffe, Sie fanden diesen Beitrag interessant, zögern Sie nicht, mich mit Feedback zu twittern @Sp4ghettiCode und vergessen Sie nicht zu klatschen, zu liken, zu twittern, zu teilen, zu markieren usw.

Weiterlesen

Häufige Fehler im Vorstellungsgespräch. Häufige Fehler in Systemdesign-Interviews… | Lähde: Alex Lementuev | Februar 2022

Autor des Fotos Jeremy Bezanger er Unsplash
Alex Lementjew

Liste der Beiträge in dieser Serie:

  • Studieren Sie Open-Source-Projekte – Nicht jedes Projekt ist perfekt, aber Sie können trotzdem viele nützliche Dinge von jedem von ihnen lernen.
  • Ein Blog für Entwickler von Studiofirmen – Sie können viel über ihr grundlegendes technisches Spektrum lernen und über mögliche Fragen nachdenken, die sie stellen könnten.
  • Führe gefälschte Interviews mit deinen Freunden durch – Zeitmanagement ist der Schlüssel: Ihr Ziel ist es, so viel Gelände wie möglich in kürzester Zeit zu bewältigen. Ein wenig Übung baut auch Stress vom Vorstellungsgespräch ab.
  • Systemanforderungen werden nicht erfasst – Die Interviewfrage kann absichtlich unklar sein. Es wird erwartet, dass der Kandidat mehr Fragen stellt, um die Aufgabe besser zu definieren. Weitere Informationen finden Sie unter Sammlungsanforderungen.
  • Ohne klärende Fragen zu stellen – Es kann nützlich sein, einige Informationen über den Zielmarkt, die Zielgruppengröße und Details zum Entwicklerteam zu erhalten.
  • Direkter Übergang zur Umsetzung – Es ist im Allgemeinen ein schlechtes Zeichen, wenn ein Kandidat sofort anfängt, über untergeordnete Themen zu sprechen. Beispielsweise welche Ansichtsklassen verwendet oder welches UI-Architekturmuster angewendet werden soll. Die Details der Implementierung interessieren den Prüfer möglicherweise überhaupt nicht.
  • Stille – Stellen Sie sicher, dass Sie Ihre Lösung besprechen.
  • Warten Sie, bis der Interviewer anfängt, Fragen zu stellen – Wünschenswert ist, dass der Kandidat eine Diskussion “anstößt” (insbesondere bei höherrangigen Kandidaten).

Ein Fehler könnte den Kandidaten aus der Bahn werfen und ihn dazu zwingen, das gesamte Vorstellungsgespräch aufzugeben. Dies ist eine schlechte Strategie, da die meisten Interviewer versuchen, die Fähigkeiten eines Kandidaten einzuschätzen und nicht nur nach “richtigen” Antworten suchen.

  • Lange Einleitung – Tiefer in Ihren beruflichen Hintergrund einzutauchen, gibt nicht viele “Signale”. Der Interviewer würde sich höchstwahrscheinlich eine Meinung bilden, die auf den Ergebnissen des Interviews des Kandidaten basiert und nicht auf einer Zusammenfassung seiner Berufserfahrung.
  • Interviewer ignorieren – Es ist besser, mit dem Sprechen aufzuhören, wenn der Gesprächspartner Sie unterbricht: Versuchen Sie nicht, “den Gedanken zu Ende zu führen” – Es ist besser, zu einem anderen Thema überzugehen und keine Zeit zu verschwenden.
  • ich wiederhole – noch einmal zu den gleichen Dingen: Es gibt dem Prüfer keine zusätzlichen Informationen.
  • Von Thema zu Thema springen – Für den Interviewer kann es schwierig sein, häufige Kontextänderungen zu überwachen.
  • Zu breit mit den Antworten – Das Abdecken irrelevanter Dinge gibt dem Prüfer kein vollständiges “Signal”. Versuchen Sie, bei der Ausgangsfrage zu bleiben.

Die Hauptaufgabe des Interviewers besteht darin, festzustellen, ob der Kandidat für die Stelle geeignet ist. Wenn der Kandidat irgendeine Art von Feindseligkeit von den Interviewern verspürt, sollte dies dem Beschäftigungsspezialisten gemeldet werden.

Am ausgeprägtesten für Kandidaten, die bestimmte Designs online studieren und versuchen, Fragen in eine unabhängige Lösung zu integrieren. Dieser Leitfaden ist eine Reihe von Empfehlungen und definiert kein offizielles Gesprächsprotokoll für irgendein Unternehmen. Der Kandidat sollte sich in jedem konkreten Fall an die Führung der Interviewer halten.

  • Sei zuversichtlich – fester Glaube an eine bestimmte Technologie und Ablehnung jeglicher alternativer Ansätze.
  • Unterbrechung des Interviewers – Der Interviewer könnte einige nützliche Ratschläge geben oder eine Richtung zu einer Lösung vorschlagen. Der Kandidat sollte den Interviewer seinen Gedanken zu Ende führen lassen, bevor er irgendwelche Meinungsverschiedenheiten äußert.
  • „Bildung“ von Interviewern – Wenn der Kandidat der Meinung ist, dass der Interviewer falsch / falsch liegt, ist es besser, dies freundlich vorzuschlagen, anstatt ihm eine Lektion über seine Unwissenheit zu erteilen. Zeit mit der „Bildung“ von Interviewern zu verbringen, gibt kein nützliches „Signal“ und kann einige Warnsignale auslösen.
  • „Erfreulich“ sein – versucht, den Gesprächspartner zu loben, in der Hoffnung auf eine positive Rückmeldung.

Die rote Fahne ist, wenn der Kandidat ohne vorherige Begründung sofort eine konkrete Lösung anbietet. Der Interviewer kann möglicherweise nicht verstehen, warum der Kandidat einen bestimmten Ansatz bevorzugt, ohne ihn mit möglichen Alternativen zu vergleichen.

Es ist riskant, Dinge zu erfinden und darüber zu lügen, da die Möglichkeit besteht, dass der Interviewer ein Experte auf dem Gebiet der Diskussion ist.

Am ausgeprägtesten bei Kandidaten, die sich nicht auf ihre Runde vorbereiten. Das Fehlen eines Lösungsstrukturierungsplans würde während des Gesprächs zusätzlichen Druck ausüben.

Die Verwendung herstellerspezifischer Lösungen während des Interviews betrifft mehr die Details der Implementierung als das Design der Architektur. Der Kandidat kann alle Informationen über den Lieferanten weglassen, es sei denn, der Interviewer fragt ausdrücklich danach.

Manchmal berücksichtigt der Kandidat den “unglücklichen” Weg nicht. Zum Beispiel, wenn der Arbeitsspeicher oder Speicherplatz knapp wird.

Es ist besser zuzugeben, dass Sie nicht wissen, wie die Dinge funktionieren, anstatt Vermutungen anzustellen. Es ist in Ordnung, darüber nachzudenken, wie die Funktionalität bestimmt wird könnten umgesetzt werden, aber Sie müssen zuerst Ihre Unkenntnis angeben.

Der Interviewer ist hier, um Ihnen zu helfen – lassen Sie sich beraten!

Android Jetpack Compose: Erstellen Sie ein Ersatzmaterialthema Lähde: Pedro Glória | Januar 2022

Wir haben also unser Thema definiert, wie können wir dieses neue Thema nun zu komponierenden Elementen wie einer Schaltfläche hinzufügen? Beim ersten Versuch habe ich folgendes gemacht:

Und das Ergebnis war:

Nun, das sieht nicht so aus, wie wir es in unserem Thema definiert haben. Nicht wahr? Also habe ich mir angesehen, wie die Schaltfläche in MaterialTheme definiert ist

Wie ich schnell lernte (was, ehrlich gesagt, vollkommen erwartet wurde, verstand ich nicht nur anfangs die Auswirkungen der Erstellung unseres eigenen Designs), verwendet Button MaterialTheme-Attribute, die wir nicht definiert haben. Das bedeutet dann, dass wir die Button-Attribute komplett durch unsere eigenen ersetzen müssen. Und das taten wir.

Was wiederum diese Schaltfläche erstellt

Ok, es sieht besser aus, aber die Typografie sieht komisch aus, oder? Also habe ich mir den Material-Button-Code angesehen und wir können Folgendes sehen:

Nun, es scheint unseren TextStyle mit MaterialTheme-Typografie zu überwältigen. Ok, wir können das beheben, indem wir unseren eigenen TextStyle hinzufügen. Also ersetzen wir unseren Text durch den folgenden Code, der das Endergebnis liefert

Okay! Jetzt sieht es aus wie einer unserer Buttons!

Wie wir bereits gelernt haben, müssen wir Compilation-Theme-Materialien mit unseren Theme-Attributen in unsere eigenen Compiler packen. Lassen Sie uns versuchen, eine Oberfläche zu schaffen, die zu dunklen und hellen Themen passt. Auf den ersten Blick könnten wir einfach das mitgelieferte Surface verwenden. Aber jetzt erwarten wir schon, dass die Dinge nicht so funktionieren, wie wir wollen, oder?

Das helle Thema sieht gut aus (aber ist es das wirklich?), aber das dunkle ist nichts im Vergleich zu dem, was wir erwartet haben. Es sieht überhaupt nicht düster aus! Aber jetzt wissen wir, was das Problem ist. Wenn wir uns noch einmal die Definition von Compose Surface ansehen, sehen wir Folgendes:

Ja. Verwendet MaterialTheme-Farben. Also lassen Sie es uns um unsere Oberfläche wickeln

Ja! Das wollen wir. Hier sind einige Dinge zu beachten.

  1. Wir haben die Hintergrundfarbe als Oberflächenfarbe definiert. Aber hier wird es interessant. Da Sie Ihr eigenes Thema definieren, können Sie frei entscheiden, welche Farbe Sie für Ihre Oberflächen wünschen, Sie können jedes Farbattribut verwenden, das Sie in Ihrem Thema definiert haben: Primär, Sekundär, Hintergrund, Oberfläche oder sogar Banane.
  2. Aufmerksamere Leser haben vielleicht bemerkt, dass wir unsere eigenen definieren InhaltFarbe wie defaultContentColorFor (Farbe) Was ist das?

MaterialTheme gibt uns die Methode, die ist contentColorFor (Farbe) aber wir können es nicht verwenden, weil es die MaterialTheme-Spezifikation verwendet, die zur MaterialTheme-Farbgebung zurückkehrt. Daher verwenden wir unsere Methode, um die Farben unseres Themas abzurufen

Durch die Verwendung unserer Komponentenelemente, die vordefinierte Komponenten umschließen, und durch das Ändern einiger Attribute, wie z. B. der Farbe, können wir unser Design vollständig anpassen und die korrekte Anwendung der Dark- und Light-Eigenschaften ermöglichen.

Ich hoffe, dass Sie mit diesem Wissen diese Logik auf jede gewünschte Komponente anwenden und Ihr eigenes brandneues benutzerdefiniertes Design erstellen können.

Gute, schlechte und hässliche Benutzeroberfläche in der mobilen Entwicklung | von Michal Klimczak Januar 2022

Sind Sie sicher, dass Sie nach “Reduzieren der Zusammenführung” suchen?

Michal Klimczak
Autor des Fotos Tyler Brandon https://unsplash.com/photos/6RreavHxwxg
Autor des Fotos Theo Crazzolara https://unsplash.com/photos/k8mRwVA4MpA

Polymorphismus

Mehrfachvererbung

Grenzen zwischen Schichten

In der reinen Architektur definiert die Domänenschicht die Repository-Schnittstelle, die von der Datenschicht implementiert wird

Doppeltest

Rückrufe

class ListAdapter(val itemClickListener : () -> Unit) { ...
fun interface OnClickListener { fun invoke() }

“Weil ich es leicht durch eine andere Implementierung ersetzen kann”

Greifen Sie auf den Nutzungsverlauf der Android-Anwendung zu Lähde: Shubham Panchal | Januar 2022

Schritt 1: 🔐 Beantragung von Genehmigungen

Clip 1: PACKAGE_USAGE_STATS-Berechtigung zu AndroidManifest.xml hinzufügen

Schritt 2: 🔑 Überprüfen Sie den Status der Genehmigung und suchen Sie danach

Clip 2: Überprüfen Sie den Berechtigungsstatus von PACKAGE_USAGE_STATS mit AppOpsManager
Clip 3: Fordern Sie die Berechtigung PACKAGE_USAGE_STATS an, nachdem Sie den Lizenzstatus überprüft haben
Nutzungsdateneinstellungen wie auf einem Android 9-Gerät (Samsung J7) beobachtet.

Schritt 3: imanjeLaden Sie das Nutzungsereignis herunter

Clip 4: Nutzungsereignisse mit der Methode „usageStatsManager.queryEvents“ anfordern.
Code-Snippet-Ausgabe 4. Die letzte Zeile in der obigen Ausgabe zeigt den Namen des aufrufenden Pakets.

Schritt 4: Vom Benutzer installierte Anwendungen filtern (optional)

Clip 5: Holen Sie sich einen „Ordner“, der Paketnamen und Tags der vom Benutzer installierten Anwendungen enthält

Schritt 5: Stellen Sie sicher, dass der Benutzer entsperrt ist (mit Android R)

Clip 6: Überprüfen Sie, ob der Benutzer mit UserManager entsperrt ist

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.

Moderne MacBook-Benchmarks für die Android-Entwicklung Kirill Rozov | Januar 2022

Autor des Fotos Daniel Igdery https://unsplash.com/photos/FCHlYvR5gJI
Kirill Rosow

Die Wahl eines Geräts ist nie so einfach wie es ist, aber das neue Apple Silicon SoC für Mac hat den Markt ordentlich erschüttert und die Wahl noch schwerer gemacht. Welches MacBook soll ich kaufen? Wie unterschiedlich sind sie? Es ist schwer zu verstehen. Außerdem ist die Suche nach detaillierten Tests eine Höllenarbeit.

In diesem Artikel gebe ich Ihnen korrekt Vergleich der Build-Geschwindigkeiten anhand einiger realistischer Android-Projekte und einer Reihe verschiedener MacBook-Modelle. Außerdem sage ich Ihnen, welche Sie bis 2022 kaufen sollten.

In diesem Test habe ich die neuesten Intel-betriebenen MacBook Pro-Laptops sowie einige der neuesten MacBooks mit verwendet M1.

  1. iMac 27 “Intel Core i7 6700K von Ende 2015. | 24 GM RAM
  2. MacBook Pro 16 “2019 i7 9750H 6 CPU-Kerne / 12 Threads | 16 GB RAM
  3. MacBook Pro 16 “2019 i9 9880H 8 CPU-Kerne / 16 Threads | 32 GB RAM
  4. MacBook Air 2020 M1 | 16 GB Arbeitsspeicher
  5. MacBook Pro 14 “2021 M1 Pro 8 CPU | 16 GB RAM
  6. MacBook Pro 14 “2021 M1 Pro 10 CPU | 32 GB RAM
  7. MacBook Pro 16 “2021 M1 Pro 10 CPU | 32 GB RAM
  8. MacBook Pro 16 “M1 Max | 32 GB RAM

Ich habe Ende 2015 meinen alten iMac 27″ hinzugefügt, um zu testen, wie weit die neuen Mac-Modelle fortgeschritten sind.

Es ist nicht einfach sicherzustellen, dass alle Computer unter den gleichen Bedingungen funktionieren, aber ich habe versucht, perfekt zu sein:

  • Verwenden der neuesten Version von JDK 11. Für Apple Silicon habe ich Zulu ARM JDK verwendet
  • Verwenden von Gradle 7.3.3 zum Erstellen von Projekten (neueste Version zum Zeitpunkt des Tests verfügbar)
  • Schalten Sie externe Displays aus
  • Schließen Sie alle Computer an eine Stromquelle an
  • Schließen Sie so viele Programme wie möglich, auch die im Hintergrund
  • Schließen Sie Android Studio!
  • Versetzen Sie den Computer in den Ruhemodus (falls verfügbar)
  • Stellen Sie alle Laptops auf eine harte, ebene Oberfläche, damit der Luftstrom eindringen und den Laptop kühlen kann
  • Berühren Sie Computer während der Tests nicht
  • Deaktivieren Sie die Spotlight-Indizierung oder fügen Sie Testprojektordner zu Ausnahmen hinzu.

Wenn Sie weitere Bedingungen kennen, die vor dem Benchmark-Test berücksichtigt werden müssen, lese ich sie gerne in den Kommentaren unten.

Ich habe Tests mit durchgeführt Gradle-Profiler im Benchmark-Modus, der die Zeit misst, die zum Erstellen eines Projekts erforderlich ist. Die Ergebnisse, die Sie sehen werden, sind die Mittelwerte von zehn Testläufen, denen zwei Aufwärmübungen vorausgegangen sind, die nicht gewertet haben.

Ich habe alle getesteten Projekte Lagerund jedes Projekt hat sein eigenes Startup-Testszenario (a performance.scenarios Datei).

Die genauen Ergebnisse finden Sie in der folgenden Tabelle.

TiVi 0.6.3

TiVi ist eine kleine TV-Show-Tracking-Anwendung, die auf basiert trakt.tv.

Beckencodezeilen: 15K
Module: 25

Dieses Projekt ist recht klein, aber auch hier hinkt Intel dem M1 deutlich hinterher. Der M1 Pro / Max ließ den M1 nur eine Sekunde hinter sich. Diese Tests zeigen uns eines deutlich: Schon bei einem kleinen Projekt wie diesem sieht man, dass Apple Silicon deutlich schneller ist als der Intel Core 9 der 9. Generation.

TiVi 0.6.3 Benchmark-Ergebnisse

ExoPlayer r.2.16.1

ExoPlayer ist ein beliebter Mediaplayer auf Mediaplayer-Ebene für Android.

Java-Codezeilen: 225.000
Module: 35

Dieses nächste Projekt demonstriert die Vorteile einer Reihe von Hochleistungskernen im M1 Pro / Max. Die Ergebnisse zeigen einen deutlichen Vorsprung: Der M1 hatte ein Ergebnis von 39,4 Sekunden, während der M1 Pro / Max 10 Core 28 Sekunden erreichte. Währenddessen erzielte Intels bester Chip 43,9 Sekunden.

ExoPlayer r.2.16.1 Benchmark-Ergebnisse

Fokus 95.2.0

Fokus ist eine sichere Version von Firefox, die sich auf den Datenschutz konzentriert.

Beckencodezeilen: 19K
XML-Codezeilen: ~ 30.000.
Module: 3

Die Kriterien für Focus zeigen bereits deutliche Muster. Allerdings zeigen sie auch, dass die M1 Pro 8 Core Version nicht wesentlich hinter der Vollversion des M1 Pro oder M1 Max zurückbleibt.

Focus 95.2.0 Benchmark-Ergebnisse

Firefox 95.2.0

Feuerfuchs ist die Vollversion von Firefox.

Beckencodezeilen: ~ 97.000.
XML-Codezeilen: ~ 100.000.
Module: 4

Die Kompilierung von Kotlin-Code ist im Vergleich zu Java langsamer. Dennoch zeigen Apple-Prozessoren eine beständige Steigerung der Kompilierungsgeschwindigkeit. Das einzige ist, dass Sie immer noch keinen Unterschied zwischen M1 Pro 8-Kern- und 10-Kern-CPUs sehen können. Was?

Firefox 95.2.0-Benchmark-Ergebnisse

Signal 5.28.8

Signal ist eine beliebte Alternative zum Telegramm.

Java-Codezeilen: 248K
Beckencodezeilen: 42K
XML-Codezeilen: ~ 270.000
Module: 13

Schließlich kann man sehen, dass die 8 Kerne im M1 Pro langsamer sind als die Standardversion dieses Prozessors. Darüber hinaus unterstützt es nur die Schlussfolgerungen, die aus früheren Projekten gezogen wurden.

Benchmark-Ergebnisse Signal 5.28.8

Telegramm 8.2.1

Telegramm Android GitHub ist ein beliebter Bote. Dort ist der Code ziemlich ungewöhnlich: Es gibt ein NDK und die gesamte Benutzeroberfläche ist in Java-Code, es gibt kein Basin und es gibt kein apt oder kapt, um den Code zu generieren.

Java-Codezeilen: 700.000
C-Codezeilen: 988K
XML-Codezeilen: ~ 40.000
Module: 1

Telegram Android ist das größte Projekt, das ich getestet habe, und zeigt deutlich den Unterschied zwischen den Prozessoren. Die Benchmarks waren verblüffend: Es ist das einzige Projekt, das ich getestet habe, bei dem der i7 und i9 in der MacBook Pro-Version 2019 das Projekt schneller machen konnten als der Apple M1 im MacBook Air. Natürlich musste ich wissen, warum es passiert ist.

Telegramm 8.2.1 Benchmark-Ergebnisse

Es stellt sich heraus, dass der Grund dafür CMake und die ursprünglichen Kompilierungstools sind, von denen es viele in Telegram gibt. Apple M1 führt die Kompilierung mit aus Rosette 2. Während ich dies schreibe, unterstützt Android NDK Apple Silicon immer noch nicht. CMake (ab Version 3.19) und andere Tools unterstützen es jedoch bereits. Sie können die Einzelheiten lesen Hier.

Im weiteren Verlauf werden wir also einen deutlichen Schub erhalten: Der Apple M1 hat zumindest die Chance, den i7 und (lasst uns wild träumen!) sogar den i9 zu übernehmen. Warten wir also auf das fertige Werkzeug. Der Test zeigt auch deutlich, dass das M1 Pro / Max so unoptimierte Software ausführt, dass es sogar in der Lage ist, das 9. i9-Gen herunterzuladen.

Benchmark-Ergebnisse

Sie können Intel Core nicht abschreiben, wenn Ihr Projekt viel Quellcode enthält. Übrigens gibt es keinen Grund, Intel-Prozessoren zu verwenden: Sie werden sogar von den einfachsten Apple M1 übertroffen. Mit der Zeit werden die Tools fertig sein und die Vorteile des Besitzes eines Apple-Prozessors werden noch offensichtlicher.

Ein MacBook Air mit einem M1 würde für die meisten mobilen Entwickler ausreichen. Trotzdem würde ich empfehlen, das mit 16 GB RAM zu kaufen. Auf diese Weise können Sie Anwendungen für Android und iOS erstellen und die Entwicklung auf mehreren Plattformen (Kotlin Multiplatform, Flutter) ausprobieren. Ein riesiger Vorteil ist, dass es keinen Kühlschrank gibt, wodurch es ruhig, aber manchmal ziemlich heiß wird (wenn der Bau besonders lange dauert).

Wenn Sie an großen Projekten arbeiten und maximale Funktionen oder über 16 GB RAM wünschen, würde ich empfehlen, sich das MacBook Pro mit der M1 Pro 10-Core-CPU genauer anzusehen. Das 16-Zoll-Modell wird schneller und leiser sein.

Der M1 Max und der M1 Pro zeigten keinen signifikanten Unterschied in den Testergebnissen. Wenn Sie Entwickler sind, lohnt es sich, die Max-Version nur zu kaufen, wenn Sie 64 GB RAM benötigen oder mehr Bedürfnisse als die Entwicklung haben, wie z. B. Videobearbeitung oder die Arbeit mit 3D-Grafiken. Und es lohnt sich, nur ein 16-Zoll-Modell zu kaufen – die 14-Zoll-GPU hat eine niedrigere FPS, und der Prozessor wird viel früher heruntergefahren und wird viel lauter, wenn er überhitzt. Denken Sie auch daran, dass das 14-Zoll-Modell einen kleineren Akku hat, und selbst wenn Sie nichts Kompliziertes tun, ist die Akkulaufzeit im Vergleich zum 16-Zoll-Modell kürzer.

Ich würde gerne weitermachen und die Kompilierungsleistung auf High-End-Prozessoren von AMD und Intel vergleichen, aber es gibt immer noch keine Möglichkeit, dies zu tun. Die Tests habe ich bereits gemacht Ryzen 5950X mit Linux, und es ist extrem schnell! Die erste synthetische Waage für I9 12900HK sie versprechen! Aber das ist das Thema für einen anderen Artikel …

Erste Schritte mit ConstraintLayout in Jetpack Compose | von Shrey Sindher | Januar 2022

Shrey Sindher
Autor des Fotos Hal Gatewood er Unsplash

Jetpack Compose ist ein moderner Satz von Tools für Android zum Erstellen einer nativen Benutzeroberfläche. Vereinfacht und beschleunigt die Entwicklung der Benutzeroberfläche auf Android. Beleben Sie Ihre App schnell mit weniger Code, leistungsstarken Tools und intuitiven Kotlin-APIs.

Ich habe kürzlich Jetpack Compose gelernt und fast sofort den Wahnsinn dahinter erkannt. Mit Compose können Sie im Vergleich zur Verwendung von Android View mit weniger Code mehr erreichen: Schaltflächen, Listen oder Animationen – was auch immer Sie tun müssen, Sie müssen jetzt weniger Code schreiben.

Ich habe ConstraintLayout oft in meinen Projekten verwendet. Als ich zu Compose wechselte, hatte ich natürlich das Bedürfnis, es auch hier zu erkunden. Hier sind also die Entwürfe, die wir umsetzen werden:

Inspiration: https://proandroiddev.com/designing-complex-ui-using-android-constraintlayout-cb0606823da0

In diesem Leitfaden behandeln wir Folgendes zu ConstraintLayout:

  1. Grundlagen
  2. Richtlinien
  3. Barrieren
  4. Ketten
  1. Öffnen Sie Android Studio und klicken Sie auf Neues Projekt.
  2. Wählen Leeren Sie die Montageaktivität. Klicke auf Nächste.

3. Geben Sie Ihrem Projekt den passenden Namen und klicken Sie auf Beenden.

4. Wenn das Projekt vollständig geladen ist, gehen Sie zur Gradle-Datei auf Anwendungsebene und darunter Sucht, hinzufügen:

implementation "androidx.constraintlayout:constraintlayout-compose:1.0.0"

5. Synchronisieren Sie Gradle-Projektdateien.

gehen MainActivity.kt und ersetzen Sie den Code durch:

Erstellen Sie eine neue Klasse: MovieBookingScreen.kt. Und fügen Sie den folgenden Code hinzu:

Hier erstellen wir zunächst eine grundlegende Compositing-Funktion mit nichts als a Surface ia ConstraintLayout die die gesamte Höhe und Breite abdeckt.

Zum Vergleich mit einem herkömmlichen XML-basierten ConstraintLayout weisen wir unseren Ansichten IDs zu und verwenden diese IDs dann, um andere Ansichten entsprechend einzuschränken. Und hier erstellen wir zuerst all diese Referenzen mit createRefs() Funktion und ordnen Sie diese dann unseren Komponenten zu.

Nehmen wir zunächst das Menüsymbol in der oberen linken Ecke. Wir gebrauchen constrainAs(reference) um dem Komponierten eine Referenz zuzuweisen. Und dann u constrainBlock, schreiben wir alle Einschränkungen. Im folgenden Beispiel weisen wir zu menuButton Unter Bezugnahme auf das kompatible Symbol definieren wir in constrainBlock seine Einschränkungen:

Anfang ich oben verbunden sein soll Eltern Anfang ich oben das heißt mit 16 dps-Margen

Anstelle des übergeordneten Elements können wir auf andere zusammengesetzte Referenzen verweisen.

Richtlinie

Die Richtlinien in ConstraintLayout sind unsichtbare Linien, die für Benutzer nicht sichtbar sind, aber Entwicklern dabei helfen, das Layout einfach zu gestalten und die Ansicht dieser Richtlinien einzuschränken, sodass das Design klarer und interaktiver sein kann.

Nehmen wir als Nächstes an, wir möchten eine Richtlinie auf 40 % erstellen und das Titelbild des Films zwischen der übergeordneten und der Richtlinie begrenzen. Wir möchten auch sicherstellen, dass die Breite und Höhe des Bildes 2: 3 betragen.

Wir können Folgendes tun, indem wir zuerst eine Richtlinie erstellen. (40 % werden als 0,4f übertragen). Wir können auch den absoluten Wert weitergeben dp. Dann definieren wir die Breite als Dimension.fillToConstraints das ist analog zum tunen android:layout_width=”0dp” . Wir verwenden, um das Verhältnis einzustellen aspectRatio Modifikator, wo wir das Verhältnis übertragen. Das ist wieder analog app:layout_constraintDimensionRatio=”2:3" .

Ebenso können wir andere Texte erstellen, die komponiert und begrenzt werden können.

Horizontale Verkettung

Eine Kette ist eine Gruppe von Ansichten, die durch bidirektionale Positionsbeschränkungen miteinander verbunden sind

Die Kette kann von 3 Arten sein:

  1. Spread: Ein Kettenstil, der die enthaltenen Layouts gleichmäßig verteilt.
  2. SpreadInside: Ein Kettenstil, bei dem die erste und die letzte Anordnung an die Beschränkungen an jedem Ende der Kette angehängt werden und der Rest gleichmäßig verteilt wird.
  3. Packed: Der Kettenstil, in dem die Zeitpläne enthalten sind, wird zusammengepackt und in der Mitte des verfügbaren Platzes platziert.
Macht einen Teil unseres Looks aus

Als Nächstes erstellen wir für die Besetzungslinie zunächst ein ConstraintLayout, fügen unsere zusammengesetzten hinzu und führen sie dann mit zusammen createHorizontalChain(). Außerdem ist jedes Bild, das zusammengesetzt werden kann, durch die Angabe eines Verhältnisses von begrenzt 1:1 um eine quadratische Form beizubehalten.

Barriere

Die Barriere verweist auf mehrere Widgets als Eingabe und erstellt eine virtuelle Richtlinie basierend auf dem extremsten Widget auf der angegebenen Seite. Beispielsweise wird die linke Barriere links von allen referenzierten Ansichten ausgerichtet.

Eine Barriere kann wie unten gezeigt einfach erstellt werden, indem Sie zu den Ansichten gehen. Hier schaffen wir die untere Barriere, um unter dem Titelbild und unserem Gussbehälter Orientierung zu bekommen. In ähnlicher Weise können wir eine obere, untere, anfängliche und endgültige Barriere erstellen.

val barrier = createBottomBarrier(coverImage, castContainer)

Als nächstes begrenzen wir den Text der Beschreibung unterhalb der Barriere. Damit sind wir mit der oberen Hälfte unseres Looks fertig 🎉. Jetzt bleibt uns die untere Hälfte des Bildschirms.

Teilen Sie die untere Hälfte des Bildschirms in 3 Teile:

  1. Kalenderleiste
  2. Details zum Kino
  3. Schaltfläche “Tickets buchen”.

Erstens kann ein grauer Hintergrund implementiert werden, indem eine einfache zu komponierende Oberfläche hinzugefügt und ihr eine graue Farbe gegeben wird.

1. Kalenderleiste

Die Kalenderleiste kann wiederum in drei Teile unterteilt werden: Voter, Datumsreihenfolge und Tagesreihenfolge.

Zuerst erstellen wir Text Composables für Tagesreihen und begrenzen Sie sie mit einer horizontalen Kette, um sie gleichmäßig über die Breite des Bildschirms zu verteilen. Dann erstellen wir Text Compoasables für die Datumslinie und begrenzen jedes Datum auf den entsprechenden Tag (Start und Ende) und das vorherige Datum (oben und unten), etwa so:

Jetzt kommt der interessante Teil. Wir erstellen zwei für die Datumsauswahl Surface zusammensetzbar. Ein weißer Streifen, der den Haupthintergrund darstellt, und der andere schwarze Streifen, der auf die weiße Fläche beschränkt ist. Da wir nun möchten, dass die Datumsauswahl dynamisch ist und sich zum ausgewählten Datum bewegt, speichern wir sie im Status, anstatt die Einschränkungen für den Beginn und das Ende des ersten Tages fest zu codieren. Wann immer wir also den Wert eines Zustands ändern, a recomposition wird ausgeführt, und unsere Datumsauswahl ändert ihre Grenzen entsprechend.

Sehen Sie sich als Beispiel den Composable-Clip unten aus dem Text „Montag“ an. U clickable Block ändern wir den Wert der Einschränkung des Datumsauswahlbereichs.

2. Kinodetails

Der Name des Kinos und die Entfernung können als zwei zusammengesetzte Texte betrachtet werden, die in der Mitte des verfügbaren Raums zwischen Kalenderleiste und Schaltfläche verbunden sind. Also erstellen wir einen ConstraintLayout-Compiler neu, der den gesamten verfügbaren Platz einnimmt, und verknüpfen beide Texte, die kompiliert werden können, mit VerticalChainBeibehaltung des Kettenstils als Packed.

3. Schaltfläche „Tickets buchen“.

Dies ist nur eine einfache Schaltfläche, die mit Text komponiert werden kann, der darin komponiert werden kann. Es ist auf die Unterseite des Elternteils begrenzt und so konzipiert, dass es die gesamte Breite einnimmt.

Und das ist es 😎

Folgendes haben wir erreicht:

Hier ist der vollständige Code MovieBookingScreen.kt für ihre referenz:

Danke fürs Lesen. Ich würde gerne alle Ihre Probleme besprechen und lösen. Wenn dir der Artikel gefallen hat, applaudiere und teile ihn 🙃

Kotlin Multiplatform Mobile und So teilen Sie ViewModel: Ein Architekturvorschlag Lähde: Federico Torres | Januar 2022

  • iOS und Android: Diese Module enthalten iOS- und Android-Anwendungen (Xcode- und Android Studio-Projekte). Der Großteil des Codes sollte nur aus SwiftUI und ComposeUI bestehen.
  • Kotlin teilt den Code: Dies ist ein Modul, das das KMM-Projekt enthält, hier werden wir unsere Geschäfts- und Präsentationslogik implementieren. Der Kern unserer App wird also hier sein.
  • Zwiebel: Dies ist die KMM-Bibliothek, die ich erstellt habe und die wir als Abhängigkeit zu unserem gemeinsamen Code hinzufügen werden.

Bogen ist eine kleine und leichtgewichtige Kotlin-Multiplattform-Bibliothek, die uns bei der Architektur mobiler Anwendungen hilft, sie basiert auf der Spotify Mobius-Bibliothek, aber anstatt sich auf RxJava zu verlassen, verlässt sie sich auf Roots, SharedFlow ich StateFlow

Wir werden die grundlegenden Konzepte der Bibliothek wiederholen, ich werde einige Themen auslassen, wie z Veranstaltungen und Umgang mit Fehlern nur der Einfachheit halber.

Hauptmerkmale:

  • Fluss in eine Richtung
  • Einfache Zustandsverwaltung
  • Jetpack-Unterstützung ViewModel (unter Verwendung des tatsächlichen / erwarteten Protokolls)

Anwendungsablauf mit Arch

Dieses Diagramm zeigt, wie die Komponenten in dieser Architektur interagieren, schauen wir uns jede von ihnen an und geben eine kurze Erklärung:

  • Aktionen: action ist eine Anforderung, den Status der Anwendung (oder eines Teils davon) zu ändern, Aktionen werden von iOS- und Android-Code gesendet.
  • Aktualisieren: Sie können sich das Update als reine Funktion vorstellen, die die Aktion und den aktuellen Zustand entgegennimmt und den neuen Zustand wiederherstellt. Neben der Änderung der Bedingung hat Updater Ich kann senden Nebenwirkungen ich Veranstaltungen
  • Nebenwirkungen: Im Allgemeinen ist ein Nebeneffekt eine Operation, die einen Zustand außerhalb seiner lokalen Umgebung in unserer Architektur ändert Nebenwirkungen sind Operationen wie HTTP-Anforderungen, Datenbanktransaktionen oder beliebige I/O-Operationen.
  • Prozessor: der Prozessor ist das Element, das er verarbeitet Nebenwirkungen ist für die Ausführung einer Datenbanktransaktion, einer HTTP-Anfrage oder irgendetwas Empfangenem verantwortlich Nebenwirkung solltest. Wenn die Aufgabe abgeschlossen ist (erfolgreich oder nicht), sendet der Prozessor eine neue Aktion um den Status zu aktualisieren.

Lassen Sie uns in den eigentlichen Code eintauchen, wir werden eine sehr einfache Anwendung für Filme mit dieser vorgeschlagenen Architektur schreiben film db api

Schritte

  • Definiere den Zustand
  • Definieren Aktionen
  • Nebenwirkungen definieren
  • Erstellen Sie ein Ansichtsmodell
  • Implementieren Updater
  • Implementieren Prozessor
  • Beobachten Sie die Zustandsänderungen in den Ansichten SwiftUI und ComposeUI.

Mit Ausnahme des letzten werden alle diese Schritte in unserem gemeinsamen Valley-Modul implementiert.

Zustand

Für diese App müssen wir nur zwei Dinge in unserem Zustand speichern:

  • Liste der Filme
  • Ausgewählter Film, da wir die Details des Films anzeigen möchten, wenn der Benutzer ihn in der Liste berührt.

Aktionen

Wir brauchen nur drei Aktionen:

Die ersten beiden Aktionen werden an Benutzerereignisse gesendet (z. B. Berühren oder Öffnen einer App), die letzte wird gesendet Prozessor wenn wir eine Antwort von der API erhalten.

Nebenwirkungen

Wir haben eine Single Nebenwirkung: Holen Sie sich eine Liste von Filmen. Wir könnten festlegen, auf welcher Reihe von Dispatchern oder Cornets wir laufen möchten Nebenwirkungwird standardmäßig verwendet viewModelScope auf Android und benutzerdefinierter Bereich auf iOS

Updater

Hier entscheiden wir wie Wir wollen den Zustand basierend auf der empfangenen Aktion ändern, wir müssen eine Klasse erstellen, die implementiert Updater Schnittstelle, die nur eine Methode hat, die einen neuen Zustand und (vielleicht) einen neuen zurückgibt Nebenwirkungen eingewickelt in a Nächste Objekt.

Beachte das Filme abrufen () Methode gibt a zurück NächstesErgebnis ein Objekt, das a enthält Nebenwirkung, besonders Filme laden eins. So Prozessor werden über diesen neuen Beitrag benachrichtigt Nebenwirkung und führt eine HTTP-Anforderungsoperation aus

Prozessor

Jetzt müssen wir umsetzen Prozessor Schnittstelle die eine einzigartige Suspend-Funktion hat, die die Aktion wiederherstellt.

TMDApi Klasse ist dafür verantwortlich, HTTP-Anforderungen zu erstellen, um Filme abzurufen, und json-Antworten in eine Reihe von Filmen umzuwandeln. Es ist uns egal, wie es implementiert wird, aber wenn Sie neugierig sind, können Sie sich jederzeit das vollständige Democode-Repository unter der Haube ansehen von Ktor verwendet.

Sobald wir die Liste der Filme erhalten haben, senden wir einfach eine Aktion, um sie im Status zu speichern.

ViewModel

Wir haben es fast geschafft, jetzt müssen wir all diese Klassen, die wir implementiert haben, zusammenführen ViewModel die erben müssen ArchViewModel

Ja! das ist unser ganzer Code ViewModel braucht.

Beachten Sie, dass wir den Anfangszustand und den Anfangseffekt eingestellt haben.

Beobachten Sie Änderungen in der Situation

Der letzte Schritt, beobachten Sie einfach die Zustandsänderung! aber wie?

ArchViewModel entlarvt a Fließen die alle Zustandsänderungen ausgibt, also müssen wir sie nur sammeln.

Auf Android sammeln a Fließen ist einfach, aber nicht so einfach auf iOS, daher implementiert die Arch-Bibliothek Folgendes FlowWrapper

Wenn Sie eine bessere Lösung für dieses Problem des Sammelns von Kotlina haben Fließt aus Swift-Code, ich würde ihn gerne lesen.

Schauen wir uns den endgültigen Code an:

Und das ist alles! Denken Sie daran, dass es sich um einen vollständigen Code handelt Hier

Aus der Perspektive von Android-Entwicklern ist die Entwicklungserfahrung mit KMM (und diesem Ansatz) so ziemlich die gleiche wie bei der reinen Entwicklung von Android. Aber für iOS-Entwickler ist die Erfahrung nicht so gut wie für Android-Entwickler, auf iOS müssen wir uns um Dinge wie Gleichzeitigkeit kümmern, Unveränderlichkeitsausnahme und andere Inkompatibilitätsprobleme, die auftreten können.

Jetbrains ist sich dieser Probleme bewusst und arbeitet daran, das Erlebnis für iOS-Entwickler zu verbessern. Am 31. August 2021 haben sie eine Vorschauversion veröffentlicht neuer Speichermanager Dies sollte uns von der Notwendigkeit befreien, Artikel einzufrieren.

Diese Architektur eignet sich hervorragend für Teams, die große native Apps für iOS und Android verwalten, insbesondere wenn die Entwickler in Ihrem Team über Kenntnisse beider Plattformen verfügen.

Normalerweise haben iOS- und Android-Versionen derselben Anwendung unterschiedliche Architekturen wie MVC, MVP, MVVM, VIPER oder Redux. Die Beibehaltung derselben Architektur auf beiden Plattformen hat viele Vorteile, erfordert weniger Arbeit und hilft, Aufgaben besser auf Ihr Team zu verteilen, sogar Entwickler können dies tun sehr einfach auf beiden Plattformen funktionieren.

Alles in allem glaube ich nicht, dass es die perfekte Lösung gibt, jedes Team muss sich überlegen, welche für seine Bedürfnisse am besten geeignet ist.

Jetzt in Android #53. Willkommen bei Now in Android, Ihrem dauerhaften … | Lähde: Meghan Mehta | Android-Entwickler Dezember 2021

Er macht Illustrationen Virginia Poltrack

Willkommen bei Now in Android, Ihrem ständigen Leitfaden für Neues und Wichtiges in der Welt der Android-Entwicklung. Wenn das Jahr 2021 näher rückt, lassen Sie uns über einige der großartigen Dinge nachdenken, die wir dieses Jahr für Android getan haben.

Wir veröffentlicht Android 12 und schob es an Android-Open-Source-Projekt (AOSP). Wir haben eine neue Designsprache namens Material Sie. Wir haben die CPU-Zeit reduziert, die von grundlegenden Systemdiensten verwendet wird, hinzugefügt Fähigkeiten der Leistungsklasseund hinzugefügt neue Funktionen zur Verbesserung der Leistung. Benutzer haben mehr Kontrolle über ihre Privatsphäre mit Datenschutz-Dashboard und andere neue Sicherheit und Privatsphäre Eigenschaften. Wir haben die Benutzererfahrung mit a verbessert Einheitliche Rich-Content-Einfügungs-APIs, Kompatible MedientranscodierungEinfacher Unschärfe und Effekte, AVIF-Bildunterstützung, verbesserte HaptikNeu Kameraeffekte / Fähigkeiten, verbessertes ursprüngliches Debugging, Unterstützung für abgerundete Ecken des Bildschirms, Spielen Sie während des Downloadsich Spielmodus-APIs.

Android 12L befindet sich ebenfalls in der Beta-Phase, wodurch Android 12 auf großen Bildschirmen noch besser wird. Enthält Tools für intuitiveres Multitasking, Kompatibilitätsverbesserungen und mehr! Probieren Sie es noch heute aus.

Jetpack komponierenist das moderne, originelle UI-Tool von Android geworden stabil und bereit für die Inbetriebnahme. Dass interoperiert mit Ihrer bestehenden Anwendung, integriert mit vorhandene Jetpack-BibliothekenAnschlüsse Material Design mit direkte Thematisierungunterstützt Listen mit Lazy-Komponenten mit einer minimalen Vorlage und hat eine leistungsstarke, erweiterbare Animationssystem. Weitere Informationen zum Arbeiten mit Compose finden Sie unter Stellen Sie einen Lernpfad zusammen und sehen, wohin wir in zukünftigen Compose-Editionen gehen Erstellen Sie eine Straßenkarte.

In diesem Jahr hat das Android Training Team die letzten vier neuen Einheiten veröffentlicht Grundlagen von Android in Kotlin.

  • Einheitsabdeckungen 3 Navigation wo Sie lernen, durch verschiedene Bildschirme innerhalb Ihrer App zu navigieren, sie einzugeben und zurückzukehren.
  • Einheitsabdeckungen 4 Internetverbindung. Sie schreiben asynchronen Code, lernen HTTP und REST kennen, um Daten aus dem Internet abzurufen, und verwenden die Coil-Bibliothek, um Bilder in Ihrer Anwendung anzuzeigen.
  • Einheit 5 umfasst Datenkonsistenz Hier erfahren Sie, wie Sie Daten auf dem Gerät speichern, was Teil der Gewährleistung einer reibungslosen und konsistenten Benutzererfahrung ist, auch bei Netzwerkausfällen.
  • Einheitsabdeckungen 6 Arbeitsmanager wo Sie die Android Jetpack WorkManager-API verwenden, um Hintergrundarbeiten zu planen, die auch dann weiter funktionieren, wenn die App geschlossen oder das Gerät neu gestartet wird.

Wir hatten ein fantastisches Jahr für MAD Skills und veröffentlichten mehrere Serien von Videos und Blogs, die viele wichtige Themen abdecken:

  • Kotlin und Jetpack – Erlernen Sie die Grundlagen von Jetpack KTX-Bibliotheken, wie Sie Rückrufe mit Rollen und Flow vereinfachen und wie Sie Room / WorkManager-APIs verwenden und testen.
  • Bewegungslayout – Erfahren Sie, wie Sie MotionLayout und sein Designtool verwenden, um reichhaltige, animierte Erlebnisse zu erstellen.
  • Arbeitsmanager – Erfahren Sie, wie Sie kritische Hintergrundarbeiten mit WorkManager planen: von der grundlegenden Verwendung über Threads bis hin zu benutzerdefinierten Konfigurationen und mehr.
  • Navigation – Lernen Sie die Grundlagen der Navigationskomponente, spezifische Funktionen von Tools und APIs zum Erstellen von und Navigieren zu Zielen.
  • Leistung – Erfahren Sie mehr über die Verwendung von System-Tracking und Sampling-Profiling zum Debuggen von Anwendungsleistungsfehlern.
  • Griff – Erfahren Sie, wie Sie Hilt hinzufügen und verwenden, um Ihrer Android-App Sucht hinzuzufügen, Best Practices zum Testen mit Hilt und erweiterte Inhalte.
  • Paging – Erlernen Sie die Grundlagen von Seiten, von grundlegenden Typen bis hin zur Verknüpfung mit Ihren UI-Elementen.
  • Gradl – Erfahren Sie, wie Sie Ihre Version konfigurieren, den Build-Prozess an Ihre Bedürfnisse anpassen und wie Sie Ihre eigenen Add-Ons schreiben, um Ihre Version weiter zu erweitern.

Weitere Inhalte finden Sie hier Playlist MAD-Fähigkeiten auf Youtube, Artikel auf Mediumoder diese praktische Landingpage es deutet auf all das hin.

Dieses Jahr hatten wir Google I/O ich Android Dev Summitvirtuell und kostenlos für alle!

Wir haben Updates zu I/O in veröffentlicht Jetpack, Komponieren, Android Studio-Tools, Große Bildschirme, Betriebssystem tragen, Testen, und mehr! Alles nachholen Android-Videos sind I/O!!

Auf dem Android Dev Summit haben wir Updates zu gepostet Privatsphäre und Sicherheit, große Bildschirme, Android 12, Google Play und Spiele, Bauen Sie über den Bildschirm, Jetpack komponieren, Moderne Android-Entwicklung und mehr. Schau dir alles an Videos von ADS!!

Wir haben neue veröffentlicht Leitfäden zur Anwendungsarchitektur, Carry Jetpack OS-Bibliotheken war stabil, Hilt wurde stabilwir lassen los Entwicklungskit für Android-Spielehaben wir eine erstellt Videoserie zur Barrierefreiheiter ließ los Bibliotheks-App für Android für Autos und vieles mehr.

Aktuelle Android-Inhalte finden Sie in unserer Bloggen, Mittel, Youtube Kanalich Podcast.

Vielen Dank, dass Sie sich engagieren, großartige Apps erstellen, Feedback geben und Teil unserer weltweiten Entwickler-Community sind. Wir werden 2022 mit weiteren Android-Updates zurück sein! 😍😍😍