Beschleunigen Sie die Android-App mit Golang

Bild

Die Entwicklung mobiler Anwendungen ist immer ein Kompromiss zwischen Ihren Vorstellungen und den Möglichkeiten der Geräteplattform. In diesem Artikel wird erläutert, wie Sie die Funktionen einer Android-Anwendung mithilfe von Golang verbessern können.

Hier finden Sie kein Leck der geheimen Android-API. Die verwendeten Mechanismen sind Standard- (oder fast Standard-) Android- und Golang-Tools, deren Beschreibung auf offiziellen Websites und in Fachforen zu finden ist. Aber in Form eines einzigen Aktionsplans und sogar in russischer Sprache - dies wird zum ersten Mal und exklusiv für Habr veröffentlicht.

Hintergrund


Auf vielfachen Wunsch von Anwendern einer der Anwendungen wurden Textvorhersagen entwickelt. Vorhersagen wurden vom Radix-Tree- Algorithmus bereitgestellt, der in einer separaten Android-Bibliothek implementiert ist. Der Algorithmus zeigte eine gute Leistung bei gleichzeitig sparsamem Ressourcenverbrauch - er ergab Ergebnisse in zig Millisekunden bei einem Speicherverbrauch von 1,5 MB. Vollständig Leistungsindikatoren. Dies geschah jedoch nur mit dem isolierten Testen der Bibliothek auf der JVM.

Beim Verbinden der Bibliothek mit der Anwendung sind Probleme aufgetreten. Auf Android verlangsamte sich der Vorhersage-Algorithmus, die Ausgabe der Ergebnisse zog sich auf 7 Sekunden hin. Wow! Ja, in 7 Sekunden können Sie ein Wort manuell eingeben, löschen und richtig eingeben. Solche Vorhersagen waren nicht gut.

Die Analyse ergab keine Code-Probleme. Der Algorithmus funktionierte einwandfrei, verbrauchte streng zugeteilte Speicherkapazitäten, ließ sich nicht von fremden Prozessen ablenken, alles war asynchron, es gab viele Hardwareressourcen. Es gab nur eine Schlussfolgerung: Die virtuelle Maschine von Android Dalvik hat eine andere Leistung als die JVM, und innerhalb von Dalvik ist dieser Code zum Scheitern verurteilt.

Dann wurde entschieden, dass der Vorhersagealgorithmus aus Dalvik herausgenommen werden sollte. Dafür gibt es JNI - Java Native Interface . Ein Mechanismus, mit dem Sie in C / C ++ geschriebene Bibliotheksmethoden aus Java aufrufen können. Und umgekehrt rufen Sie in der C / C ++ - Bibliothek Java-Methoden auf.

Lösung


Um eine native Bibliothek zu erstellen, wurde Go ausgewählt. Nur weil es im Gegensatz zu C / C ++ Erfahrung damit gibt. Golang ist erstaunlich, aber dieser Weg hat seine Schwierigkeiten, da wir ein zusätzliches Maß an Komplexität erhalten. Für reines C / C ++ reicht es aus, das NDK zu verwenden und die Anweisungen auf der Android-Entwickler- Website zu befolgen . Für Golang mehr und Zusammenstellung golang für Android lernen haben, können Sie beginnen hier .

Vor uns lag ein Pfad voller Gefahren und Abenteuer. Aber jetzt ist dieser Weg bereits vollendet, und ich werde gerne seinen Plan teilen.

Planen Sie


Android-Entwicklungsumgebung:
  • Betriebssystem: Windows 7.
  • IDE: Eclipse mit ADT. Dieser Plan eignet sich aber auch für Android Studio.

Golang Entwicklungsumgebung:
  • Betriebssystem: Zum Kompilieren von Golang unter Android wird Linux verwendet. Ich verwende Ubuntu 14.04, das auf VirtualBox läuft.
  • Android SDK.
    - Laden Sie das Archiv mit der offiziellen Website des Android
    - auspacken, sagen,
    $HOME/android/android-sdk-linux
  • Java JDK.
    $ apt-get default-jdk
  • Gehe zu 1.5.
    Die aktuelle Version von Go ist 1.4. Aber ich konnte die Bibliothek nicht damit kompilieren, irgendwo habe ich einen Fehler beim Erstellen der Toolchain gemacht. Daher habe ich das gomobile- Paket aus der Entwicklungsversion von Go 1.5 verwendet, dessen Veröffentlichung noch geplant ist. Es gibt noch kein Release, die Installation von Go 1.5 ist hier beschrieben :
    - Go 1.4 installieren golang.org/doc/install
    - Das aktuelle Golang-Repository klonen:
    $ git clone https://go.googlesource.com/go $HOME/go
    - Kompilieren Sie die aktuelle Version von Go mit Go 1.4
    $ export GOROOT_BOOTSTRAP=/usr/local/go
    $ cd $HOME/go/src && ./make.bash
    $ export PATH=$PATH:$HOME/go/bin
  • Installieren und initialisieren Sie das gomobile-Paket.
    $ go get golang.org/x/mobile/cmd/gomobile
    $ gomobile init
    Das Initialisieren des Pakets dauert ziemlich lange.

