APKtool: Dark Mode für Desert Island selbst gemacht

Am Anfang des Monats haben wir Dir eine App aus dem Hause Google Creative Lab vorgestellt, die dem digital Detox helfen sollte. Nun wollen wir zeigen, wie wir den fehlenden Dark Mode selber programmiert haben und wie Du beliebige Apps nach deinen Wünschen modifizieren kannst!

Warnung: Bei eventuellen Beschädigungen oder gar Zerstörung übernehmen weder wir, noch der Hersteller die Verantwortung! Die Verwendung dieser Anleitung erfolgt auf eigene Gefahr! Dieses Tutorial setzt voraus, dass du die Basics im Terminal beherrschst. Wir verwenden macOS, allerdings sollten die meisten Schritte (abseits von der Installation) auf anderen Plattformen wie Windows und Linux sehr ähnlich sein.

Android Apps verwenden ein Dateiformat namens APK. Im Prinzip handelt es sich dabei um ein Archiv, welches die entsprechenden Dateien beinhaltet. Manche Teile des Archivs werden kompiliert, und können nicht 1:1 wieder dekompiliert werden. Mit dem APKtool können Apps dekompiliert und wieder kompiliert werden, sodass eine neue, ausführbare Android App entsteht. Nach dem Dekompilieren werden wir die App entsprechend bearbeiten und die Farben verändern, sodass die App ein dunkles Erscheinungsbild bekommt.

Installation und Einrichtung

Für das Dekompilieren von APKs brauchen wir das sogenannte APKtool. Dieses lässt sich am einfachsten mit einem Package Manager wie Homebrew installieren. Für die neueste Version von Homebrew, folgt ihr einfach den Anweisungen hier.

Nun sollte es mit dem Befehl brew update und anschließend brew install apktool möglich sein, das APKtool zu installieren. Anschließend kannst du apktool -version eingeben, um zu sehen, welche Version installiert wurde. Solltest Du noch keine Java runtime installiert haben, kommt nun folgende Meldung:

Folgendes Popup erscheint, falls keine entsprechende Java Version installiert ist.

Durch einen Klick auf „Weitere Infos …“ gelangst du zur Oracle Webseite, um das Java SE Development Kit herunterzuladen (wir haben uns für Version 13.0.2 entschieden). Sobald Java installiert ist, sollte der Befehl apktool -version die aktuell installierte Version anzeigen:

Unsere aktuelle Version ist 2.4.1. Mithilfe von `brew update` wird auch APKtool aktualisiert.

Nun könnten wir eigentlich sofort mit dem Bearbeiten von Android Apps loslegen! Doch woher bekommen wir die APK? Am einfachsten ist es, eine bereits installierte APK vom smartphone über ADB auf den Computer zu kopieren. Dies geht mit dem adb pull Befehl. Sollte adb noch nicht installiert sein, geht dies sehr einfach über Homebrew: brew cask install android-platform-tools

Jetzt musst Du nur noch das Handy anschließen, USB debugging aktivieren und die Anfrage des Computers auf dem Handy akzeptieren:

usb debugging aktivieren (android)

Ein Klick auf die Checkbox verhindert ständiges nachfragen, sobald man sein Handy anschließt.

Die APK auf den Computer Kopieren

Mit dem Befehl adb devices können die aktuell angeschlossenen Geräte gesehen werden. Hier sollte nun dein Handy auftauchen. Nun können wir die APK auf den Computer kopieren, indem wir diese Anleitung befolgen. Wichtig dafür ist der Package-Name der App. Diesen kann man beispielsweise aus der Play Store-URL auslesen:

Android Package Namen herauslesen

Der Package Name für Desert Island lautet: com.digitalwellbeingexperiments.desertisland

Zur Vollständigkeit listen wir hier noch die von uns verwendeten Befehle auf:

  1. adb shell pm list packages | grep "desert"
    mithilfe von | grep "desert" können wir die Ergebnisse herausfiltern, um nur den Namen von Desert Island anzuzeigen.
    Ausgabe:
    package:com.digitalwellbeingexperiments.desertisland
  2. adb shell pm path com.digitalwellbeingexperiments.desertisland
    Dieser Befehl gibt uns den genauen Pfad zur APK an.
    Ausgabe:
    package:/data/app/com.digitalwellbeingexperiments.desertisland-ZpGLzoAE0ft-f__p0dtnoQ==/base.apk
  3. Nun können wir die APK mithilfe von adb pull /data/app/com.digitalwellbeingexperiments.desertisland-ZpGLzoAE0ft-f__p0dtnoQ==/base.apk kopieren.

Mit dem Befehl open . wird der aktuelle Ordner im Finder angezeigt. Hier sollte nun eine Datei namens base.apk zu sehen sein.

Zeit fürs Dekompilieren: apktool d

Nun führen wir den Befehl apktool d base.apk aus, um die APK zu dekompilieren. Es sollte jetzt ein neuer Ordner namens „base“ entstanden sein. Das wars auch schon mit dem Dekompilieren. Wir können nun in dem Ordner die Inhalte der APK ansehen und bearbeiten. Am einfachsten geht das mit einem Code Editor wie Visual Studio Code oder Sublime Text.

Die entsprechenden Brew befehle lauten:

brew cask install visual-studio-code

beziehungsweise:

brew cask install sublime-text

Visual Studio Code bringt auch den Befehl code … mit sich. Somit können wir den base Ordner auch einfach mit dem Befehl code base direkt in Visual Studio Code öffnen.

Zeit für den Dark Mode: Unsere Veränderungen

