Mastering Gradle für Android: Gradle Aufgaben und Kotlin

Autor: Lewis Jackson
Erstelldatum: 11 Kann 2021
Aktualisierungsdatum: 1 Juli 2024
Anonim
Mastering Gradle für Android: Gradle Aufgaben und Kotlin - Apps
Mastering Gradle für Android: Gradle Aufgaben und Kotlin - Apps

Inhalt


Anstelle von Java, XML oder Kotlin verwenden diese Gradle-Builddateien die Groovy-basierte domänenspezifische Sprache (DSL). Wenn Sie mit Groovy nicht vertraut sind, werden wir uns jede dieser Gradle-Build-Dateien einzeln ansehen. Am Ende dieses Artikels werden Sie also mit dem Lesen und Schreiben von einfachem Groovy-Code vertraut sein.

Gradle zielt darauf ab, Ihnen das Leben zu erleichtern, indem Sie eine Reihe von Standardeinstellungen bereitstellen, die Sie häufig mit minimaler manueller Konfiguration verwenden können. Wenn Sie bereit sind, Ihr Projekt zu erstellen, drücken Sie einfach die Schaltfläche "Ausführen" von Android Studio, und Gradle startet den Erstellungsprozess für dich.

Wenn die Standardeinstellungen von Gradle nicht ganz Ihren Anforderungen entsprechen, können Sie den Erstellungsprozess anpassen, konfigurieren und erweitern und die Gradle-Einstellungen sogar optimieren, um ganz bestimmte Aufgaben auszuführen.


Da die Gradle-Skripte in eigenen Dateien enthalten sind, können Sie den Erstellungsprozess Ihrer Anwendung jederzeit ändern, ohne den Quellcode Ihrer Anwendung berühren zu müssen. In diesem Tutorial werden wir den Erstellungsprozess mithilfe von Varianten, Erstellungsvarianten und einer benutzerdefinierten Gradle-Aufgabe modifizieren - und das alles ohne je Berühren Sie unseren Anwendungscode.

Erkunden der Gradle-Builddateien

Jedes Mal, wenn Sie ein Projekt erstellen, generiert Android Studio dieselbe Sammlung von Gradle-Builddateien. Auch wenn Sie ein vorhandenes Projekt in Android Studio importieren, wird es immer noch Erstellen Sie genau dieselben Gradle-Dateien und fügen Sie sie Ihrem Projekt hinzu.

Um ein besseres Verständnis von Gradle und der Groovy-Syntax zu erhalten, schauen wir uns die einzelnen Gradle-Build-Dateien von Android einzeln an.

1. settings.gradle

In der Datei settings.gradle definieren Sie alle Module Ihrer Anwendung mit dem Schlüsselwort "include" nach Namen. Wenn Sie beispielsweise ein Projekt hätten, das aus einer "App" und einem "SecondModule" besteht, würde Ihre settings.gradle-Datei ungefähr so ​​aussehen:


include: app,: secondmodule rootProject.name = MyProject

Abhängig von der Größe Ihres Projekts kann diese Datei erheblich länger sein.

Während des Erstellungsprozesses überprüft Gradle den Inhalt der Datei settings.gradle Ihres Projekts und ermittelt alle Module, die in den Erstellungsprozess einbezogen werden müssen.

2. build.gradle (Projektebene)

Die build.gradle-Datei auf Projektebene befindet sich im Stammverzeichnis Ihres Projekts und enthält Einstellungen, auf die angewendet wird alle Ihre Module (von Gradle auch als „Projekte“ bezeichnet).

Sie sollten diese Datei verwenden, um Plugins, Repositorys, Abhängigkeiten und Konfigurationsoptionen zu definieren, die für jedes Modul in Ihrem Android-Projekt gelten. Wenn Sie Gradle-Aufgaben in der build.gradle-Datei auf Projektebene definieren, ist es dennoch möglich, diese Aufgaben für einzelne Module zu überschreiben oder zu erweitern, indem Sie die entsprechenden bearbeiten Modulebene build.gradle Datei.

Eine typische build.gradle-Datei auf Projektebene sieht folgendermaßen aus:

buildscript {repositories {google () jcenter ()} dependencies {classpath com.android.tools.build:gradle:3.5.0-alpha06 // HINWEIS: Platzieren Sie Ihre Anwendungsabhängigkeiten nicht hier. sie gehören // in das einzelne Modul build.gradle files}} allprojects {repositories {google () jcenter ()}} task clean (Typ: Delete) {delete rootProject.buildDir}

Diese build.gradle-Datei auf Projektebene ist in die folgenden Blöcke unterteilt:

  • Buildscript. Dies enthält Einstellungen, die zum Ausführen des Builds erforderlich sind.
  • Repositories. Gradle ist dafür verantwortlich, die Abhängigkeiten Ihres Projekts zu lokalisieren und in Ihrem Build verfügbar zu machen. Da jedoch nicht alle Abhängigkeiten aus demselben Repository stammen, müssen Sie alle Repositorys definieren, nach denen Gradle suchen soll, um die Abhängigkeiten Ihres Projekts abzurufen.
  • Abhängigkeiten. Dieser Abschnitt enthält Ihre Plugin-Abhängigkeiten, die heruntergeladen und in Ihrem lokalen Cache gespeichert werden. Du solltest nicht Definieren Sie alle Modulabhängigkeiten innerhalb dieses Blocks.
  • Alle Projekte. Hier definieren Sie die Repositorys, die verfügbar sein sollen alle der Module Ihres Projekts.

3. build.gradle (Modulebene)

Dies ist die build.gradle-Datei auf Modulebene, die in jedem Modul Ihres Projekts vorhanden ist. Wenn Ihr Android-Projekt aus mehreren Modulen besteht, besteht es auch aus mehreren build.gradle-Dateien auf Modulebene.

Jede build.gradle-Datei auf Modulebene enthält den Paketnamen, den Versionsnamen und den Versionscode Ihres Projekts sowie das minimale und das Ziel-SDK für dieses bestimmte Modul.

Eine build.gradle-Datei auf Modulebene kann auch einen eigenen Satz von Buildanweisungen und Abhängigkeiten haben. Wenn Sie zum Beispiel eine Anwendung mit einer Wear OS-Komponente erstellen, besteht Ihr Android Studio-Projekt aus einem separaten Smartphone- / Tablet-Modul und einem Wear-Modul. Da es sich um ganz andere Geräte handelt, unterscheiden sich diese Module erheblich voneinander Abhängigkeiten!

Eine einfache build.gradle-Datei auf Modulebene sieht normalerweise so aus:

Wende das Plugin an: com.android.application android {compileSdkVersion 28 defaultConfig {applicationId "com.jessicathornsby.speechtotext" minSdkVersion 23 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.Android.AndroidEnotifyFunnerEn getDefaultProguardFile (proguard-android-Optimize.txt), proguard-rules.pro}}} Abhängigkeiten {Implementierung fileTree (dir: libs, include:) Implementierung androidx.appcompat: appcompat: 1.0.2 Implementierung androidx.constraintlayout: constraintlayout: 1.1. 3 testImplementation junit: junit: 4.12 androidTestImplementation androidx.test.ext: junit: 1.1.0 androidTestImplementation androidx.test.espresso: espresso-core: 3.1.1}

Sehen wir uns jeden dieser Abschnitte genauer an:

  • Plugin anwenden. Dies ist eine Liste der Plugins, die zum Erstellen dieses Moduls erforderlich sind. Das Plugin com.android.application ist erforderlich, um den Android-spezifischen Erstellungsprozess einzurichten. Dies wird also automatisch hinzugefügt.
  • Android. Hier sollten Sie alle plattformspezifischen Optionen des Moduls platzieren.
  • compileSdkVersion. Dies ist die API-Ebene, mit der dieses Modul kompiliert wird. Sie können keine Funktionen aus einer API verwenden, die diesen Wert überschreitet.
  • buildToolsVersion. Dies gibt die Version des Compilers an. In Gradle 3.0.0 und höher ist buildToolsVersion optional. Wenn Sie keinen buildToolsVersion-Wert angeben, verwendet Android Studio standardmäßig die neueste Version von Build Tools.
  • defaultConfig. Dies enthält Optionen, die auf alle Buildversionen Ihrer App angewendet werden, z. B. auf Ihre Debug- und Release-Builds.
  • applicationId. Dies ist die eindeutige Kennung Ihrer Anwendung.
  • minSdkVersion. Dieser Parameter definiert die niedrigste API-Ebene, die dieses Modul unterstützt.
  • targetSdkVersion. Dies ist die maximale API-Stufe, mit der Ihre Anwendung getestet wurde. Im Idealfall sollten Sie Ihre Anwendung mit der neuesten API testen. Dies bedeutet, dass der targetSdkVersion-Wert immer dem compileSdkVersion-Wert entspricht.
  • versionCode. Dies ist ein numerischer Wert für Ihre Anwendungsversion.
  • versionName. Dies ist eine benutzerfreundliche Zeichenfolge, die Ihre Anwendungsversion darstellt.
  • buildTypes. Standardmäßig unterstützt Android zwei Build-Typen: Debug und Release. Mit den Blöcken "Debug" und "Release" können Sie die typspezifischen Einstellungen Ihrer Anwendung festlegen.
  • Abhängigkeiten. Hier definieren Sie alle Bibliotheken, von denen dieses Modul abhängig ist.

Festlegen der Abhängigkeiten Ihres Projekts: Lokale Bibliotheken

Sie können Ihren Android-Projekten zusätzliche Funktionen zur Verfügung stellen, indem Sie eine oder mehrere Projektabhängigkeiten hinzufügen. Diese Abhängigkeiten können lokal sein oder in einem Remote-Repository gespeichert werden.

Um eine Abhängigkeit von einer lokalen JAR-Datei zu deklarieren, müssen Sie diese JAR zum "libs" -Verzeichnis Ihres Projekts hinzufügen.

Anschließend können Sie die build.gradle-Datei auf Modulebene ändern, um eine Abhängigkeit von dieser Datei zu deklarieren. Zum Beispiel deklarieren wir hier eine Abhängigkeit von einer "Mylibrary" -JAR.

Implementierungsdateien (libs / mylibrary.jar)

Wenn Ihr "libs" -Ordner mehrere JARs enthielt, ist es möglicherweise einfacher, einfach anzugeben, dass Ihr Projekt von allen Dateien abhängt, die sich im "libs" -Ordner befinden. Beispiel:

Implementierung fileTree (dir: libs, include:)

Hinzufügen einer Build-Abhängigkeit: Remote-Repositorys

Befindet sich eine Bibliothek in einem Remote-Repository, müssen Sie die folgenden Schritte ausführen:

  • Definieren Sie das Repository, in dem sich diese Abhängigkeit befindet.
  • Deklarieren Sie die individuelle Abhängigkeit.

Verbindung zu einem Remote-Repository herstellen

Der erste Schritt besteht darin, Gradle mitzuteilen, welches Repository (oder welche Repositorys) überprüft werden muss, um alle Abhängigkeiten Ihres Projekts abzurufen. Beispielsweise:

Repositorys {google () jcenter ()}}

