Mein HALLE Zuhause

17.09.2020 Jonas L. App-Kritik

Die zweite App der Stadtwerke. Auch die ist keine Eigenentwicklung, sondern eingekauft.

Der Paketname lautet in diesem Fall de.doegel.swh.home. Da möchte man doch gleich doegel.de aufrufen. Das mache ich im Tor-Browser in der niedrigsten Sicherheitsstufe. Das macht dann genau 200 Anfragen. Die Anzahl der Drittquellen hält sich sogar in Grenzen: Google (Analytics, Maps, YouTube, Fonts, Ads), Facebook und das Bootstrap CDN.

Bei diesen Anfragen würde ich einen Consent-Banner mit einem blöden Spruch erwarten. Aber nein, es gibt hier keinen Consent-Banner.

Das Impressum und die Datenschutzerklärung hat man auf eine Seite gepackt - https://www.doegel.de/kontakt/. Die Seite beginnt mit einer Google Maps-Einbindung. Wie sehr mir das gefällt sage ich jetzt nicht.

Die Firma sitzt in Kabelsketal, was laut Karte zwischen Halle und Leipzig liegt. Nach dem Impressum kommt die Datenschutzerklärung - bis auf das Bootstrap CDN wird hier alles genannt. Hier werden auch PayPal und Datenverarbeitungen im Rahmen eines Online-Shops genannt, obwohl ich auf der Seite keinen Shop finden kann. Das ist etwas irritierend.

Dann wieder zur Startseite. Dort werden die drei Kernkompetenzen präsentiert - Cloud, Compliance und Communities. Ich bin mal optimistisch und nehme an, dass die Seite von einer Marketing-Abteilung betreut wird.


Dann sehe ich mir das Marketing-Material zum Thema Cloud genauer an - https://www.doegel.de/themen/cloud/. Die ersten zwei großen Punkte sehen interessant aus - Virtualisierung und Software-Streaming:

Dögel hat mit Evalaze eine eigene Applikations-virtualisierung entwickelt und ist damit der einzige europäische Hersteller einer Virtualisierungsengine.


Die “Applikationsvirtualisierung” klingt für mich von der Beschreibung her eher nach einer Containerisierung. Aber Container sind natürlich schon viel zu bekannt und langweilig.

Als sinnvolle Alternative zu klassischen Terminal-Services hat Dögel seine eigene Software-Streaming Technologie mit dem Namen Applaya entwickelt.


Wie viel oder wenig dahinter steckt, ist nicht erkennbar.

Die beiden “Weitere Informationen”-Buttons führen zur Startseite bzw. zu einer Fehlerseite.

Als dritten Punkt gibt es “Security” - wieder mal Texte, die nach einer Marketing-Abteilung klingen:

[Wir haben] [...] ein professionelles Team an Entwicklern und Administratoren. Unser Know-How in diesem Bereich ist im Mitteldeutschland beispiellos.


Ja, da stand wirklich “im Mitteldeutschland” und nicht “in Mitteldeutschland”. Aber meine Texte sind auch nicht immer fehlerfrei. Das “beispiellos” klingt nach einer übertriebenen Aufwertung.

Der letzte Punkt ist “Wan-Optimierung”. Hier wird auf den Partner “riverbed” verwiesen.

Riverbed Technology, Inc. is a Delaware corporation headquartered at 680 Folsom Street, 6th Floor, San Francisco, CA 94107


Ist das eine Kernkompetenz, wenn ich dafür einen Partner habe? Ich verstehe Kernkompetenz ja so, dass ich etwas selbst gut kann.


Dann gibt es noch https://www.doegel.de/unternehmen/referenzen/. Eine Halle-App finde ich dort nicht. Aber es gibt die HFC-App. Wahrscheinlich ist die besser gelungen.

An Buzzwords hat man nicht gespart. Wenn man nicht versteht, was dort steht, dann klingt das nach mehr, als es eigentlich ist. Also klassisches Marketing-Material.


Genug der Vorbetrachtung zur Firma. Jetzt wird https://play.google.com/store/apps/details?id=de.doegel.swh.home betrachtet.

Dort fällt auf, dass es zwischen 500 und 1000 Downloads gab. Dabei gilt allerdings, dass die Anzahl der bestehenden Installationen in der Regel kleiner ist als die Anzahl der Downloads. Die App “mein Halle” hat zwischen 10000 und 50000 Downloads.

Die aktuelle Version ist 1.0 vom 28. Februar 2020 und laut Changelog scheint es die erste öffentliche Version zu sein.

Sonderlich erfolgreich sieht dieses Projekt nicht aus. Wahrscheinlich hat man es deswegen nicht in die Referenzen aufgenommen.

