Optimierung der Android-Anwendung vor der Veröffentlichung [geschlossen]

120

Ich bin in einer " besonderen " Situation bezüglich der Effizienz meines Programms. Jetzt bin ich in einer Phase, in der ich die Leistung der Anwendung verbessern und den Batterieverbrauch senken muss .

Vor der Frage:

Jetzt bin ich gespannt auf die speziellen Korrekturen anderer Entwickler, mit denen sie ihre eigenen Anwendungen optimiert haben. Dinge, die Benutzer möglicherweise nie erkennen oder beachten. Die Korrekturen verlängern jedoch entweder die Batterielebensdauer oder tragen zur Verbesserung der Wartung der Anwendung bei.

Also, was ist Ihr einzigartiger Optimierungs Trick (n)?

Ich bin in einer bestimmten Situation, in der ich wirklich nach Wissen suche, und ich denke, dies ist eine großartige Gelegenheit, um Entwicklern Wissen über eine Situation zu vermitteln, in der sie sich alle befunden haben.

Bitte stimmen Sie großartige Antworten ab, da dies großartige Entwickler dazu ermutigt, ihr Wissen zu teilen.

Wroclai
quelle
2
Da Effizienz letztendlich darauf hinausläuft, nichts zu tun, was Sie nicht (oder öfter als nötig) tun müssen, würde viel davon abhängen, welche Art von Dingen Ihre Anwendung ausführen muss ... Ohne dies anzugeben, alles, was Sie tun kann tun, ist eine Sammlung von "üblichen Verdächtigen"
Chris Stratton
1
@ Chris Stratton: Nun, du hast recht. Aber auch "übliche Verdächtige" oder eine kleine Antwort auf einen bestimmten Trick erleichtern es anderen, eine Entscheidung zu treffen, ob diese "Vermutung" das ist, wonach sie suchen (und ob sie für ihre spezifische Situation nützlich ist).
Wroclai
Lächerlich, wie viele wirklich interessante Fragen auf dieser Seite geschlossen werden.
Patrick
Lesen Sie diesen Blogpost medium.com/@hammad_tariq/…
Developine

Antworten:

68

Irgendwann werden Sie an den Punkt gelangen, an dem die Verwendung bekannter Tricks an ihre Grenzen stößt. Das Beste, was Sie an dieser Stelle tun können, ist, Ihren Code zu profilieren und zu sehen, welche Bereiche die Engpässe sind, basierend auf Ihren spezifischen Anforderungen.

Untersuchen der RAM-Nutzung mithilfe von MAT und Verwenden von Traceview : Ein Artikel zur Verwendung der Tools zum Profilieren Ihrer Anwendung.

unholysampler
quelle
Vielen Dank! Ich mag Antworten mit Ressourcen sehr. :-)
Wroclai
1
Lesen Sie diesen Blogpost. medium.com/@hammad_tariq/…
Developine
37

Verfolgen und Squash-Zuordnungen. Je mehr Sie zuweisen, desto häufiger muss der Garbage Collector ausgeführt werden, sodass Ihr Prozess für relativ lange Zeiträume, z. B. 100 ms oder so, keine weiteren Aktionen ausführen kann.

Das beste Tool, das ich dafür kenne, ist der Allocation Tracker, der in DDMS enthalten ist .

Nicht nur GC kann sich auf die Benutzererfahrung auswirken, auch überflüssige Zuordnungen und GC verbrauchen einige Rechenressourcen.

Hier ist ein Beispiel und ein kleiner Trick. In meiner App habe ich eine Uhr, die die aktuelle (Audio-) Zeit einschließlich Zehntelsekunden anzeigt. Dies wird häufig aktualisiert. Und TextView führt Zuweisungen intern durch, wenn Sie setText () mit einer CharSequence aufrufen. Mit der Variante setText (char [] text, int start, int len) wird jedoch nichts zugeordnet. Dies ist nicht dokumentiert und niemand antwortete, als ich danach fragte.