Wir werden uns nun auf die Datei base/res/values/colors.xml stürzen. Hier werden die von der App verwendeten Farben definiert. Änderungen der Farben werden sich in der gesamten App widerspiegeln. Auf Zeile 28 sehen wir, dass die eine Farbe namens colorBackground definiert wird. Diese hat @color/soft_white als Wert. Wenn wir weiter nach Unten scrollen, sehen wir auf Zeile 127 dass dort die Farbe soft_white mit dem Wert #fff8f8f8 bestimmt wird. Diese Farbe wird im HEX Format gespeichert. Die Werte werden in Zweierblöcken aufgeteilt: Deckkraft, Rot, Grün, Blau. Die Werte gehen von 00 bis ff. Am einfachsten tut man sich mit einem Online Hex Editor, wie dem von htmlcolorcodes.com. Die Deckkraft kann dabei eigentlich immer „ff“ bleiben, man muss nur die 6 Buchstaben danach mit eigenen Werten ersetzen.

Visual Studio Code colos.xml Datei

Wir ändern also auf Zeile 127 den Wert #fff8f8f8 zu #ff000000. Somit erhalten wir echtes schwarz, welches bei OLED Displays dazu führt, dass keine Pixel aufleuchten.

Pixolor - Live Color Picker
Pixolor - Live Color Picker
Entwickler: Hanping
Preis: Kostenlos+

Besonders praktisch ist der Pixolor Color Picker. Mit dieser App ist es möglich, die auf dem Bildschirm dargestellten Farben gleich als Hex Werte abzulesen und eventuell in der colors.xml Datei zu finden.

Kompilieren und Signieren

Nun speichern wir die Datei und kompilieren die APK im Terminal mit dem Befehl:

apktool b – use-aapt build

Die kompilierte APK liegt nun im base/dist Ordner. Bevor wir sie installieren, müssen wir sie noch signieren. Dafür brauchen wir zunächst ein Zertifikat, welches wir relativ einfach mit der Anleitung auf der digicert-webseite erstellen können:

keytool -genkey -alias appkosmos -keyalg RSA -keysize 2048 -keystore keystore.jks

Wir haben uns beim Alias für „appkosmos“ entschieden, Du kannst aber hier einen beliebigen Namen wählen. Bitte verwende hier unbedingt ein neues Passwort, das Du sonst nirgends verwendest! Bei der Frage, ob die Daten korrekt sind, musst Du mit „yes“ antworten.

Nun sollte es eine weitere Datei namens keystore.jks geben. Mit dieser können wir die APK signieren, indem wir folgendes eingeben:

jarsigner -keystore keystore.jks base/dist/base.apk appkosmos

Hier ist wieder wichtig zu beachten, dass unser Alias „appkosmos“ lautet. Solltest Du einen anderen Alias gewählt haben, musst Du ihn entsprechend anpassen.

APK installieren

Zum Schluss können wir die APK mit dem Befehl adb install base/dist/base.apk installieren. Davor sollte aber die originale Desert Island App deinstalliert sein, da es sonst zu einem Fehler beim Zertifikat kommt! Hier ist nochmal schön zu sehen, wofür die Zertifikate überhaupt sind. Sollte ein Hacker die Desert Island App modifiziert haben und auf irgendeine Art und Weise in den Play Store bekommen, lässt sie sich trotzdem nicht als Update installieren, da die App nicht mit dem originalen Zertifikat von Google signiert wurde.

desert island dark mode

Und hier haben wir sie: Die Desert Island App im Dark Mode! Erstes Manko: die Textfarbe ist noch zu dunkel…

Die wichtigsten Befehle auf einen Blick

APK dekompilieren (base.apk ist der Name der APK)

apktool d base.apk

Den Ordner der APK kompilieren (build ist der ordner der App)

apktool b – use-aapt build

APK signieren (keystore.jks ist die Keystore-Datei, base/dist/base.apk ist die APK und appkosmos ist der Keystore-Alias)

jarsigner -keystore keystore.jks base/dist/base.apk appkosmos

APK installieren (base/dist/base.apk ist der Pfad zur APK)

adb install base/dist/base.apk

Fazit: Homebrew und APKtool sind mächtige Werkzeuge

Und da haben wir es: unsere erste modifizierte Android App! Wir haben in diesem Tutorial viele Schritte erklärt, die nur einmal ausgeführt werden müssen. Wenn wir nun beispielsweise den Text weiß machen möchten, könnten wir in base/res/values/styles.xml unter Zeile 3118 noch folgendes einfügen:

<item name="android:textColor">#ffffffff</item>

Anschließend würden wir die App kompilieren, signieren und installieren. Den Keystore haben wir ja bereits generiert und können ihn einfach wiederverwenden! Somit haben wir gelernt, was sich mit dem APKtool alles machen lässt. Der Package Manager Homebrew ist dabei optional, wir hätten auch alle benötigten Programme manuell installieren können. Dennoch ist es sehr praktisch zu sehen, wie mit wenigen Befehlen sich alle benötigten Programme installieren und bedienen lassen! Doch Vorsicht: die Welt der Android Apps ist mächtig und einige Entwickler haben sich vorgenommen, das modifizieren ihrer Apps zu blockieren. Hier werden verschiedenste Techniken zur sogenannten Obfuskation verwendet, damit der Code möglichst unleserlich wird und das APKtool verwirrt.

Sollte Dir dieses Tutorial gefallen haben, können wir gerne tiefer in den Source Code von Desert Island tauchen und die App Struktur weiter erklären oder weitere Apps genauer unter die Lupe nehmen!