Vor mir hat noch nie jemand die Anwendungen bei Exodus Privacy analysieren lassen. Das habe ich gemacht und das Ergebnis gibt es unter https://reports.exodus-privacy.eu.org/en/reports/147122/:

  • keine Tracker
  • mit einem Zertifikat von Google signiert - wahrscheinlich wird Google Play App Signing verwendet

Bei meinem Versuch, eine APK-Datei zu beschaffen, bestätigt sich die These mit der Google Play Dynamic Delivery. Das macht die Installation im Emulator etwas schwieriger. Aber es hat auch seine Vorteile:

$ ls -lah
insgesamt 21M
drwxr-xr-x 2 jonas jonas 4,0K Sep 17 09:41 .
drwxr-xr-x 4 jonas jonas 4,0K Sep 16 13:37 ..
-rw-rw-r-- 1 jonas jonas 7,5M Sep 16 13:33 base.apk
-rw-rw-r-- 1 jonas jonas  17K Sep 16 13:33 split_config.de.apk
-rw-rw-r-- 1 jonas jonas  14M Sep 16 13:33 split_config.x86.apk
-rw-rw-r-- 1 jonas jonas 200K Sep 16 13:33 split_config.xxhdpi.apk

Die Kern-APK ist mit 7,5 MB nicht klein. Aber dazu kommen noch 14 MB, die nur bei x86-Prozessoren relevant sind (ja, der Emulator nutzt KVM und das kann nur die Architektur vom Wirt “emulieren”, aber dafür sehr schnell wegen der Hardwarebeschleunigung).

Was gibt es für x86?

$ ls -lah
insgesamt 14M
drwx------ 2 jonas jonas 4,0K Sep 17 09:43 .
drwx------ 3 jonas jonas 4,0K Sep 17 09:43 ..
-rw-r--r-- 1 jonas jonas 974K Sep 16 13:33 libc++_shared.so
-rw-r--r-- 1 jonas jonas 162K Sep 16 13:33 libfb.so
-rw-r--r-- 1 jonas jonas 307K Sep 16 13:33 libfolly_futures.so
-rw-r--r-- 1 jonas jonas 314K Sep 16 13:33 libfolly_json.so
-rw-r--r-- 1 jonas jonas  30K Sep 16 13:33 libglog_init.so
-rw-r--r-- 1 jonas jonas 146K Sep 16 13:33 libglog.so
-rw-r--r-- 1 jonas jonas 314K Sep 16 13:33 libhermes-executor-debug.so
-rw-r--r-- 1 jonas jonas 310K Sep 16 13:33 libhermes-executor-release.so
-rw-r--r-- 1 jonas jonas 950K Sep 16 13:33 libhermes-inspector.so
-rw-r--r-- 1 jonas jonas 9,5K Sep 16 13:33 libimagepipeline.so
-rw-r--r-- 1 jonas jonas 298K Sep 16 13:33 libjscexecutor.so
-rw-r--r-- 1 jonas jonas 7,5M Sep 16 13:33 libjsc.so
-rw-r--r-- 1 jonas jonas  34K Sep 16 13:33 libjsijniprofiler.so
-rw-r--r-- 1 jonas jonas  42K Sep 16 13:33 libjsinspector.so
-rw-r--r-- 1 jonas jonas  14K Sep 16 13:33 libnative-filters.so
-rw-r--r-- 1 jonas jonas 582K Sep 16 13:33 libnative-imagetranscoder.so
-rw-r--r-- 1 jonas jonas  78K Sep 16 13:33 libreactnativeblob.so
-rw-r--r-- 1 jonas jonas 850K Sep 16 13:33 libreactnativejni.so
-rw-r--r-- 1 jonas jonas 230K Sep 16 13:33 libyoga.so

Die libjsc.so ist die größte Datei. Eine kurze Suche ergibt, dass die Anwendung scheinbar mit React Native gebaut wurde. Eine Anmerkung dazu: Eine React Native Anwendung ist keine native Anwendung.

Eine kurze Suche zu dem Thema liefert https://dev.to/srajesh636/how-we-reduced-our-production-apk-size-by-70-in-react-native-1lci. Dort wird gesagt, dass eine mit React Native gebaute Anwendung durch die Dynamic Delivery um 70% kleiner wurde. Gut vorstellbar, weil das ja nur die Dateien für eine von mehreren Architekturen war.

Es gibt natürlich auch eine Lösung für dieses Problem, bei der man normale APK-Dateien baut und den Signaturschlüssel nicht Google anvertrauen muss - https://developer.android.com/google/play/publishing/multiple-apks. Diese Lösung stammt aus der Zeit vor der Dynamic Delivery, aber müsste immer noch funktionieren. Natürlich wird auch hier gleich davon abgeraten:

If you publish your app to Google Play, you should build and upload an Android App Bundle. When you do so, Google Play automatically generates and serves optimized APKs for each user’s device configuration, so they download only the code and resources they need to run your app. Publishing multiple APKs is useful if you are not publishing to Google Play, but you must build, sign, and manage each APK yourself.


Man muss die APK-Dateien alle selbst bauen. Wie schlimm. Das geht sogar automatisch, nachdem man es konfiguriert hat. Wobei man immer noch auf React Native verzichten kann, dann ergibt sich das Problem gar nicht. Natürlich hat React Native auch Vorteile, weil man dann die gleiche Codebasis unter iOS verwenden kann.

Individuell für die Sprache deutsch sind nur sehr wenig Ressourcen - ob es sich da lohnt, dafür ein eigenes Archiv zu bauen? Das passiert ja automatisch und hier ist nur Zeug mit Google-Play-Bezug.

$ strings resources.arsc
DD%1$s funktioniert erst nach der Aktivierung der Google Play-Dienste.
JJ%1$s hat Probleme mit Google Play-Diensten. Bitte versuche es noch einmal.
HI%1$s wird nur ausgef
hrt, wenn du die Google Play-Dienste aktualisierst.
999+
Aktivieren
Aktualisieren
Alle anzeigen
Anfrage senden
Anmelden
App ausw
hlen
Auf Smartphone
ffnen
fhEine neue Version der Google Play-Dienste wird ben
tigt. Diese wird in K
rze automatisch aktualisiert.
Eingabetaste
**Fehler bei Zugriff auf Google Play-Dienste
Fertig
Funktionstaste
Google Play-Dienste aktivieren
!!Google Play-Dienste aktualisieren
  Google Play-Dienste installieren
Installieren
		Leertaste
schen
taste
Meta-Taste
Minimieren
Mit %s teilen
		Nach oben
Sprachsuche
Strg
Suchanfrage
Suchanfrage l
schen
Suche
	Suchen
Sym-Taste
Teilen mit
Umschalttaste
&'Verf
gbarkeit von Google Play-Diensten
Weitere Optionen
jlZur Nutzung von %1$s sind Google Play-Dienste erforderlich, die auf deinem Ger
t nicht unterst
tzt werden.
[[Zur Nutzung von %1$s sind Google Play-Dienste erforderlich, die gerade aktualisiert werden.
lmZur Nutzung von %1$s sind die Google Play-Dienste erforderlich, die auf deinem Ger
t nicht installiert sind.
Zur Startseite
ber Google anmelden
abc_action_bar_home_description
abc_action_bar_up_description
$$abc_action_menu_overflow_description
# weitere IDs entfernt, da langweilig; Es kamen keine weiteren Texte, die für die Oberfläche gedacht waren

Abhängig von de Bildschirmauflösung gab es Grafiken - Banner, Logos und Symbole.

Bleibt noch die base.apk. Da React Native Anwendugen in JavaScript geschrieben werden und ja wirklich viel Code da war für React Native, gehe ich davon aus, dass der JavaScript-Code nicht kompiliert wurde. Und so ist es auch. Im assets-Ordner gibt es eine 2 MB große index.android.bundle, deren Inhalt wie ein minifiziertes JavaScript aussieht.

Da hat das Debian-Paket node-uglify etwas passendes. Mit uglifyjs index.android.bundle -b -o index.readable.js werden es zwar 3,2 MB, aber es wird lesbarer.

Ganz am Ende des Quelltextes steht https://api.swh.de/api_v1/doc.json, was eine Swagger-API-Dokumentation enthält. Das ist nett, damit könnte ich auf eine Laufzeitanalyse verzichten - aber eventuell würde ich dann etwas übersehen.

Auffällig war die an einer Stelle in der API-Dokumentation als Beispielwert angegebene E-Mail-Adresse, die auf itc-halle.de endete. Möglicherweise ist der davor genannte Name derjenige, der die API gebaut hat.

Eine ältere Version der API-Dokumentation ist im (lesbar gemachten) Quelltext selbst enthalten - ab Zeile 55196. Warum? Ist das ein Fallback, weil versucht wird, die aktuelle Version zu laden? Die Laufzeitanalyse wird es zeigen.

Eine Suche nach Swagger im Quelltext liefert das in folgenden Zusammenhängen:

swagger.apis["Rechtliche Informationen"]
swagger.apis.Immobilien
swagger.apis.Artikel
swagger.apis.Kontakt
swagger.apis.Entsorgungskalender

Warum die Anführungszeichen bei den rechtlichen Informationen? Weil ein Leerzeichen enthalten ist. Aber warum verwendet man überhaupt deutsche Namen und dann auch noch Großbuchstaben am Anfang?

Zumindest gibt das einen Grobüberblick, was die Anwendung kann.


Dann starte ich die Anwendung - und es gab nur Anfragen an api.swh.de. Sehr unüblich, dass da nicht gleich etwas zu Google geht. Die genannte API-Dokumentation wird nicht geladen. Wahrscheinlich wird die Angabe nur beim Kompilieren/ Entwickeln verwendet.

An einigen Stellen sind WebViews, aber die Immobilienliste (und die Detailansicht von Immobilien), die Artikel, die Kontaktseite und der Entsorgungskalender sind direkt in der Anwendung integriert und diese kommunizieren eben mit api.swh.de.

Insgesamt merkt man bei einigen Details, dass es keine native Anwendung ist, z.B. am Verhalten beim Tippen auf Elemente.

Bei meiner Testumgebung sieht man die Bildschirmtasten am unteren Bildschirmrand nicht mehr gut, weil die weiß sind und durch die App einen weißen Hintergrund bekommen:

Der Abfallkalender in der Mein Halle Zuhause Anwendung

Und auch einen häufigen Oberflächengestaltungsfehler kann man finden:

Kalenderimport in der mein Halle Zuhause Anwendung

Wer es nicht bemerkt hat: Ein Dialog-Titel sollte niemals “Hinweis” lauten. Hier hätte man ihn weglassen können (Ja, das geht) oder man hätte “Kalenderimport” wählen können.

In der App gibt es einen Verweis auf eine Datenschutzerklärung, aber die hat nur etwas zur Webseite und nicht zur App.

Um auch mal eine Antwort der API zu zeigen https://api.swh.de/api_v1/articles/service:

{
    "description": "Service - Die Produkte, Dienstleistungen und Infrastruktur der Stadtwerke Halle sind überall in der Saalestadt zu finden. Dass Du Dich in einer der grünsten Städte Deutschlands wohlfühlst, dafür sorgen wir.",
    "icon": "0xe809",
    "items": [
        {
            "content": "entsorgungskalender",
            "identity": "app",
            "titel": "Entsorgungskalender"
        },
        {
            "content": "https://hws-halle.de/sperrmuellbestellen?swhapicall=appwebview",
            "identity": "webview",
            "titel": "Sperrmüllkarte"
        },
        {
            "content": "https://hws-halle.de/privatkunden/entsorgung-reinigung/sperrmuell/elektroaltgeraetebeantragen?swhapicall=appwebview",
            "identity": "webview",
            "titel": "Elektroaltgeräte"
        },
        {
            "content": "https://evh.de/privatkunden/kundenservice/kundencenter/produktfinder?swhapicall=appwebview",
            "identity": "webview",
            "titel": "EVH-Preisrechner"
        },
        {
            "content": 44058,
            "identity": "article",
            "titel": "Entstördienste"
        },
        {
            "content": 44054,
            "identity": "article",
            "titel": "Trinkwasserqualität"
        }
    ],
    "titel": "Service",
    "type": "linklist"
}

Und genau das ist der Inhalt vom Service-Tab. Natürlich noch etwas grafischer, aber es ist der Inhalt.

"icon": "0xe809" klingt interessant. Im Ordner assets/fonts gibt es mehrere Icon-Schriftarten:

  • meinhallezuhause_icons_v4.ttf
  • meinhallezuhause_icons_v5.ttf

Wahrscheinlich ist 0xe809 das Sonderzeichen, unter dem das passende Symbol abgelegt wurde.

Der Quelltext hat nur einen Verweis auf Version 5 ab Zeile 66624:

var o = {
    primary: r(d[0]).Platform.select({
        ios: "System",
        android: "SF Pro Text"
    }),
    strong: "DIN Next W1G",
    icon: "meinhallezuhause_icons_v5"
};

Warum dann Version 4 noch da ist?


Beim Datenschutz kann man sich hier nicht beschweren. Da ist diese Halle-App besser als die vorherige. Eine richtige Datenschutzerklärung, eine Zustimmung vor der ersten Netzwerkverbindung und ein Verzicht darauf, das Signieren an Google auszulagern, wäre natürlich schöner gewesen.

Einen Nutzen dieser Anwendung erkenne ich allerdings nicht.

Für eine professionelle Entwicklung einer Firma finde ich einen Dialog-Titel “Hinweis” und nicht gut sichtbare Navigationstasten unpassend. In der Firma sollten Experten sitzen, die so etwas sofort bemerken. Das Verhalten einiger Steuerelemente, die sich nicht so wie üblich verhalten, liegt natürlich an React Native. Warum man dann aber nicht gleich eine normale Webanwendung baut und als App verpackt, wenn es unter iOS und Android laufen soll und man nicht doppelt entwickeln will, erschließt sich mir nicht.

Damit habe ich alle Halle-Apps betrachtet.