8 min read

Installation von GrapheneOS auf einem Pixel 7

In diesem Artikel beschreibe ich mein Vorgehen bei der Installation von Graphene und meine Gedanken und Überlegungen, die ich mir im Vorhinein gemacht habe sowie mein Fazit.

Vorwort

Wenn man sich in der Custom Rom Szene mal umsieht, fallen dort schnell GrapheneOS oder auch CalyxOS als die bekanntesten Custom Roms neben LineageOS auf. Der Grund: Es ist möglich, mit den Pixel Geräten nach der Installation den Bootloader wieder zu sperren, was den Verified Boot auf dem Gerät ermöglicht. Calyx stammt sogar von Lineage ab und Graphene (Daniel Micay, ehemals CopperheadOS) vom AOSP.
Dies ist extrem wichtig für diverse Banking Apps, welche neben Googles SafetyNet auch überprüfen, ob das Gerät von einer vertrauenswürdigen Quelle (oft OEMs) stammt. Da ich in der Vergangenheit auf meinen OnePlus Geräte nie die Möglichkeit dazu hatte, war klar das mein nächstes Handy ein Google Pixel werden würde.
(Ich hatte ehrlich gesagt vor auf ein iPhone umzusteigen. Jedoch war die Idee schnell wieder verworfen, als Apple das iPhone 14 Pro wieder mit Lightning vorgestellt hat. Außerdem gefällt es mir nicht, wie sie alte Probleme schon wieder als neue Features verkaufen. Viele Grüße von der Insel!)

Beinahe hätte ich das Pixel 6 gekauft, jedoch gab es wieder einmal ein paar Gründe die dafürsprachen auf das Pixel 7 zu warten: ⁣
- ein Jahr längerer Support mit OS Updates (relevant, da sich Custom Roms ja nach AOSP richten)
- schmalere Ränder bei minimal kleineren Abmessungen → höhere Screen to Body Ratio (83,4 % Pixel 6, 84,9 % Pixel 7)
- Face Unlock (noch nicht in Graphene vorhanden, vmtl. wird das Pixel 6 es dann aber auch enthalten)
- hellerer Bildschirm (1000 Nits Pixel 7, für mich relevant da ich es viel beim MTB fahren/Wandern nutze)

So viel zur Hardware. Nun zur Software: Ich habe mich mit Graphene und Calyx beschäftigt und zwischen beiden die Wahl getroffen. Entschieden habe ich mich ja dann für Graphene. Hier die Argumente für und gegen jede Wahl:

GrapheneOS
+ Sandboxed Google Play Dienste (sie sind nicht so minimal wie microG, dafür liegt die App Kompatibilität bei fast 100 %. Beim Testen funktionierte alles, in der Vergangenheit unter microG fehlte mir z.B.: Lizenz Check [TeamSpeak], Find my Device, Kompatibilität wegen APIs [comdirect], langsame Einführung neuer Features, wenn sie überhaupt implementiert werden [Corona Tracking], Play Store download gekaufter Apps [ist zwar in Aurora möglich, aber sehr umständlich bis hin zu unmöglich, wenn es einen Lizenzcheck gibt])
+ unattended OS und Graphene Apps Updates
+ Fokus auch auf Security
- kein Root

CalyxOS
+ microG
+ Calyx Institute als Organisation
+ Aurora Services und F-Droid Priviledged Extension integriert (Mit Android12+ nicht mehr so relevant, da Installation eines Updates nicht mehr bestätigt werden muss)
+ neben Pixels wurden auch das Xiaomi Mi A2 unterstützt und es gibt experimental Support für OP8P und Fairphone 4
- kein Root