Es gibt viele davon. Und dies ist einer der Gründe, warum meine App 50% nativen Code enthält (aber es gibt noch andere Gründe).

Abgesehen davon kann ich empfehlen, dass Sie mit ProGuard experimentieren . Es führt mehrere Optimierungsdurchläufe durch und protokolliert Informationen als nicht verwendete Methoden innerhalb des Projekts, mit denen Sie Reste in Ihrem Code entfernen können.

olivierg
quelle
1
Gute Antwort! Konkrete Tricks werden geschätzt.
Wroclai
22

Wenn Ihre App viel Zeit auf dem Bildschirm hat, verwenden Sie Schwarz, wo immer Sie können . Dadurch wird der Batterieverbrauch des schlechtesten Teils des Geräts reduziert: des Bildschirms, insbesondere bei AMOLED-Telefonen und -Tablets.

Aleadam
quelle
Der umsichtige Einsatz dunkler Farben bedeutet einen Gewinn für die Batterie.
Robert Massaioli
7
Auf der anderen Seite verbraucht Schwarz auf LCD-Bildschirmen mehr Strom als Weiß, da das Licht (das von der Hintergrundbeleuchtung stammt) weiß beginnt und aktiv blockiert werden muss, um Schwarz zu erzeugen. [ Scientificamerican.com/article.cfm?id=fact-or-fiction-black-is ] Fazit: Zählen Sie bei dieser Farboptimierung nicht zu viel.
Sparky
16

Stellen Sie bei Anwendungen mit mehreren Aktivitäten sicher, dass Sie keine Aktivitäten neu starten, die nur mit den entsprechenden Intent-Flags in den Vordergrund gerückt werden müssen. Stellen Sie sicher, dass Ihr Heap unter Kontrolle ist und keine unnötigen Ansichten, Bindungen und Kontexte erstellt werden.

Ich finde, das beste Tool, um Ihnen all dies zu zeigen, während die App ausgeführt wird, ist:

adb shell dumpsys meminfo 'your apps package name'
NickT
quelle
1
Oh, das war neu. Danke für das Teilen!
Wroclai
15

Achten Sie bei der Verwendung von SQLlite besonders auf Indizes. Nimm nichts an. Ich habe in Zwitscher enorme Beschleunigungen erhalten, als ich Indizes für Spalten erstellt habe, die üblicherweise für die Suche verwendet werden.

Heiko Rupp
quelle
13

Einige Tipps, mit denen Sie Ihre App in Bezug auf die Benutzeroberfläche optimieren können :

  • Verwendung convertViewfür Listenadapter - Es wäre sehr teuer, wenn Sie eine neue Ansicht im Inneren erstellen würden, Adapter.getView()da diese Routine für jede Position in der Liste aufgerufen wird. Mit convertViewkönnen Sie die bereits erstellte Ansicht wiederverwenden. Ein gutes Beispiel (zusammen mit der Verwendung von ViewHolder) finden Sie in ApiDemos .

  • Es kann vorkommen, dass Ihre Layouts nicht vollständig optimiert sind und verbessert werden können (z. B. durch Zusammenführen oder Entfernen von Eltern). Android Tool layoutopt wird eine solche Situation für Sie finden. Es kann mit HierarchyViewer zum Überprüfen einzelner Ansichten verwendet werden. Mehr Infos hier .

  • Entfernen des Hintergrunds zum Zeichnen - Das Android-Framework hatte früher (hat es noch?) ein Problem beim Erkennen, welche Ansichten gezeichnet werden sollten. Es besteht die Möglichkeit, dass Ihre (Standard-) Hintergrundzeichnung gezeichnet wird, um anschließend von Ihrer undurchsichtigen Benutzeroberfläche ausgeblendet zu werden. Um diese verschwenderische Zeichnung loszuwerden, entfernen Sie einfach den Hintergrund, der gezeichnet werden kann.

