Unity3D Android Build: ADB im Kampf mit BlueStacks und falschen Treibern

Bei meinen Experimenten mit Unity3D, dem neuen Projekt „SpaceshipInTrouble“ und entsprechenden Tests bin ich auf ein Problem gestossen, was noch einige Probleme nachgezogen hat: „Build and Run“ für Android im Unity3D kompiliert zwar brav irgendwas zusammen, die App startet aber nicht und wird auch nicht installiert. In diesem Artikel will ich beschreiben was das Problem verursacht hat, und wie man es lösen bzw. einen halbwegs brauchbaren Workaround finden kann.

Lösung 1: Ein nerviger Workaround

Zunächst die APK auf den Webserver laden, von dort im Chrome-Browser auf dem Tablet herunterladen und via Click auf den fertigen Download mit dem Packet-Manager installieren. Nervt tierisch 🙂 und ist so in der Form überhaupt nicht zu gebrauchen, wenn man öfters Änderungen testen möchte.

Lösung 2: Installation per ADB

Theoretisch sollte Unity das eigentlich bereits tun, aber aus irgendwelchen Gründen funktionierte es bei mir nicht. Also noch einmal von Hand nachprüfen…

Zunächst die „adb.exe“ lokalisieren. Bei mir ist diese zu finden in (normale Standard-Installation unter Windows 8):

 

ADB steht für Android Debug Bridge und bietet viele nützliche Optionen. Neben dem Auslesen der Systemmeldungen und Debug-Informationen („adb logcat“), lassen sich hierüber auch Apps installieren, starten und stoppen.

Normalerweise lässt sich bequem über „adb install <pfad-und-name-der-apk>“ eine App installieren. Bei mir kam jedoch zunächst folgende Fehlermeldung:

package-manager-not-accessed

Error: Could not access the Package Manager. Is the system running?

Diese Meldung ist mir in der Form auch noch nicht begegnet. Nach einiger Suche war der Schuldige gefunden: Mein installierter BlueStacks-Player, eine Art Android-Emulator, mit dem sich unter Windows Android-Apps ausführen lassen (und das erheblich flotter als mit dem Google-Android-Emulator).

Dieser läuft so halb-aktiv im Hintergrund und wird vom ADB als Device erkannt. Somit versucht die ADB entsprechend die App auf dem BlueStacks zu installieren, welcher aber durch den halb-inaktiven Status nicht bereit für eine Installation ist – deshalb entsprechend die Fehlermeldung.

Vermutlich klappt es auch deshalb nicht mit dem Unity3D „Build & Run“, weil dieser ebenfalls versucht die App auf dem Emulator zu installieren. Gut, aber das sollte sich schnell fixen lassen – man kann dem ADB nämlich auch mitteilen, auf welchem Gerät die App installiert werden soll:

Mittels „adb devices“ kann man sich zunächst die verfügbaren Geräte anzeigen und anschliessend mit „adb -s <deviceid> <weitere adb-optionen>“ die ADB-Aktionen auf das Gerät beschränken.

device-not-found

Seltsamerweise wird jedoch mein Tablet gar nicht aufgelistet, sondern nur der BlueStacks-Player. Ok nächster Fehler…

Damit ein Gerät ordnungsgemäss von ADB erkannt werden kann, müssen einige Voraussetzungen erfüllt werden – soweit war mir das noch klar. Folgende Schritte folgten:

  • Entwickler-Modus aktivieren (mehrfach auf die Versionsnummer unter „über das Tablet“) klicken
  • USB-Debugging aktivieren
  • Media-Modus aktivieren (MTP)
  • USB-Treiber im Android-SDK-Manager unter „Extra“ installieren
  • Gerät noch einmal vom USB trennen und neu verbinden

Leider wurde das Gerät immer noch nicht gefunden. Also noch von der Nexus-Seite die USB-Treiber installiert… immer noch nichts. Weiterhin taucht bei „adb devices“ nur der Emulator auf.

Gerät testweise einmal auf „PTP“ umgestellt (Kamera-Modus) und siehe da: „adb devices“ erkennt nun das Gerät mit Seriennummer. Allerdings funktioniert adb im Kamera-Modus nicht wirklich und es lassen sich keine Apps installieren / starten usw.

Also wieder zurück auf „MTP“ und – das Gerät verschwindet wieder in der Deviceliste… Was war da schon wieder faul?

Nach einigem Suchen bin ich schliesslich auf die Lösung gekommen: Die Treiber waren trotz allem falsch.

Im Gerätemanager wurde das Gerät zwar erkannt und angezeigt (und angeblich auch mit den richtigen Treibern):

device-manager

 

Dennoch half ein manuelles „aktualisieren“ der Treiber:

driver-update

 

In den darauffolgenden Dialogen „Auf dem Computer nach Treibern suchen“ auswählen, dort dann „aus einer Liste von Gerätetreibern auf dem Computer auswählen“.

Anschliessend gab es für mich hier folgendes zur Auswahl: Einen „Android Composite ADB“ Treiber und einen „Standard USB“ Treiber. Nach wählen und bestätigen des Standard-USB-Treibers funktioniert nun alles wieder wie gewohnt. Das Gerät taucht unter Devices auf und die Apps lassen sich sauber installieren und starten.

Lustigerweise ist nach der Aktion der Standard-USB-Treiber aus der Treiber-Aktualisieren-Liste verschwunden und ich habe jetzt nur noch „Android Composite ADB Interface“ zur Auswahl, aber es funktioniert nach wie vor :).

device-found

Also schnell noch ein paar .bat Dateien geschrieben, welche die nervige Tipp-Arbeit ersparen und mir die App installieren / starten / stoppen:

Installation:

 Start:

Hierbei sei angemerkt, dass die Start-Activity einer Unity3D-Android-App „com.unity3d.player.UnityPlayerNativeActivity“ heisst. Der in den Unity-Player-Settings eingestellte App-Identifier für meine App lautet „de.jbrosi.spaceshipintrouble“, diesen Teil müsste man entsprechend für eine andere App dann anpassen – der Teil mit com.unity3d… ist fix.

Stopp:

 

Fazit

Es läuft wieder :)! Ich bin soweit fast Happy… Leider funktioniert der „Build & Run“-Button in Unity selbst immer noch nicht – vermutlich weil er bei zwei aktiven Devices (BlueStacks & mein Tablet) nicht weiss, auf welches die App installiert werden soll. Aber mit den .bat Dateien zum Starten/Stoppen/Installieren ist das für mich erstmal soweit ok.

 

 

 

 

Schreibe einen Kommentar

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