Wie man schon sieht: Es gibt nicht allzu viele Argumente, da sich beide grundlegend ähnlich sind (AOSP, Verified Boot, Google Pixels werden unterstützt). Letztendlich entscheidend war für mich aber der Punkt Google Play Dienste vs. microG. Ich war jetzt 2,5 Jahre lang mit microG unterwegs, aber irgendwie nicht richtig glücklich. Zwar haben auch Root und der nicht vorhandene Verified Boot dazu beigetragen, aber irgendwie fühlt es sich richtiger an, mit unterstützten Tools unterwegs zu sein. Klar hole ich mir damit Closed Source Spyware auf mein Gerät, wichtig ist für mich jedoch, dass die GP Dienste im User Kontext (wie jede andere App unter GrapheneOS auch) laufen. Somit ist es problemlos möglich, den GP Diensten alle Berechtigungen (außer Netzwerk, die braucht es für FCM) zu entziehen. Also kein Standort, kein Mikrofon, kein Speicherzugriff und keine Sensoren, wie bei allem anderen OEM Android Roms.

Das dazu, natürlich ist es auch möglich Graphene komplett ohne Google Dienste zu betreiben. Ich kann mich jedoch nur schwer von FCM trennen, da ich nicht bereit bin meine Akkulaufzeit durch eigene Pushimplementierungen jeder App zu reduzieren. Im Folgenden werde ich mein Vorgehen bei der Installation beschreiben.


Installation

Zuerst habe ich versucht die Installation über Chrome bzw. ungoogled-chromium von Fedora 36 aus auszuführen. Als ich hier auf Fehler stieß, probierte ich die Installation in Brave auf Ubuntu 22.04 LTS erneut. Im Nachfolgenden werde ich mein Vorgehen näher beschreiben:‌‌‌‌ Zuerst habe ich das Paket android-sdk-platform-tools-common installiert. Danach Chrome von der Google Seite als .deb.

Schließlich konnte ich mit der Installation beginnen.

Enabling OEM unlocking

Settings ➔ About phone ➔ Tap Build Number‌‌Settings ➔ System ➔ Developer options ➔ 'OEM unlocking' einschalten

Booting into the bootloader interface

Volume Down beim Boot

Unlocking the bootloader

Unlock Bootloader wählen. Dann habe ich im folgenden Menü das Pixel 7 als Gerät ausgewählt:‌

Anschließend mit Volume Down und Power das Unlocken bestätigen.

Obtaining factory images

Nun kann man hier das factory Image bequem für sein ausgewähltes Gerät per WebUSB herunterladen.

Joa, bis hier bin ich gekommen. Anschließend wollte ich das Image flashen. Dieser Prozess scheiterte mehrmals mit den Fehlern:‌‌Failed to execute 'open' on 'USBDevice': Access denied.Failed to execute 'open' on 'USBDevice': Unable to claim Interface.

Wie schon gesagt scheiterte die Installation an diesem Punkt. Ein Problem trat auf, welches ich noch nie im Android Universum erlebt habe:‌‌ Der Power Button war defekt, bzw ohne Funktion.

Das Verwirrende daran: Die Funktion BarCode ließ sich noch mit dem Power Button aufrufen, aber weder Power off, Start, noch Restart Bootloader. Faktisch war ich im Fastboot Mode gefangen.

Anschließend begann ich die Kommunikation mit dem Google Support.‌‌ Ja und wie es kommen musste war ich der Idiot. Und zwar erfolgt ein Force Power Off nicht nach 15 Sekunden, wie ich es von OnePlus gewöhnt war, sondern nach ziemlich genau 20 Sekunden. Ein erneuter Boot in Fastboot brachte dem Power-Button seine Funktion zurück. Irgendwie habe ich es also geschafft, Fastboot kaputtzumachen. Selbst ins Betriebssystem konnte ich nun aber ohne Probleme booten.‌‌ Also, nach diesem kleinen Ausflug back to GrapheneOS!

Als ich mit Flashing factory images fortfahren wollte, erhielt ich erneut den Error Failed to execute 'open' on 'USBDevice': Unable to claim Interface. auf Ubuntu 22.04 LTS, Chrome und mit installiertem android-sdk-platform-tools-common.‌‌ Ich entschied mich dazu, von jetzt an auf den Web-Installer zu verzichten und fuhr leicht genervt mit dem CLI Guide fort.

Ich habe erneut die Datei panther-factory-2022101600.zip von der Release Seite heruntergeladen und entpackt:

bsdtar xvf panther-factory-2022101600.zip

Anschließend soll das Skript flash-all.sh ausgeführt werden, bei mir hat es sich erstmal über eine zu alte Fastboot Version beschwert. Also habe ich fix von https://developer.android.com/studio/releases/platform-tools.html das Linux ZIP heruntergeladen, entpackt und mit‌‌sudo mv ../platform-tools_r33.0.3-linux/platform-tools/fastboot /usr/bin/‌‌nach /usr/bin/ verschoben. Nun gab der folgende Befehl die aktuellste Version aus:‌‌➜  ~ fastboot --version‌‌fastboot version 33.0.3-8952118‌‌Installed as /usr/bin/fastboot

Schon erledigte das Skript den (zugegeben ziemlich komplexen) Installationsvorgang (der Screenshot zeigt lediglich den Beginn des Flashvorgangs, da folgte noch einiges. Aber durch die Auseinandersetzung mit diesem Thema unter LineageOS verstand ich grob, was es mit 'product_b', 'vender_b', usw. auf sich hat), rebootet, bootet in fastbootd und anschließend zurück in den Fastboot Mode.

Das gesamte Output erspare ich mir hier. Es sind exakt 228 Zeilen. Ausgeführt habe ich das Skript unter Fedora 36 mit fastboot 33.0.3-8952118.

Locking the bootloader

Nun schließt man den Bootloader noch, um den Full Verified Boot nutzen zu können. Mehr dazu später.‌‌fastboot flashing lock

Auf dem Handy bestätigen mit Volume Down und Power.‌‌ Anschließend sollte Device state: locked in Grün im Fastboot Mode auftauchen. :)‌‌ Und auch schon bootet es erfolgreich in GrapheneOS.

Dateiumzug

In den nachfolgenden Stunden kümmerte ich mich um den Umzug und die Neuinstallation vieler Apps. Dabei war Syncthing ein echt hilfreiches Werkzeug, mit dem ich die Datenexports vieler Apps umziehen konnte. Jedoch migrierte ich noch keine Messenger wie Signal oder Threema, da ich noch auf den Umzug der eSIM bei meinem Provider (freenet) warten musste (mehr dazu im Fazit).
Viele Dateien und Sicherungsdateien aus verschiedenen Apps konnte ich mittels des Programm Syncthing und der dazugehörigen Webapplikation für meine NAS über das WLAN übertragen.


Fazit

UI und Design

Auch wenn es eigentlich egal ist, bin ich bei UI und Design irgendwie immer daran interessiert den neusten heißen Scheiß zu haben. Das war neben dem Verified Boot auch einer der Gründe, was mich am OnePlus 8 gestört hat: die Material UI und Android 12. Denn das muss ich Google schon zugutehalten, UI Design können sie. Mittlerweile ist ja Lineage 19 auch für das OnePlus 8 erschienen, dennoch hatte ich bei der Veröffentlichung schon die Pläne von einem Umstieg auf ein Pixel (wegen Verified Boot und Calyx/Graphene) im Hinterkopf. Und ich muss sagen, auch wenn Graphene nicht so schön wie die Stock ROM ist, es glänzt dennoch im Vergleich zu Lineage 18 an einigen Punkten:
- als Launcher Lawnchair 12 mit Lawnicons
- 90Hz (ja, hat das OP8 auch, hatte ich aber nie an wegen Akkuverbrauch. Das Pixel 7 kann aber seinen Bildschirm auf 10Hz: Variable Refresh Rate)
- beim Scrollen, dynamisches abfedern der Inhalte (Zeilen, Boxen, etc.)
- Android 13 Now Playing Animation
- GrapheneOS Charging Animation

Unattended Updates