Dies kann mit einem benutzerdefinierten Stil erfolgen

<resources>
    <style name="Theme.NoBackground" parent="android:Theme">
        <item name="android:windowBackground">@null</item>
    </style>
</resources>

Einige Tipps, mit denen Sie Ihre App hinsichtlich des Batterieverbrauchs optimieren können:

  • Überprüfen Sie den Netzwerktyp und warten Sie, bis der Benutzer mit WLAN oder 3G (und nicht mit Roaming) in den Bereich gelangt, und lassen Sie ihn erst dann die Verbindung verwenden

  • Verwenden Sie gzip für Textdaten, wann immer dies möglich ist, um das Herunterladen und Parsen zu beschleunigen

  • Recyceln Sie komplexe Java-Objekte wie XmlPullParserFactory/ BitmapFactory/ StringBuilder/ Matcherusw.

Weitere Batterietricks finden Sie unter Codierung für die Lebensdauer - Batterielebensdauer .

youri
quelle
"Recyceln Sie komplexe Java-Objekte wie ..." Wie? während Java GC hat
Yousha Aleayoub
9

Denken Sie darüber nach: Verwenden Sie String NICHT übermäßig, z. B. in einer großen Schleife. Dadurch werden viele String-Objekte erstellt, die GC-geprüft werden müssen. Das Beispiel "Schlechte Codierung" erzeugt in jeder Schleife 2 Zeichenfolgenobjekte. Das nächste Beispiel erzeugt nur einen endgültigen String und einen einzelnen Stringbuilder. Dies macht einen großen Unterschied bei der Optimierung großer Schleifen für die Geschwindigkeit. Ich habe viel Stringbuilder verwendet, als ich meine Wordlist Pro Android-App erstellt habe, und es wurde sehr schnell, als ich in kürzester Zeit 270000 Wörter durchging.

    //Bad coding:
    String s = "";
    for(int i=0;i<999999;i++){
        s = "Number=";
        s = s + i;
        System.out.println(s);
    }

    //Better coding
    final String txt = "Number=";
    StringBuilder sb = new StringBuilder();
    for(int i=0;i < 999999;i++){
        sb.setLength(0);
        sb.append(txt);
        sb.append(i);
        System.out.println(sb);
    }

Ich habe einen ausführlicheren Blogpost über die Angelegenheit geschrieben. Lies hier

ernell
quelle
6

Ich denke, die Verwendung von "endgültigen" Variablen überall dort, wo es möglich ist, könnte auch die Ausführungsgeschwindigkeit verbessern.

Stan
quelle
1
Ich erinnere mich, dass ich das irgendwo gelesen habe. Könnten Sie einen Link bereitstellen?
Wesley Wiser
1
Nicht so sicher, ob dies für endgültige Variablen zutrifft, aber für statische endgültige Variablen gelten kann - siehe stackoverflow.com/questions/3117770/…
Alistair Collins,
Ich kann den Link nicht bereitstellen, aber ich habe einen Hinweis dazu in "Anfängerleitfaden für Android" von Reto Meier (19. Mai 2010) / Google IO erhalten. Es ist kurz, kann kostenlos heruntergeladen werden und enthält gute Tipps zum Erstellen einer guten App.
Stan
2
Endgültige Variablen könnten den Code effizienter machen, da dies bedeutet, dass alle Objekte im selben Lauf GC-geprüft werden. Nicht zu unterschiedlichen Zeiten, je nachdem, wann Sie sie auf null setzen.
Robert Massaioli
1
Frage: Tut der Compiler das nicht explizit für Sie? Ich denke, es sollte es in seiner Code-Analyse-Phase tun.
Pawan
6

