Android Apps auf dem Linux Desktop

Viele Dienste sind mittlerweile nur noch voll funktionsfähig, wenn man die App nutzt, denn besten Falls gibt es noch ein schlechtes Webfrontend.  Geht euch geht diese „Mobile Only“ Mentatlität von viele Anwendungen auf die nerven?  Hier gibt es gute Nachrichten.

Die Software Anbox macht sich die Tatsache zu nutzen, dass Android im Unterbau Linux verwendet und kapselt diese einfach in einem Linux Container LXC ein. Das hat einige Vorteile:

  • Kein Overhead für Hardwareemulation
  • Durch das Kapsel in einen Container ist das übrige System „sicher“ vor Angriffen
  • Theoretisch sind viele verschiedene Instanzen möglich

Anbox befindet sich aktuell in einem Alpha Stadium und dessen credo nur freie Software zu verwenden ist löblich aber verhindert aktuell noch einen sinnvollen Einsatz, da z.B. keine Unterstützung für ARM Anwendungen besteht.

Update:
Mittlerweile habe ich alles in ein Script gepackt um nicht bei jedem neuen Build die Installation erneut durch führen zu müssen.

Den Download findet ihr hier:
https://github.com/geeks-r-us/anbox-playstore-installer/raw/master/install-playstore.sh

Bug Reports bitte über GitHub.

Im folgenden wird erklärt wie man Anbox installiert und sich ein Android mit PlayStore und ARM Unterstützung manuell baut.

Setup

Anbox ist über das SNAP System für Ubuntu verfügbar:

$ snap install --classic anbox-installer
$ anbox-installer

Nach einem neustart ist es im Menü unter Anbox verfügbar.

Wenn die Anwendung nicht erscheint oder sich wieder schließt liegt das meist daran, dass der session-manager nicht läuft. Dieser kann mit folgendem  Befehl gestartet werden:

$ anbox session-manager
$ anbox launch --package=org.anbox.appmgr --component=org.anbox.appmgr.AppViewActivity

Wenn keine Netzwerkverbindung hergestellt werden kann liegt das meist daran, dass kein Netzwerkadapter angelegt wurden:

$ ifconfig 
anbox0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.250.1  netmask 255.255.255.0  broadcast 0.0.0.0
        inet6 fe80::583b:2aff:fe6f:88b3  prefixlen 64  scopeid 0x20<link>
        ether fe:d1:aa:6e:66:bd  txqueuelen 1000  (Ethernet)
        RX packets 5206  bytes 807502 (807.5 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8618  bytes 10883657 (10.8 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Fehlt dieser kann er wie folgt angelegt werden:

$ sudo /snap/anbox/current/bin/anbox-bridge.sh start

Wenn es dann immer noch nicht geht geht hilft vielleicht folgendes:

$ adb shell
$ su
$ ip route add default dev eth0 via 192.168.250.1
$ ip rule add pref 32766 table main
$ ip rule add pref 32767 table local

Android anpassen

Es werden die folgenden Veränderungen durchgeführt:

  • Play Store installiert
  • libhuodini für ARM Unterstützung installiert
  • Geräte Features angepasst

zunächst legen wir uns ein Arbeitsverzeichnis an und kopieren das originale Android Image dort hin:

$ mkdir ~/anbox-work
$ cd ~/anbox-work
$ cp /snap/anbox/current/android.img .

Danach entpacken wir das Image. Um die Berechtigungen zu erhalten muss dies mit root-Rechten erfolgen:

$ sudo unsquashfs android.img
$ cd squashfs-root

Die entpackten Daten liegen nun in:  ~/anbox-work/squashfs-root.

 

PlayStore

PlayStore und Co kann man bei opengapps.org  herunterladen.
Wie benötigen die Variante x86_64 für 7.1, mini reicht hier aus.

Das heruntergeladene Archiv enthält weitere Archive, davon werden die folgenden benötigt:

  • Phonesky
  • GoogleLoginService
  • GoogleServicesFramework
  • PrebuiltGmsCore

Diese Archive müssen entpackt werden und der Ordner mit dem gleichen Namen welche die .apk Datei enthält muss  mit root-rechten nach system/priv-app kopiert werden. Z.B. so:

$ sudo cp ./Phonesky ~/anbox-work/squashfs-root/system/priv-app/

nachdem alle 4  hinzugefügt wurden müssen noch die Berechtigungen angepasst werden:

$ cd ~/anbox-work/squashfs-root/system/priv-app/
$ sudo chown -R 100000:100000 Phonesky GoogleLoginService GoogleServicesFramework PrebuiltGmsCore

libhuodini

Huodini ist eine Bibliothek welche Befehle für den ARM Prozessor on-the-fly in Befehle für x86 Prozessoren übersetzt und somit die Ausführung von ARM Anwendungen erlaubt,

Im Netz finden sich viele Versionen davon. Ich habe  „ARM_Translation_Marshmallow.zip“ verwendet, da es noch keine für Android 7 gab.

Auch diese wieder mit root-rechten in das squashfs-root Verzeichnis entpacken und ggf. die Berechtigungen anpassen.

Da das Android Image von Anbox sehr wenige Features akiviert hat sieht die Auswahl im Play Store recht bescheiden aus:

Mehr Features

Die diese können in der Datei: squashfs-root/system/etc/permissions/anbox.xml jedoch angepasst werden:

Nach dem Eintrag:
<feature name=“android.hardware.ethernet“ />

werden einfach die folgenden noch hinzugefügt:

<feature name="android.hardware.touchscreen" />
<feature name="android.hardware.audio.output" />
<feature name="android.hardware.camera" />
<feature name="android.hardware.camera.any" />
<feature name="android.hardware.location" />
<feature name="android.hardware.location.gps" />
<feature name="android.hardware.location.network" />
<feature name="android.hardware.microphone" />
<feature name="android.hardware.screen.portrait" />
<feature name="android.hardware.screen.landscape" />
<feature name="android.hardware.wifi" />
<feature name="android.hardware.bluetooth" />

Nun noch die folgenden Einträge entfernen:

<unavailable-feature name="android.hardware.wifi" />
<unavailable-feature name="android.hardware.bluetooth" />

In der /system/build.prob müssen noch die unterstützen Prozessortypen angepasst werden:

ro.product.cpu.abilist=x86_64,x86,armeabi-v7a,armeabi
ro.product.cpu.abilist32=x86,armeabi-v7a,armeabi

Wenn man 3D Beschleunigung verwenden will muss am ende der Datei noch folgendes hinzugefügt werden:

# Report GLES as available
# 131072 ix 0x20000 in hex, which means GLES 2.0
ro.opengles.version=131072

Zum Schluss packen wir alles in ein neues Image:

$ cd ~/anbox-work
$ rm android.img
$ sudo mksquashfs squashfs-root android.img -b 131072 -comp xz -Xbcj x86

Nun kann das neue Image an den Container Manager gegeben werden:

$ sudo anbox container-manager --data-path=~/anbox-data --android-image=~/anbox-work/android.img

Anschließend kann anbox wie gehabt mit dem neuen Image gestartet werden.

Manchmal kommt es mit dem gms Dienst wegen fehlender Berechtigungen zu Problemen. Das kann über adb behoben werden:

$ adb shell
> pm grant com.google.android.gms android.permission.ACCESS_FINE_LOCATION

 

Wenn alle Einträge richtig sind kann man sich nun anmelden und bekommt die gewohnte fülle des Play Stores.

Leider funktionieren noch nicht alle Apps problemlos, da einige Funktionen, wie z.B. das rotieren des Bildschirms noch nicht implementiert sind.

23 Gedanken zu „Android Apps auf dem Linux Desktop“

  1. Hallo,
    Ich habe „open_gapps-x86_64-7.1-mini-20170825“ untergeladen und unzipped. Aber… ich kann die Dateien:
    Phonesky, GoogleLoginService, GoogleServicesFramework und PrebuiltGmsCore nicht finden:
    # updatedb
    # locate oogle | grep ervice | grep ogin
    Merci fürs hilfe!

    1. Die Ordner sind unter /core noch mal in den tar.lz Dateien verpackt. Dort gibt es dann unter anderem Phonesky/Phonesky.apk welches kopiert werden muss.

      1. Ich habe alles entpackt aber mein Terminal sagt mir er findet das Verzeichnis nicht, obwohl ich weiß das es da ist.
        Benutze Ubuntu 16.04 LTS. Also das kopieren funktioniert irgendwie nicht.

  2. Danke für die ausführliche Anleitung!

    Könntest Du mir bitte beim Starten des Images helfen?

    Ich konnte mein eigenes Image bauen. Leider kann ich es nicht starten. 2 Fälle habe ich.

    Fall 1:
    1. Ich stoppe ich den Container mit
    sudo /snap/anbox/current/bin/anbox-bridge.sh start
    2. Ich starte mein Image mit
    sudo anbox container-manager –android-image=anbox-work/android.img –data-path=anbox-data
    3. Anbox schmeisst den Fehler:
    anbox session-manager
    [ 2017-09-04 08:25:07] [client.cpp:[email protected]] Failed to start container: Failed to start container: Failed to start container
    [ 2017-09-04 08:25:07] [session_manager.cpp:[email protected]()] Lost connection to container manager, terminating.
    [ 2017-09-04 08:25:07] [daemon.cpp:[email protected]] Container is not running
    terminate called after throwing an instance of ’std::bad_alloc‘
    what(): std::bad_alloc
    Aborted (core dumped)

    Fall 2:
    1. Ich lasse den Container laufen.
    2. Und kriege den Fehler:
    sudo anbox container-manager –android-image=anbox-work/android.img –data-path=anbox-data
    [ 2017-09-04 08:34:30] [container_manager.cpp:[email protected]()] You are running the container manager manually which is most likely not
    [ 2017-09-04 08:34:30] [container_manager.cpp:[email protected]()] what you want. The container manager is normally started by systemd or
    [ 2017-09-04 08:34:30] [container_manager.cpp:[email protected]()] another init system. If you still want to run the container-manager
    [ 2017-09-04 08:34:30] [container_manager.cpp:[email protected]()] you can get rid of this warning by starting with the –daemon option.
    [ 2017-09-04 08:34:30] [container_manager.cpp:[email protected]()]
    [ 2017-09-04 08:34:30] [container_manager.cpp:[email protected]()] bind: Address already in use

    Wie kann ich das Image im Container austauschen?

    Danke im Voraus!

    1. Hallo

      du musst die laufende Anbox erst stoppen, aktuell sind mehrere Instanzen noch nicht unterstützt. Also Fall 1.
      Ich würde mal versuchen den absoluten Pfad zum Image / Daten Verzeichnis angeben. Ich vermute /home//anbox-work bzw anbox-data

      Bei Ubuntu liegen die Snap Pakete unter /var/lib/snapd/snaps als Images vor, die du bearbeiten müsstest um dein Image dort hinein zu bekommen.
      Hierfür musst du es anstatt read-only(ro) als read-write (rw) mounten. Das geht in /etc/systemd/system/snap-anbox-xx.mount

  3. you must edit anbox squashfs image apply the new android.img.
    anbox snap image location: /var/lib/snapd/snaps/anbox_60.snap

    unsquash it, remove the old android.img and copy the new one.
    rebuild the squashfs image with the same name „anbox_60.snap“

    umount old image:

    $ umount /snap/anbox/60

    copy the new anbox_60.snap image to /var/lib/snapd/snaps/

    reboot

    enable anbox again:

    sudo snap enable anbox

    1. I’m not sure if publishing such image is legal because of the huodini library and the google policy (which also prevent anbox of releasing such an image)

      1. Houdini library shouldn’t be a problem, it’s a foss licensed.
        Anbox doesn’t want to do it for many reasons, legal as well as not wanting to give support to users. Mine made after this guide works reasonably well, only sometimes anbox seems to shut down/crash randomly.
        Let me know if anybody wants it uploaded, though you will still have to manually add it to your snap or I would have to upload the whole snap.

        1. I haven’t found many information on the houdini lib. Any links I could add?
          If you can provide links to prepaird imaages I will add links to them.

  4. Danke für die Anleitung

    Habe play store am Laufen. Auch Download der Apps geht. Allerdings scheinen arm basierte Apps nicht zu starten, zb arm bitcoin miner oder bisecur. Evtl habe ich im libhoudini setup etwas falsch? Starten arm basierte apps in Ihrer anbox installation?

    1. Es kann sein, dass diese Apps Funktionen verwenden die es in Marshmallow noch nicht gab und deshalb auch nicht richtig ausgeführt werden können.
      Ich habe es mit ein paar Apps wie Instragram etc. versucht und dort ging es.

  5. Hallo,
    Danke fuer den Tutorial!

    Du hast geschrieben:
    „Im Netz finden sich viele Versionen davon. Ich habe „ARM_Translation_Marshmallow.zip“ verwendet, da es noch keine für Android 7 gab.
    Auch diese wieder mit root-rechten in das squashfs-root Verzeichnis entpacken und ggf. die Berechtigungen anpassen.“

    Unter squashfs-root gibt es aber schon einen Ordner mit den gleichen Name „system“. Soll man da den Ordner von ARM_Translation umbenennen? oder wie hast du das gemeint?

  6. Hi,

    I habe versucht, dass Script auszuführen, aber zum Schluss kommt ein Fehler, und ich weiß nicht, wie ich den debuggen soll. Mein System ist Kubuntu 17.10 64bit:

    install-playstore.sh: 152: install-playstore.sh: Bad substitution

    Irgendne Idee, was das sein kann?
    Gruß!
    Björn

    1. Hi Björn,

      du hast das Skript warscheinlich mit „sh“ statt mit „bash“ ausgeführt und daher funktioniert der Vergleich an der Stelle im Skript.

      Am besten ein „chmod u+x install-playstore.sh“ machen und dann das Skript mit „./install-playstore.sh“ ausführen.

      Gruß,
      Datafreak

  7. Help plis, Arch linux, install from aur and git not using snap,
    My problem is this lines

    cd /var/lib/snapd/snaps
    #In arch use /var/lib/anbox

    until $SUDO systemctl stop snap.anbox.container-manager.service
    do
    sleep 10
    done

    for filename in anbox_*.snap //no working no found anbox_* or anbox*

  8. Hi! I ran the automated script but the installation gets stuck on installing phonesky.apk. it just seems to be stuck there forever.
    I’m running the script as root
    please help thanks

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.