Auch das Update System von Graphene ist durchdachter als noch die OTA Updates unter Lineage (bei denen ich durch Root einige Probleme hatte!). Da hier kein Root vorgesehen ist, gibt es keine Probleme.
Im Alltag läuft das ganze folgendermaßen ab: Das Handy fragt alle 4 Stunden bei vorhandener Internetverbindung die Graphene Server ab und prüft auf neue OS Updates. Wenn eins gefunden wird, wird es im Hintergrund in einer zweiten Graphene Installation installiert. Man kann in den Update-Einstellungen festlegen, ob das Gerät das Update nur über WLAN ausführt und bei einem nicht kritischen Akkulevel. Falls erwünscht, kann man es ebenfalls neu starten lassen. Das Tolle: das Herunterladen und die Installation kann jederzeit abgebrochen werden. Daher sollen Fehler nicht auftreten können. Dies habe ich bereits einmal getestet und es hat ohne Probleme funktioniert.

Dokumentation

Unter LineageOS + microG war die Dokumentation oft nicht vorhanden und musste manuell zusammengesucht werden. Die Webseite von Graphene (https://grapheneos.org) ist jedoch sehr umfangreich und hilft bei Fragen weiter. Zudem gibt es das Forum (https://discuss.grapheneos.org/) und einen Element-Kanal (#grapheneos:grapheneos.org).
Weiterhin empfehle ich den Youtube Kanal Side Of Burritos (auch ein Linux Systems Administrator :D).

eSIM

Auch die Einrichtung einer ESIM hat problemlos unter Graphene funktioniert. Ich beschreibe nur kurz den simplen Prozess: ⁣
- Play Services installieren
- Enable priviledged eSIM management (Einstellungen > Netzwerk & Internet)
- Einstellungen > Netzwerk & Internet > SIMs > +
- QR-Code scannen und ePIN eingeben
- SIM aktivieren
Damit ist der Prozess fertig und die Play Dienste können wieder entfernt werden. Beschrieben wird der Prozess sonst auch in diesem Video: ⁣
eSIM Explained | How to activate eSIM Android | GrapheneOS

Auto Ausfüllen und weitere Bugs unter LineageOS

Ich hatte einige Bugs unter LineageOS, unter anderem eine zu geringe Displayhelligkeit, deaktivieren der Auto Ausfüllen Einstellungen (Bitwarden), kein Double Tap to Wake, welche andauernd auftraten und sich auch nicht durch einen Reboot lösen ließen. Noch habe ich unter Graphene keinen dieser Bugs wieder entdeckt und hoffe auch das ich das in Zukunft nicht erleben werde. Insgesamt sollte es aber besser sein, da hier das OS auf eine kleinere Anzahl an Geräten abgestimmt werden muss und wie schon beschrieben durch kein Root o.ä. zu einem immuteable (unantastbares) OS wird (ja, ich beschäftige mich parallel mit Fedora Silverblue, Artikel kommt zu seiner Zeit :D).

Schlusswort

Eins muss ich noch loswerden, Danke für das Lesen des bislang längsten Artikel auf meinem Blog! Ich bin froh, mit einem größtenteils aus Open-Source-Projekten bestehenden Smartphone (meine konkreten Gedanken zu Apple stehen ja oben ...) immer noch problemlos unterwegs sein zu können, ohne riesige Einschränkungen machen zu müssen. Ja, ich mag dieses Thema sehr gerne, wie man ja auch historisch hier verfolgen kann.

Update 22.10.2022

Nachdem ich diesen Artikel auf dem Blog veröffentlicht habe, teilte ich es in der Community von GrapheneOS auf Twitter. Schnell erhielt ich auch eine Meinung von @GrapheneOS zu meinem Artikel. Infolgedessen muss ich hier ein paar Dinge erwähnen, die aufgrund meiner Vergangenheit (Lineage mit microG [Signature Spoofing] und Root) gar nicht im Fokus lagen und teilweise auch gar nicht bewusst waren:
GrapheneOS implementiert einige Dinge gegenüber CalyxOS (gerade im Bereich Security) und implementiert Patches von Upstream wesentlich zügiger als Calyx.
Auf viele dieser Verbesserungen bin ich im Artikel gar nicht eingegangen. Eine vollständige Liste findet man hier.
Zur Vollständigkeit hier die Antworten von @GrapheneOS:

Author: peterge