Entwicklung der Golang-Bibliothek.
  • Ein reguläres Golang-Paket wird entwickelt, keine weiteren Empfehlungen. Exportmethoden werden von Android verfügbar sein.

Kompilieren der Golang-Bibliothek in die Android * .aar-Bibliothek.
  • Verwenden Sie den Befehl gomobile bind mit dem Pfad zu android sdk
    $ cd 
    $ ANDROID_HOME=$HOME/android/android-sdk-linux gomobile bind

Verbinden der * .aar-Bibliothek mit der Anwendung:
Übertragen Sie zunächst die * .aar-Bibliothek auf die Android-Entwicklungsmaschine. Weiter je nach IDE.

für die Sonnenfinsternis:
  • Entpacken Sie die * .aar-Bibliothek in ein temporäres Verzeichnis
  • Erstellen Sie in Eclipse ein neues Projekt aus vorhandenem Code, indem Sie in Element 1 ein temporäres Verzeichnis angeben
  • Beachten Sie, dass dieses Projekt eine Android-Bibliothek ist
  • Hängen Sie das Verzeichnis jni und die Datei classes.jar im Erstellungspfad des neuen Projekts ein
  • Verbinden Sie ein neues Projekt als Bibliothek mit dem Anwendungsprojekt
  • Kopieren Sie den Inhalt des jni-Ordners in den libs-Ordner des Anwendungsprojekts.
  • Kopieren Sie den Inhalt der Bibliothek proguard.txt in die Datei proguard.txt des Anwendungsprojekts (Schutz der go * -Klassen vor Verschleierung).
  • Bei nachfolgenden Aktualisierungen der * .aar-Bibliothek ist es ausreichend, die Dateien in den Ordnern jni, libs und der Datei classes.jar zu aktualisieren

für Android Studio:
  • Verbinden Sie die fertige * .aar-Bibliothek mit den Standardwerkzeugen von Android Studio mit dem Projekt. Leider habe ich solche Erfahrungen nicht, deshalb lasse ich dies als meine Hausaufgabe.

Aufruf nativer Bibliotheksmethoden von Android.
  • Bevor Sie die native Bibliothek in der Anwendung verwenden können, müssen Sie sie initialisieren. Ein geeigneter Ort dafür ist die onCreate-Methode:

    public class MyActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_my);
            Go.init(getContext());
        }
    } 
    
  • Die Methoden der Golang-Bibliothek sind über ein Paket mit demselben Namen verfügbar wie die, die Sie in Golang definiert haben. Zum Beispiel:
    golang:

    package radix
    …
    func Suggest(params string) string {
    	…
    }
    

    Java:
        suggestions = Radix.Suggest(params);
    

Ergebnis


Nach der Übertragung des Algorithmus in die native Bibliothek begannen die Vorhersagen noch schneller zu funktionieren als in der JVM - das Ergebnis wird in weniger als 10 ms zurückgegeben. Die Anzahl der Speicherbereinigungen hat sich ebenfalls verringert, da ein Teil der Ressourcen auf die Seite des systemeigenen Codes übertragen wurde.

Der Effekt der JNI-Implementierung hat die Erwartungen übertroffen. Mit diesen Anzeigen wurde die Tastatur freigegeben.

Fazit


Das Beschleunigen einer Android-Anwendung mit Golang ist keine Theorie, sondern eine echte Funktion, die bereits in Marktanwendungen verwendet wird.

Dies erschwert natürlich die Entwicklung von Anwendungen, der Werkzeugzoo verdoppelt sich. Damit lassen sich aber interessante Lösungen realisieren.

Mit der Veröffentlichung von Go 1.5 wird erwartet, dass die Integration von Android-Golang durch das Gomobile-Toolkit, das den gesamten Prozess auf zwei Teams reduziert, noch einfacher wird.

Jetzt auch beliebt: