1793322

Einleitung: Android-Apps mit in Linux programmieren

03.11.2020 | 09:36 Uhr | Thorsten Eggeling

Software für Android lässt sich in vielen Programmiersprachen entwickeln. Mit Lazarus und Free Pascal gelingt das vergleichsweise einfach, auch wenn die Installation der nötigen Tools zunächst einige Vorbereitungen erfordert.

Die bevorzugten Programmiersprachen für Android-Apps sind Java und Kotlin. Beide werden von Googles offizieller Entwicklungsumgebung Android Studio unterstützt. In diesem Artikel soll es jedoch um den Free Pascal Compiler (FPC) gehen. Zusammen mit der Entwicklungsumgebung Lazarus und einigen Erweiterungen lassen sich Android-Apps relativ komfortabel erstellen. Wir erläutern die nötigen Schritte am Beispiel eines Projekts, mit dem sich eine Fritzbox steuern lässt.

Service: Den Quellcode, die fertig kompilierten Beispielprogramme und weitere Informationen finden Sie über https://m6u.de/lamw .

1. Das leisten Lazarus und FPC

FPC Free Pascal (FPC) ist der Open-Source-Nachfolger von Turbo Pascal und weitestgehend mit Delphi kompatibel (früher Borland, heute Embarcadero). Pascal ist klar strukturiert, Variablen müssen immer deklariert werden. Das erleichtert Programmieranfängern, Fehler zu vermeiden.

Lazarus  ist die grafische Oberfläche (IDE, Integrated Development Environment) für FPC. Ein Kernbestandteil ist der grafische Formulardesigner, über den Sie Bedienelemente im Programmfenster unterbringen und das Layout gestalten. Vom Formulardesigner gelangen Sie schnell zum Quelltexteditor, etwa per Doppelklick auf eine Schaltfläche im Formular. Hier bringen Sie den Programmcode unter, der etwa beim Klick auf eine Schaltfläche ausgeführt werden soll. Lazarus kann aus dem gleichen Quellcode Binärdateien für mehrere Betriebssysteme erstellen, neben Linux auch für BSD, Windows, Mac-OS und den Raspberry Pi. Die Programme laufen in der Regel ohne Abhängigkeiten, unter Linux/BSD müssen jedoch die GTK2-Bibliotheken installiert sein, was aber bei vielen Systemen standardmäßig der Fall ist.

Formulardesigner: Grafische Oberflächen lassen sich unter Lazarus mit ein paar Mausklicks erstellen. Für Android müssen Sie die Elemente jedoch manuell ausrichten.
Vergrößern Formulardesigner: Grafische Oberflächen lassen sich unter Lazarus mit ein paar Mausklicks erstellen. Für Android müssen Sie die Elemente jedoch manuell ausrichten.

Ein Lazarus-Projekt lässt sich für Android nicht ganz so einfach umsetzen, da nicht die gleichen Bedienelemente verfügbar sind. Am Pascal-Code muss man jedoch kaum etwas ändern, wenn man Programmlogik und Verweise auf die grafische Oberfläche so weit wie möglich trennt. Ein Nachteil: Android-Apps lassen sich in Lazarus nicht schrittweise debuggen, wodurch Fehler schwerer zu ermitteln sind.

Android 11 wird ausgerollt: Das ist neu und diese Handys bekommen es

2. Lazarus/FPC unter Linux einrichten

Für die komfortable Installation verwenden Sie das Tool Fpcupdeluxe, das Sie über https://m6u.de/fpcup herunterladen. Für 64-Bit-Linux wie Ubuntu 18.04, 20.04 oder Linux Mint 19.3 laden Sie die Datei „fpcupdeluxe- x86_64-linux“ herunter.

Schritt 1: Installieren Sie zuerst die folgenden Pakete: 

sudo apt install libx11-dev libgdk-pixbuf2.0-dev libpango1.0-dev libgtk2.0-dev subversion git freeglut3-dev 

Schritt 2: Starten Sie dann „fpcupdeluxex86_64-linux“. Standardmäßig lassen sich darüber per Klick auf „Stable“ die Versionen FPC 3.0.4 und Lazarus 2.0.8 installieren. Das ist ausreichend, wenn Sie 32-Bit-Apps für Android erstellen möchten. Die laufen auf so gut wie allen Android-Geräten. Wer auch 64-Bit-Apps benötigt, klickt auf „Trunk“ (neuere Versionen, noch in der Entwicklung).

Das ist erforderlich, wenn Sie Apps bei Google Play veröffentlichen wollen. Wir haben für unsere Beispiel-App die Trunk-Version verwendet.

Einfache Installation: Das Tool Fpcupdeluxe hilft bei der Einrichtung unterschiedlicher Lazarus/FPC-Versionen und kann auch die für Android nötigen Crosscompiler installieren.
Vergrößern Einfache Installation: Das Tool Fpcupdeluxe hilft bei der Einrichtung unterschiedlicher Lazarus/FPC-Versionen und kann auch die für Android nötigen Crosscompiler installieren.

Schritt 3: Nach der Installation starten Sie Lazarus probeweise über das Desktopicon. Da wir noch weitere Tools benötigen, beenden Sie Lazarus und kehren zu Fpcupdeluxe zurück.

Schritt 4: Gehen Sie auf die Registerkarte „Cross“, aktivieren Sie die Optionen „arm“ und „android“ und klicken Sie auf „Install compiler“. Für die 64-Bit-Version aktivieren Sie „aarch64“ und installieren auch diesen Compiler.

Schritt 5: Wechseln Sie auf die Registerkarte „Modules“. Wählen Sie nacheinander „ECCControls“, „hashlib4pascal“ und „lamw“ und klicken Sie jeweils auf „Install module“.

3. Android-Tools installieren

Tools für Android-Entwickler: Die gewünschten Programme und Bibliotheken richten Sie über Android Studio ein. Sie benötigen die Entwicklungsumgebung auch für den Android-Emulator.
Vergrößern Tools für Android-Entwickler: Die gewünschten Programme und Bibliotheken richten Sie über Android Studio ein. Sie benötigen die Entwicklungsumgebung auch für den Android-Emulator.

Laden Sie Android Studio für Linux über https://developer.android.com/studio herunter. Entpacken Sie die Datei und verschieben Sie diese in den Ordner „android-studio“ in Ihr Home-Verzeichnis. Starten Sie „~/android-studio/studio.sh“. Folgen Sie den Anweisungen des Installationsassistenten. Sie können alle Voreinstellungen unverändert übernehmen.

Gehen Sie im Fenster „Welcome to Android Studio“ unten rechts auf „Configure –› SDK Manager“ und aktivieren Sie „Android 9.0 (Pie)“. Wechseln Sie dann auf die Registerkarte „SDK Tools“ und aktivieren Sie „NDK (Side by side)“, „Android SDK Commandline Tools (latest)“ sowie „Google Play services“: Nach Klick auf „OK“ folgen Sie den weiteren Anweisungen des Assistenten.

4. Ein erstes Android-Projekt erstellen

Neues Android-Projekt: Ändern Sie die Einstellungen wie abgebildet. Lazarus/LAMW verwenden bei aktiviertem „Compat support“ API 28 (Android 9).
Vergrößern Neues Android-Projekt: Ändern Sie die Einstellungen wie abgebildet. Lazarus/LAMW verwenden bei aktiviertem „Compat support“ API 28 (Android 9).

Starten Sie Lazarus über das Desktopicon. Das Programm startet standardmäßig mit einen neuen Projekt und zeigt ein leeres Formular und den Quelltexteditor. Gehen Sie auf „Tool –› Options“ und dann auf „Environment –› General“. Stellen Sie als Sprache „Deutsch [de]“ ein, dann beenden Sie Lazarus über „File –› Quit“ und starten das Programm neu.

Schritt 1: Gehen Sie auf „Werkzeuge –› [LAMW] Android Module Wizard –› Path settings“. Unter „Path to Java JDK“ geben Sie „/home/[User]/android-studio/jre“ aus Ihrem Home-Verzeichnis an. Unter „Path to Android NDK“ gehört zur Zeit der Pfad „/home/[User]/Android/Sdk/ndk/21.2.647 2646“. Darunter wählen Sie die Option „>11“. Klicken Sie auf „OK“, um die Änderungen zu speichern. Die Einstellungen gelten für alle Projekte und müssen nur einmal angepasst werden.

Schritt 2: Klicken Sie im Menü auf „Projekt –› Neues Projekt“. Wählen Sie „LAMW [GUI] Android Module“ und klicken Sie auf „OK“. Tippen Sie unter „New Project Name“ eine aussagekräftige Bezeichnung ein, beispielsweise „HelloWorld“. Unter „Default Package Name“ können Sie „org.lamw“ belassen. Wenn Sie die App veröffentlichen wollen, müssen Sie eine eigene Bezeichnung angeben . Die weiteren Einstellungen sehen Sie in der Abbildung auf dieser Seite.

Schritt 3: Klicken Sie auf „OK“ und danach auf „Speichern“. Sie sehen jetzt das Fenster des Formdesigners mit dem Titel „Android- Module“ sowie den Quelltexteditor und den Objektinspektor.

Schritt 4: In der Lazarus-Hauptleiste stehen die Komponenten auf den Registerkarten zur Verfügung, die ein „Android“ in der Bezeichnung tragen. Gehen Sie auf „Android Bridges“, klicken Sie auf das Icon mit dem Button („jButton“) und klicken Sie in das Fenster des Formdesigners. Bauen Sie außerdem ein Textfeld ein („jEditText“). Die Elemente lassen sich auf dem Formular beliebig positionieren.

