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:
- Zuallererst meine Bewerbungsarbeit. Es läuft gut - keine Fehler überhaupt .
- Zweitens habe ich Optimieren der Akkulaufzeit auf der Android-Entwickler-Website gelesen und kleine Dinge optimiert, die sie angefordert haben. Keine Probleme überhaupt .
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.
quelle
Antworten:
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.
quelle
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.
quelle
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.
quelle
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:
quelle
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.
quelle
Einige Tipps, mit denen Sie Ihre App in Bezug auf die Benutzeroberfläche optimieren können :
Verwendung
convertView
fü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. MitconvertView
können Sie die bereits erstellte Ansicht wiederverwenden. Ein gutes Beispiel (zusammen mit der Verwendung vonViewHolder
) 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
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
/Matcher
usw.Weitere Batterietricks finden Sie unter Codierung für die Lebensdauer - Batterielebensdauer .
quelle
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.
Ich habe einen ausführlicheren Blogpost über die Angelegenheit geschrieben. Lies hier
quelle
Ich denke, die Verwendung von "endgültigen" Variablen überall dort, wo es möglich ist, könnte auch die Ausführungsgeschwindigkeit verbessern.
quelle
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.
quelle
Wenn Sie Netzwerkvorgänge haben, versuchen Sie, dieselbe httpclient-Instanz erneut zu verwenden. Vermeiden Sie reguläre Ausdrücke.
quelle
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.
quelle
Verwenden Sie den Android Resource Tracker , um nicht verwendete Ressourcen in Ihrem Projekt zu finden, die gelöscht werden können.
quelle
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.
quelle
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:
..wird geupdated..
quelle