Optimieren Sie Ihre PNG-Bilder mit Tools wie OptiPNG und PNGCrush , um einige ( Kilo- ) Bytes der APK-Größe zu sparen . Auch hier gelten Tipps zur Bildoptimierung für Websites: Verwenden Sie geeignete Bildformate, spielen Sie mit der JPG-Komprimierung, verwenden Sie Binärfolien anstelle von 8-Bit-Folien usw.

Wenn Sie große PNGs mit Alpha-Kanal versenden, können Sie eine APK-Größe gegen Startgeschwindigkeit eintauschen und separate JPGs für RGB- und A-Kanäle verwenden .

Wenn Sie HTTP-Verbindungen herstellen, überprüfen Sie, ob Ihr HTTP-Client die Inhaltskomprimierung verwendet. Wenn zwischengespeicherte HTTP-Antworten zwischengespeichert werden, überprüfen Sie, ob die HTTP-Header im Zusammenhang mit dem Caching korrekt verstanden und verwendet werden.

Pēteris Caune
quelle
Danke für den Einblick! Ich habe noch nie davon gehört!
Wroclai
5

Wenn Sie Netzwerkvorgänge haben, versuchen Sie, dieselbe httpclient-Instanz erneut zu verwenden. Vermeiden Sie reguläre Ausdrücke.

Naresh
quelle
Grund? kannst du erklären warum?
Yousha Aleayoub
5

Versuchen Sie, mit DDMS alle im System ausgeführten Threads zu verfolgen. Zum Beispiel habe ich festgestellt, dass ich Webview zum Anzeigen von HTML-Inhalten verwendet habe. Ich habe festgestellt, dass nur wenige Threads für die Verwaltung von Cookie-Verwaltungssitzungen usw. erstellt werden, was meinen Speicherbedarf erhöht. Wenn Sie also nicht ernsthaft komplexe HTML-Dateien anzeigen müssen, verwenden Sie die normale Dienstprogrammklasse "Html" in Android, um HTML-Inhalte anzuzeigen. Dies kann für Personen nützlich sein, die Eula anzeigen, da Eula normalerweise HTML-Text enthält.

Wenn Sie Netzwerkvorgänge ausführen müssen, versuchen Sie es mit AndroidHttpClient, wenn Sie Anfänger sind. Es verfügt über einige gute Funktionen zum Zwischenspeichern von SSL-Sitzungen und alles, was wirklich zur Verbesserung Ihrer Leistung beiträgt. Stellen Sie das Zeitlimit für Ihre Socket-Verbindung immer auf etwa 60 Sekunden oder einige endliche Werte ein, da unendliche Zeitlimits zu Deadlocks führen können, insbesondere wenn Sie Ihre Verbindung während des SSL-Handshakes trennen.

Naresh
quelle
4

Verwenden Sie den Android Resource Tracker , um nicht verwendete Ressourcen in Ihrem Projekt zu finden, die gelöscht werden können.

FrVaBe
quelle
4

Vermeiden Sie die Verwendung von XPath, wenn Sie Ihre XML-Eingabe mithilfe von Routinen zur Zeichenfolgenmanipulation analysieren können, um den Text zwischen den Tags abzurufen. Ich habe eine 10-fache Verbesserung in diesem Fall an einem 50000-Elemente-Datensatz auf einem HTC Desire getestet und kann diese bestätigen.

luvieere
quelle
3

Ich weiß, dass ich mich etwas später diesem Gespräch anschließe, aber es wäre perfekt, viele gute Tipps an einem Ort zu haben, also hoffe ich, dass dieser Thread ziemlich oft lebendig und aktualisiert wird. Meine Tipps:

  • Blockieren Sie den UI-Thread nicht mit teuren Jobs. Der Benutzer verlässt ihn, wenn die App keine Antwort gibt (verwenden Sie AsyncThreads).
  • Verwenden Sie den LINT neue Tool , mit dem Android-Projektquellen auf mögliche Fehler überprüft werden.

..wird geupdated..

Ewoks
quelle