Schritt 5: Per Doppelklick auf „jButton1“ erzeugen Sie das zugehörige Ereignis „jButton1Click“ im Editor. Zwischen „begin“ und „end“ fügen Sie die Zeile

jEditText1.Text:='Hello World'; 

ein. Mit Strg-F9 („Start –› Kompilieren“) erstellen Sie das Programm und mit Strg-F1 („Start –› [LAMW] Build Android Apk and Run“) erzeugen Sie das Installationspaket („apk“). Das Programm wird automatisch auf den laufenden Emulator oder ein angeschlossenes Android-Gerät übertragen und gestartet (siehe Kasten „ Android-Apps starten und testen“).

Schritt 6: Unter Android öffnet sich die App mit einer Titelleiste, die den Namen der App zeigt („HelloWorld“). Darunter ist die Schaltfläche zu sehen, das Textfeld aber nicht. Daher hat es auch keine sichtbare Auswirkung, wenn Sie die Schaltfläche antippen. Der Grund dafür liegt in der Besonderheiten der Android-Apps. Wegen der unterschiedlichen Bildschirmgrößen sowie Hoch- und Querformat richten sich die Bedienelemente relativ zueinander aus. Angaben dazu, wie das geschehen soll, fehlen bisher in der App. Deswegen liegen alle Elemente übereinander, die Schaltfläche verdeckt das Textfeld. Wie die Elemente in der Entwurfsansicht angeordnet sind, spielt keine Rolle. Um das zu ändern, klicken Sie „jEditText1“ an. Im Objektinspektor gehen Sie auf „PosRelativeToParent“ und setzen Häkchen vor „rpLeft“ und „rpTop“. Klicken Sie die Schaltfläche „jButton1“ an, wählen Sie im Objektinspektor hinter „Anchor“ den Eintrag „jEditText1“, bei „PosRelativeToAnchor“ setzen Sie ein Häkchen vor „raBelow“. Hinter „PosRelativeToParent“ aktivieren sie „rpLeft“. Bei beiden Elementen stellen Sie hinter „LayoutParamWidth“ den Wert „lpMatchParent“ ein.

„jEditText1“ befindet sich im Formdesigner jetzt links oben, „jButton1“ wird im Containerelement (Parent, AndroidModule1) an der linken Seite ausgerichtet und unterhalb des Anchor-Elements „jEditText1“. Wenn Sie die App mit Strg-F1 neu starten, entspricht das Ergebnis der Entwurfsansicht. Ein Klick auf die Schaltfläche ersetzt den Text in „jEditText1“ durch „Hello World“. Durch „lpMatchParent“ füllen beide Elemente die gesamte Breite des Bildschirms aus. Das gilt auch, wenn Sie sich das Smartphone in den Modus „Querformat“ drehen. Die Ausrichtung der Elemente ist eine Android-Eigenart und in Android Studio auch nicht besser gelöst. Hinzu kommt, dass Android mehrere Layoutansichten verwenden kann und es eigene Controls etwa für die App-Leiste, eine Toolbar oder die Tab-Navigation gibt. Eine grundsätzliche Einführung liefert https://developer.android.com/design

5. Demo-Apps ausprobieren

Linux zuerst: Unter Linux lässt sich ein Programm ausprobieren und schrittweise debuggen. Die meisten Funktionen werden dann auch in der Android-App keine Probleme bereiten.
Vergrößern Linux zuerst: Unter Linux lässt sich ein Programm ausprobieren und schrittweise debuggen. Die meisten Funktionen werden dann auch in der Android-App keine Probleme bereiten.

Für den Lazarus Android Module Wizard (LAMW) ist nicht viel Dokumentation verfügbar. Bei Problemen und Fragen ist das Forum https://forum.lazarus.freepascal.org eine gute Anlaufstelle. Infos zu Android finden Sie nach Klicks auf „Programming“, „Operating Systems“ und „Android“.

Hilfreich sind die Demo-Apps, die Sie in Ihrem Home-Verzeichnis unter „fpcupdeluxe/ccr/lamw/demos“ finden. Die Projektdatei finden Sie jeweils im Ordner „jni/controls.lpi“. Gehen Sie zuerst auf „Projekt –› Projekteinstellungen“ und dann unter „Projekteinstellungen“ auf „[LAMW] Android Project Options“. Hinter „Target SDK version“ stellen Sie den Wert „28“ ein, auf der Registerkarte „Build“ wählen Sie „Gradle“ und „ARMv7a+VFPv3“. Danach kompilieren Sie die App mit Shift-F9 („Neu kompilieren“) und starten sie mit Strg-F1.

Hinweis: Strg-F1 funktioniert manchmal nicht zuverlässig. Öffnen Sie dann nach Shift-F9 oder Strg-F9 („Kompilieren“) den Ordner der App in einem Terminal und starten Sie „gradle-local-build.sh“ und danach „gradle-local-run.sh“.

6. Linux-Programm als Grundlage verwenden

Es empfiehlt sich, vor der Android-App zuerst ein Linux-Programm mit den gleichen Funktionen zu erstellen. Das Programm lässt sich dann Schritt für Schritt debuggen, was die Suche nach Fehlern erleichtert. Den Quelltext für unser Linux-Beispielprojekt „SmartFritzSchalter“ können Sie über https://m6u.de/lamw herunterladen. Er ist ausführlich kommentiert, weshalb wir hier darauf nicht weiter eingehen. Die Datei „fritzbox.pas“ enthält alle Aufrufe, die die Fritzbox betreffen.

Testen lässt sich das Projekt mit allen Funktionen nur, wenn Sie eine Fritzbox und einen Smarthome-Schalter besitzen („Fritz!DECT 200“). Das Programm kann aber als Beispiel für weitere Funktionen auch die Anruferliste anzeigen und die externe IP-Adresse der Fritzbox melden.

Hinweis: Standardmäßig fordert eine Fritzbox beim Aufruf im lokalen Netzwerk über http://192.168.178.1 oder http://fritz.box nur ein Passwort an.

Erfolgt der Zugang über das Internet und eine HTTPS-verschlüsselte Verbindung, müssen Benutzername und Passwort konfiguriert sein. Das selbst signierte SSL-Standardzertifikat der Fritzbox wird vom Linux-Programm akzeptiert, nicht jedoch von der Android-App. Wie Sie eine Ausnahme definieren, lesen Sie unter https://m6u.de/lamw .

7. Die Android-App zur Fritzbox-Steuerung 

Fritzbox steuern: Die App zeigt die verfügbaren Fritz-DECT-Geräte an, die sich auch umschalten lassen. Zu den Einstellungen und Logmeldungen gelangen Sie auch über ein Menü.
Vergrößern Fritzbox steuern: Die App zeigt die verfügbaren Fritz-DECT-Geräte an, die sich auch umschalten lassen. Zu den Einstellungen und Logmeldungen gelangen Sie auch über ein Menü.

Die Android-App mit dem Namen „Smart- Fritz“ enthält fast die gleichen Funktionen wie das Linux-Programm. Um die Unterschiede zu verdeutlichen, haben wir die Codeteile für Android zwischen „{$IFDEF ANDROID}...{$ENDIF ANDROID}“ und gepackt und die für Linux zwischen „{$IFDEF Linux}...{$ENDIF Linux}“. In der Regel betrifft das Anweisungen, die sich auf Bedienelemente beziehen, die bei Android anders heißen und andere Optionen bieten. Die App besteht aus mehreren Modulen, im Android-Sprachgebrauch „Activities“ genannt.

Die Start-Acitivity „AndroidModule1“ zeigt nach der Anmeldung die Schalter. Diese werden dynamisch erzeugt, je nachdem, wie viele vorhanden sind. Die anderen Module dienen für die Eingabe der Anmeldeinformationen, Ausgabe von Logeinträgen, Infos zu den Schaltern (Leistung, Temperatur) und für die Anruferliste.

Die Navigation erfolgt über ein Menü („js- NavigationView1“), eine Leiste am unteren Rand („jsBottomNavigationView1“) oder Fingergesten („jPanel2FlingGesture“). Die Anmeldung erfolgt über die runde rote Schaltfläche, die nach erfolgreichem Log-in die Farbe ändert. 

Die Themen in Tech-up Weekly #203:

► Sony lüftet letztes PS5-Geheimnis (00:47):
blog.de.playstation.com/2020/10/10/ps4-spiele-auf-ps5-antworten-auf-eure-brennendsten-fragen/

► Radeon RX 6000: AMD kündigt Big-Navi-Serie für den 28.10. an (03:15):
www.pcgameshardware.de/Grafikkarten-Grafikkarte-97980/News/Radeon-RX-6000-Big-Navi-1359799/

► 12-Jähriger baut Fusionsreaktor im Kinderzimmer (05:55):
www.pcwelt.de/news/12-Jaehrigem-gelingt-Kernfusion-im-Kinderzimmer-10902204.html

Web-Fundstück der Woche

► XCloud: Doom läuft auf Samsung-Kühlschrank (06:55):
www.pcwelt.de/news/xCloud-Doom-laeuft-auf-Samsung-Kuehlschrank-10901216.html

► Zum PC-WELT T-Shirt-Shop:
www.pcwelt.de/fan

PC-WELT Marktplatz

1793322