Android der Dinge

Updates aus der Wolke

Das Aktualisieren der Firmware eines Embedded-Geräts ist eine haarige Angelegenheit: Geht dabei etwas schief, so muss das betroffene Unternehmene Hardware bewegen - dies ist erstens teuer, und der Kundenzufriedenheit zweitens nur wenig zuträglich.
Im Interesse der Vermeidung von Ausfällen setzen Hersteller seit einiger Zeit auf das Prinzip des A-B-Update: Prozessrechner das Telefon sind mit zwei identischen Speicherpartitionen ausgestattet. Im Bootloader findet sich Logik, die wahlweise die Inhalte der Partition A oder Partition B aktiviert. Wer ein Update einspielen möchte, schreibt es in die veraltete Partition - auf diese Art und Weise ist sichergestellt, dass der Benutzer nach einem fehlgeschlagenen Updateversuch zum gerade aktuellen und mehr oder weniger gut funktionierenden Betriebssystem zurückkehren kann.
Im Fall unseres Prozessrechners lässt sich diese Vorgehensweise dadurch bestätigen, dass wir die Partitionstabelle wie in Bild 7 gezeigt auf den Bildschirm holen - Sie sehen, dass einige Partitionen, darunter auch die 32 MByte grosse OEM-Partition, zweimal angelegt wurden.
sudo lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT,LABEL liefert Informationen über das Dateisystem (Bild 7)
Google nutzt dieses Verfahren übrigens seit einiger Zeit zur Aktualisierung von Smartphones und Tablets - die unter https://source.android.com/devices/tech/ota/ab_updates
bereitstehende Webseite bietet eine Vielzahl von Hintergrundinformationen zur Thematik, die für Embedded-Entwickler schon aus Gründen der Fortbildung eine hochinteressante Lektüre darstellt.
Unsere nächste Aufgabe ist das Aktualisieren des Blinkprogramms ohne Nutzung der ADB. Dies erfolgt über die Android Things-Konsole, in der sie - mehr oder weniger nach Belieben - neue Bundles anlegen können, die Google sodann nach bestem Wissen auf die Endgeräte überträgt.
An dieser Stelle muss ich Sie darauf aufmerksam machen, dass die kommerzielle Nutzung der Android Things-Konsole derzeit vertraglich untersagt ist. In den nach der ersten Anmeldung angezeigten AGBs findet sich folgende Passage, die Hervorhebungen sind vom Autor:
 
1.1. Android Things Console and Software. Subject to the Terms, Google grants you a limited, revocable, non-transferable, non-exclusive, right to (i) access and use the Android Things Console and (ii) install and use the Software on up to 500 devices owned or controlled by you for the sole purpose of internal development and testing of devices that have integrated the Software. These Terms do not provide you with a right to sell, exploit or otherwise distribute any device that has integrated the Software. Commercial rights to use the Software for these purposes must be granted expressly via a separate written agreement with Google ("Commercial Agreement"). The Commercial Agreement will control in the event of a conflict with these Terms.
 
Ärgerlicherweise nennt Google bisher keine Informationen über die Preise der Update-Dienstleistungen: die unter https://stackoverflow.com/questions/46125585/android-things-can-sdk-be-used-for-commercial-projects befindliche Diskussion zeigt, dass einige Entwickler mehr als frustriert sind.
Zudem zeigen die Erfahrungen mit Google Maps, dass der Suchmaschinenanbieter bei gebotener Gelegenheit durchaus heftig zulangt: es wäre also durchaus vorstellbar, dass Google eine nicht unerhebliche Menge an Lizenzgebühren verlangt.
Entwickler-eigene Software wird in der Konsole über ein als Bundle bezeichnetes .zip-Archiv bereitgestellt: ein Android Things-Bundle hat mit seinem für normale Android-Applikationen vorgesehenen Namensvetter indes nichts gemein. Es handelt sich dabei stattdessen um ein vergleichsweise einfach aufgebauhtes Archiv, das die für den Prozessrechner relevanten Dateien bereitstellt.
Spezifischerweise dürfen Sie ein .zip-Archiv anliefern, das die während dem Hochfahren des Geräts anzuzeigende Animation beschreibt. Zudem muss das Archiv ein oder mehrere .apk-Dateien enthalten, eine davon implementiert den Intent-Filter für das weiter oben besprochene Startereignis android.intent.category.IOT_LAUNCHER.
Wir wollen in den folgenden Schritten eine Veränderung des Blink-Patterns vornehmen. Kehren Sie in Android Studio zurück, und passen Sie den Code der OnCreate-Methode an:
 
PeripheralManagerService service = new PeripheralManagerService();
try {
    myPins[0] = service.openGpio("BCM6");
myPins[0].setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
    myPins[1] = service.openGpio("BCM13");
    myPins[1].setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW);
    myPins[2] = service.openGpio("BCM19");
myPins[2].setDirection(Gpio.DIRECTION_OUT_INITIALLY_HIGH);
    myPins[3] = service.openGpio("BCM26");
myPins[3].setDirection(Gpio.DIRECTION_OUT_INITIALLY_HIGH);
 
Von besonderem Interesse ist an dieser Stelle, dass wir nun statt drei High und einem Low zwei High- und zwei Low-Werte einschreiben. Der Prozessrechner blinkt sodann eine andere Lichtfolge, was auch mit freiem Auge ohne grosse Probleme feststellbar ist. Alternativ dazu können Sie natürlich auch die Aufrufgeschwindigkeit des Runnables beschleunigen oder verlangsamen – achten Sie nur darauf, eine Methode zu wählen, deren Ergebnisse auch ohne Oszillograph beobachtet werden können.
Da wir dieses Projekt über die Android Things Console ausliefern, dürfen Sie keinen Debuggingprozess anstoossen. Klicken Sie stattdessen auf Build Make Project, um Android Studio zur Rekompilation des Gesamtprojekts zu animieren. Alternativ dazu können Sie an dieser Stelle die SD-Karte klonen und einen zweiten Raspberry Pi anwerfen, der ausschliesslich auf das Herunterladen von Updates wartet.
Klicken Sie im nächsten Schritt auf Build Build APK, um das Werkzeug zur Erzeugung der APK-Datei zu animieren. Klicken Sie daraufhin in die Statuszeile am unteren Bildschirmrand, um den in Bild 8 gezeigten Dialog auf den Bildschirm zu holen. Dort können Sie auf den Link Locate klicken, um das APK im Dateisystem-Browser ihrer Workstation zu öffnen.
Android Studio führt Sie direkt zur APK ihrer Applikation (Bild 8)
Packen Sie die. APK-Datei im nächsten Schritt unter Nutzung eines beliebigen Werkzeugs in ein .zip-Archiv, und kehren sie in die Android Things-Konsole zurück. Klicken Sie auf die Rubrik Factory Images, um die Liste der diversen, zu ihrem Projekt gehörenden Module auf den Bildschirm zu holen. Klicken Sie in der Rubrik Bundles sodann auf den Link Upload Bundle, und navigieren Sie zu ihrer soeben erzeugten Zipdatei. Diese darf danach durch Anklicken von Upload hochgeladen werden.
Im Test des Autors war dies – witzigerweise - die einzige Stelle, in der Firefox Probleme hatte: Das Backend akzeptiert die Auswahl der Datei nur unter Chrome. Wie dem auch sei, wird das Hochladen einige Zeit in Anspruch nehmen – ein Fortschrittsbalken informiert Sie darüber, wie weit das Backend mit der Verarbeitung ihrer Spende vorangekommen ist.
Wählen Sie im nächsten Schritt das aktuellste Bundle und die vorher verwendete Android Things-Version aus, und wechseln Sie in die Rubrik OTA Updates. Klicken Sie dort auf den Button „Start a new Update“, und wählen Sie das aktuelle Bundle und die Android Things-Version. Klicken Sie danach auf den Knopf Push Update, um eine Messagebox auf den Bildschirm zu holen, in der Sie die Aktualisierungsoperation nochmals bestätigen müssen. Nach dem Anklicken von Push beginnt das Backend mit der Generierung der Aktualisierung, die sodann wie in Bild 9 gezeigt angezeigt wird.
Die Updates beginnen mit der Selbst-Auslieferung (Bild 9)
An dieser Stelle ist Geduld erforderlich: Der auf jedem Raspberry Pi vorinstallierte automatische Upgrade-Assistent sucht nämlich nur einmal alle 5 bis 6 Stunden nach einem Update, und lässt sich nicht von Hand zu häufigeren Suchen animieren. Als wäre dieser Blödsinn nicht genug, hat Google im Moment auch kein Verfahren implementiert, um den Prozessrechner automatisch neu zu starten: Sie sollten also nach fünf oder sechs Stunden den Prozessrechner herunterfahren und neu starten, um eine Aktualisierung des Betriebssystems und der dazugehörigen Applikationen anzuweisen.
Dieses auf den ersten Blick wie eine Schikane wirkende Vorgehen ist übrigens sinnvoll: Stellen Sie sich die Freude eines Rüstungselektronikers vor, wenn ein Transferstandard während eines langlaufenden Experiments beschliesst, dass jetzt ein Update erforderlich ist, das die Farbe einer Leuchtdiode verändert.
Der effizienteste Weg zum Rebooten des Prozessrechners ist, über ADB Verbindung zum unterliegenden Linux-Betriebssystem aufzunehmen. Hierzu muss der ADB-Dienst im ersten Schritt in den Root-Modus versetzt werden – ob des Neustart des Daemons müssen Sie die Verbindung zum RPi danach neu aufbauen:
 