Hier stellt die Zeile "jcenter ()" sicher, dass Gradle das JCenter-Repository überprüft, ein freies öffentliches Repository, das bei bintray gehostet wird.

Wenn Sie oder Ihre Organisation ein persönliches Repository verwalten, sollten Sie alternativ die URL dieses Repositorys zu Ihrer Abhängigkeitserklärung hinzufügen. Wenn das Repository kennwortgeschützt ist, müssen Sie auch Ihre Anmeldeinformationen angeben. Beispiel:

repositories {mavenCentral () maven {// Konfigurieren Sie die Ziel-URL // url "http://repo.mycompany.com/myprivaterepo"} maven {credentials {Benutzername myUsername password myPassword} url "http://repo.mycompany.com / myprivaterepo "}

Wenn eine Abhängigkeit in mehreren Repositorys vorhanden ist, wählt Gradle die „beste“ Version dieser Abhängigkeit aus, basierend auf Faktoren wie dem Alter jedes Repositorys und der statischen Version.

Deklarieren einer Remoteabhängigkeit

Der nächste Schritt besteht darin, die Abhängigkeit in Ihrer build.gradle-Datei auf Modulebene zu deklarieren. Sie fügen diese Informationen unter Verwendung einer der folgenden Methoden zum Block "Abhängigkeiten" hinzu:

  • Implementierung. Dies ist eine normale Abhängigkeit, die Sie benötigen, wenn Sie Ihr Projekt erstellen. Eine "Implementierungsabhängigkeit" wird über vorhanden sein alle Ihre Builds.
  • Testimplementierung. Diese Abhängigkeit ist erforderlich, um die Testquelle Ihrer Anwendung zu kompilieren und JVM-basierte Tests auszuführen. Wenn Sie eine Abhängigkeit als "Testimplementierung" markieren, weiß Gradle, dass während eines normalen Builds keine Tasks für diese Abhängigkeit ausgeführt werden müssen, wodurch die Build-Zeit verkürzt werden kann.
  • Androidtestimplementierung. Dies ist eine Abhängigkeit, die erforderlich ist, wenn Tests auf einem Gerät ausgeführt werden. Das Espresso-Framework ist beispielsweise eine häufig verwendete "Android-Testimplementierung".

Wir definieren eine entfernte Abhängigkeit mit einem der oben genannten Schlüsselwörter, gefolgt von den Attributen für Gruppe, Name und Version der Abhängigkeit. Beispiel:

Abhängigkeiten {Implementierung fileTree (dir: libs, include:) Implementierung androidx.appcompat: appcompat: 1.0.2 Implementierung androidx.constraintlayout: constraintlayout: 1.1.3 testImplementation junit: junit: 4.12 androidTestImplementation androidx.test.ext: junit: 1.1.0 androidTestImplementation androidx.test.espresso: espresso-core: 3.1.1}

Generieren mehrerer APKs: So erstellen Sie Build-Varianten

Manchmal müssen Sie möglicherweise mehrere Versionen Ihrer Anwendung erstellen. Beispielsweise möchten Sie möglicherweise eine kostenlose und eine kostenpflichtige Version veröffentlichen, die einige zusätzliche Funktionen enthält.

Dies ist eine Erstellungsaufgabe, bei der Gradle Sie unterstützen kann. Sehen wir uns also an, wie Sie den Erstellungsprozess so ändern, dass aus einem einzigen Projekt mehrere APKs erstellt werden:

  • Öffnen Sie Ihre Datei "strings.xml" und löschen Sie die ursprüngliche Zeichenfolge für den Anwendungsnamen.
  • Definieren Sie als Nächstes die Namen der einzelnen Produktvarianten, die Sie erstellen möchten. In diesem Fall verwende ich:

Meine kostenlose App Meine bezahlte App

  • Öffnen Sie Ihre AndroidManifest.xml-Datei und ersetzen Sie android: label = "@ string / app_name" durch:

android: label = "$ {appName}"

  • Öffnen Sie Ihre build.gradle-Datei auf Modulebene und fügen Sie Folgendes zum "android" -Block hinzu:

flavorDimensions "mode" productFlavors {free {dimension "mode" applicationIdSuffix ".free" manifestPlaceholders =} paid {dimension "mode" applicationIdSuffix ".paid" manifestPlaceholders =}}

Lassen Sie uns zusammenfassen, was hier passiert:

  • geschmackAbmessungen. Das Android-Plugin erstellt Build-Varianten, indem Aromen aus verschiedenen Dimensionen kombiniert werden. Hier erstellen wir eine Geschmacksdimension, die aus "kostenlosen" und "kostenpflichtigen" Versionen unserer App besteht. Basierend auf dem obigen Code generiert Gradle vier Build-Varianten: paidDebug, paidRelease, freeDebug und freeRelease.
  • productFlavors. Dies gibt eine Liste von Geschmacksrichtungen und deren Einstellungen an, die im obigen Code "bezahlt" und "frei" sind.
  • Kostenlos / bezahlt. Dies sind die Namen unserer beiden Produktvarianten.
  • Abmessungen. Wir müssen einen "Dimension" -Parameterwert angeben; In diesem Fall verwende ich den Modus.
  • applicationIdSuffix. Da wir mehrere Versionen unserer App erstellen möchten, müssen wir jedem APK eine eindeutige App-ID zuweisen.
  • manifestPlaceholders. Jedes Projekt verfügt über eine einzige Manifest-Datei, die wichtige Informationen zur Konfiguration Ihres Projekts enthält. Wenn Sie mehrere Build-Varianten erstellen, möchten Sie in der Regel einige dieser Manifest-Eigenschaften zum Zeitpunkt des Builds ändern. Mit den Gradle-Build-Dateien können Sie eindeutige Manifest-Einträge für jede Build-Variante angeben, die dann zur Build-Zeit in Ihr Manifest eingefügt werden. Im obigen Code ändern wir den Wert für "appName" abhängig davon, ob Gradle die kostenlose oder die kostenpflichtige Version unserer App erstellt.

Erstellen einer benutzerdefinierten Gradle-Aufgabe

Manchmal müssen Sie den Erstellungsprozess mithilfe von Gradle anpassen Aufgaben.

Eine Task ist eine benannte Sammlung von Aktionen, die Gradle beim Ausführen eines Builds ausführt, z. B. beim Generieren eines Javadoc. Gradle unterstützt standardmäßig eine Vielzahl von Aufgaben, Sie können jedoch auch benutzerdefinierte Aufgaben erstellen. Dies ist hilfreich, wenn Sie bestimmte Build-Anweisungen berücksichtigen.

In diesem Abschnitt erstellen wir eine benutzerdefinierte Gradle-Aufgabe, die alle Build-Varianten unseres Projekts (paidDebug, paidRelease, freeDebug und freeRelease) durchläuft, einen Datums- und Zeitstempel erstellt und diese Informationen dann an jede generierte APK anfügt.

Öffnen Sie die build.gradle-Datei auf Modulebene und fügen Sie Folgendes hinzu:

task addDateAndTime () {// Alle Ausgabevarianten durchlaufen // android.applicationVariants.all {variant -> // Alle APK-Dateien durchlaufen // variant.outputs.all {output -> // Eine Instanz von erstellen Das aktuelle Datum und die aktuelle Uhrzeit im angegebenen Format // def dateAndTime = new Date (). format ("jjjj-MM-tt: HH-mm") // Hängen Sie diese Informationen an den Dateinamen des APK an // def fileName = variant. name + "_" + dateAndTime + ".apk" output.outputFileName = fileName}}}

Als nächstes müssen wir Gradle davon erzählen wann es sollte diese Aufgabe ausführen. Während eines Builds identifiziert Gradle alles, was heruntergeladen werden muss, sowie alle Aufgaben, die ausgeführt werden müssen, und ordnet sie in einem gerichteten azyklischen Diagramm (Directed Acyclic Graph, DAG) an. Gradle führt dann alle diese Aufgaben gemäß der in seiner DAG definierten Reihenfolge aus.

Für meine App verwende ich die "whenReady" -Methode, mit der sichergestellt wird, dass unsere Aufgabe aufgerufen wird, sobald die DAG ausgefüllt wurde und Gradle bereit ist, mit der Ausführung ihrer Aufgaben zu beginnen.

Fügen Sie Ihrer build.gradle-Datei auf Modulebene Folgendes hinzu:

// Diese Aufgabe ausführen // gradle.taskGraph.whenReady {addDateAndTime}

Lassen Sie uns unsere benutzerdefinierte Aufgabe stellen und Testen Sie unseren Buildvariantencode, indem Sie dieses Projekt mit einem Gradle-Befehl erstellen.

Erstellen Sie Ihr Projekt mit dem Gradle-Wrapper

Sie geben Gradle-Befehle mit dem Gradle-Wrapper („gradlew“) aus. Dieses Skript ist die bevorzugte Methode zum Starten eines Gradle-Builds, da die Ausführung des Builds von Ihrer Gradle-Version unabhängig ist. Diese Trennung kann hilfreich sein, wenn Sie mit anderen zusammenarbeiten, auf denen möglicherweise nicht dieselbe Version von Gradle installiert ist.

Wenn Sie Ihre Gradle-Wrapper-Befehle absetzen, verwenden Sie "gradlew" für Unix-ähnliche Betriebssysteme, einschließlich macOS, und "gradlew.bat" für Windows. Ich habe einen Mac, daher verwende ich "gradlew" -Befehle.

Sie können Gradle-Befehle in Android Studio ausführen:

  • Wählen Sie in der Android Studio-Symbolleiste „Ansicht> Tools Windows> Terminal“. Dies öffnet ein Terminalfenster am unteren Rand des IDE-Fensters.
  • Geben Sie den folgenden Befehl in das Terminal ein:

./gradlew bauen

Android Studio sollte ungefähr so ​​aussehen:

  • Drücken Sie die Eingabetaste auf Ihrer Tastatur. Gradle erstellt jetzt Ihr Projekt.

Gradle speichert alle generierten APKs im Verzeichnis app / build / output / apk Ihres Projekts. Navigieren Sie also zu diesem Verzeichnis. Der Ordner „APK“ sollte mehrere Ordner und Unterordner enthalten. Stellen Sie sicher, dass Gradle für jede Build-Variante ein APK generiert hat und dass jeder Datei die richtigen Datums- und Zeitinformationen hinzugefügt wurden.

Welche anderen Gradle-Aufgaben sind verfügbar?

Zusätzlich zu den benutzerdefinierten Aufgaben, die Sie möglicherweise erstellen, unterstützt Gradle eine Liste vordefinierter Aufgaben. Wenn Sie neugierig sind, welche Aufgaben genau verfügbar sind, gehen Sie wie folgt vor:

  • Öffnen Sie das Android Studio-Terminalfenster, falls es noch nicht geöffnet ist (indem Sie in der Android Studio-Symbolleiste "Ansicht> Tools Windows> Terminal" auswählen).
  • Geben Sie Folgendes in das Terminal ein:

./gradlew -q Aufgaben

  • Drücken Sie die Eingabetaste auf Ihrer Tastatur.

Diese Aufgabe „Aufgaben“ wird nun ausgeführt, und nach einigen Augenblicken zeigt das Terminal eine Liste aller für dieses Projekt verfügbaren Aufgaben mit einer kurzen Beschreibung jeder Aufgabe an.

Gradle besser nutzen: Plugins hinzufügen

Gradle wird mit einer Reihe vorinstallierter Plugins ausgeliefert. Sie können Gradle jedoch durch Hinzufügen neuer Plugins erweitern. Diese Plugins stellen Ihren Android-Projekten neue Aufgaben zur Verfügung. Das Java-Plugin enthält beispielsweise Aufgaben, mit denen Sie Java-Quellcode kompilieren, Komponententests ausführen und eine JAR-Datei erstellen können, z. B. "compileJava", "compileText", "jar". "Javadoc" und "sauber".

Um ein Plugin anzuwenden, fügen Sie der build.gradle-Datei auf Modulebene die Deklaration "apply plugin" hinzu, gefolgt vom Namen des Plugins. Hier wenden wir zum Beispiel das Java-Plugin an:

Plugin anwenden: Java

Wenn Sie neugierig sind, welche Plugins verfügbar sind, besuchen Sie die Gradle-Pluginsuche, die eine umfassende Registrierung von Gradle-Plugins bietet.

Das Gradle Kotlin DSL

Standardmäßig schreiben Sie Ihre Gradle-Build-Skripte mit Groovy DSL. Wenn Sie jedoch einer der vielen Entwickler sind, die Kotlin für die Android-Entwicklung übernommen haben, ist es möglicherweise besser, Ihre Build-Skripte in Kotlin zu schreiben.

Im Gegensatz zu Groovy ist Kotlin eine statisch typisierte Programmiersprache. Wenn Sie also den Wechsel vornehmen, sind Ihre Build-Dateien mit den Funktionen zur automatischen Vervollständigung und Quellcode-Navigation von Android Studio kompatibel. Außerdem bedeutet der Wechsel von Groovy zu Kotlin, dass Sie in Ihrem gesamten Projekt dieselbe Programmiersprache verwenden. Dies kann die Entwicklung vereinfachen - insbesondere, wenn Sie mit Groovy nicht allzu vertraut sind!

Wenn Sie Ihre Erstellungslogik in Kotlin schreiben möchten, müssen Sie Gradle Kotlin DSL einrichten und den Anweisungen im Migrationshandbuch folgen.

Einpacken

In diesem Artikel haben wir uns mit dem Build-Automatisierungs- und Abhängigkeitsverwaltungstool von Android Studio befasst. Wir haben untersucht, wie Gradle den Erstellungsprozess standardmäßig automatisiert und wie Sie den Erstellungsprozess ändern können, indem Sie die Gradle-Erstellungsdateien Ihres Projekts bearbeiten, einschließlich der Erstellung benutzerdefinierter Gradle-Aufgaben und der Generierung mehrerer Erstellungsvarianten aus einem einzigen Projekt.

Haben Sie Gradle erweitert, um andere Teile des Android-Erstellungsprozesses zu automatisieren? Lass es uns in den Kommentaren unten wissen!

Oh, Montag. Vielleicht wundern ie ich, warum ie ich mit dem täglichen Büroalltag abfinden. Du könntet Codierung lernen und tattdeen von zu Haue oder von einem onnigen Urlaubort au arbe...

Die Welt verändert ich und ie müen mit den chlägen rollen. KI könnte Ihren Job überflüig machen, aber wenn ie lernen zu codieren, du wirt eine haben weentliche Fähig...

Neue Artikel