tamhan@TAMHAN14:~/Android/Sdk/platform-tools$ ./adb root
restarting adbd as root
tamhan@TAMHAN14:~/Android/Sdk/platform-tools$ ./adb connect 10.42.0.44
connected to 10.42.0.44:5555
 
Im nächsten Schritt folgt die eigentliche Aufforderung zum Neustart. Dazu beschaffen Sie eine Shell, und nutzen danach den Befehl reboot:
 
tamhan@TAMHAN14:~/Android/Sdk/platform-tools$ ./adb shell
rpi3:/ # reboot
 
Ärgerlicherweise erwies sich dies in Tests des Autors als nur wenig produktiv: Reboots beeinflussen die Update-Suchrate des Prozessrechners offensichtlich nicht.Interessant ist, dass das Nutzen der Shell auch den Zugriff auf das von gewöhnlichen Unix-Workstations bekannte ls-Kommando erlaubt. Dort findet sich zeitweise der in Bild 10 gezeigte Prozess, der manchmal sogar einige Prozent Rechenleistung in Anspruch nimmt.
Der Name Update-Engine klingt verdächtig nach Chrome OS (Bild 10)
Die Update-Engine lässt sich sogar aus der Kommandozeile heraus ausführen: Ärgerlicherweise ist es auch hier nicht möglich, sofort eine Aktualisierung zu befehlen.
An dieser Stelle sorgt das weiter oben gesehene Phänomen abermals für Ärger - Android Things ist nicht, oder nur leidlich, dafür ausgerüstet, mit Situationen umzugehen, in denen mehrere Peripheriegeräte und den Zugriff auf ein Hardwaremodul streiten. Versuchen Sie deshalb im ersten Schritt, dass von Android Studio platzierte Paket durch den PM zu beseitigen:
 
tamhan@TAMHAN14:~/Android/Sdk/platform-tools$ ./adb shell
rpi3:/ # pm uninstall com.tamoggemon.nmgthing
Success
 
Aus technischer Sicht bietet diese Sequenz von Konsolenbefehlen übrigens nichts überraschendes: Da Android Things keine Settings-Applikationen mitbringt, müssen wir das Programm stattdessen unter Nutzung des auf der Konsole verfügbaren Paketmanager beseitigen. Achten Sie lediglich darauf, den hier verwendeten Paketnamen com.tamoggemon.nmgthing durch einen anderen, zu ihrem Paket passenden String, zu ersetzen. Nach dem erfolgreichen Zurücksetzen des Android Things-Geräts erscheint der bekannte Homescreen am Bildschirm.
Führt auch dies nicht zum Ziel, so können wir überprüfen, ob die Kombination aus Bundle und Betriebssystem lebensfähig ist. Hierzu zählen wir in den Tab Factory Images zurück, und erstellen eine neue Build-Konfiguration aus dem aktuellsten Bundle und der aktuellsten Android Things-Version. Klicken Sie danach wie gewohnt auf Create Build Configuration und auf Download Build, um das Backend von Android Things - wie am Anfang des Artikels - dazu anzuweisen, ein neues Image zu kompilieren. Laden Sie dieses danach herunter, und  deployen Sie es auf die gewohnte Art und Weise in Richtung des Prozessrechners.
Funktioniert ihr Bundle zumindest in der Theorie, so wird die im Bundle enthaltene Applikation nach der erfolgreichen Initialisierung des neugebrannten Images am Bildschirm erscheinen. Erfolgt dies nicht, so ist die Struktur des Bundles fehlerhaft.




Das könnte Sie auch interessieren