Jestem w „ szczególnej ” sytuacji związanej z wydajnością mojego programu. Teraz jestem na etapie, w którym muszę poprawić wydajność aplikacji i zmniejszyć zużycie baterii .
Przed pytaniem:
- Przede wszystkim działa moja aplikacja. To działa dobrze - żadnych błędów nie ponosi jakiejkolwiek .
- Po drugie , przeczytałem Optymalizacja żywotności baterii na stronie dla programistów Androida i zoptymalizowałem małe rzeczy, o które prosili. No problems whatsoever .
Teraz jestem ciekawy, aby dowiedzieć się o specjalnych poprawkach innych programistów, których użyli do optymalizacji własnych aplikacji. Rzeczy, których użytkownicy mogą nigdy nie rozpoznać lub na które nie zwrócić uwagi. Jednak poprawki albo wydłużą żywotność baterii, albo pomogą usprawnić konserwację aplikacji.
Więc jaka jest twoja unikalna sztuczka optymalizacji?
Jestem w szczególnej sytuacji, w której naprawdę szukam wiedzy i myślę, że będzie to świetna okazja do podzielenia się wiedzą programistów na temat sytuacji, w której wszyscy się znaleźli.
Głosujcie na świetne odpowiedzi, ponieważ zachęcą to świetnych programistów do podzielenia się swoją wiedzą.
źródło
Odpowiedzi:
W pewnym momencie dojdziesz do punktu, w którym używanie znanych sztuczek osiągnie swoje granice. Najlepszą rzeczą do zrobienia w tym momencie jest profilowanie kodu i sprawdzenie, które obszary są wąskimi gardłami w oparciu o Twoje konkretne wymagania.
Badanie użycia pamięci RAM za pomocą MAT i Traceview : artykuł o tym, jak używać narzędzi do profilowania aplikacji.
źródło
Śledź i ograniczaj przydziały. Im więcej przydzielisz, tym częściej moduł odśmiecania pamięci będzie musiał działać, zatrzymując proces przed wykonywaniem jakichkolwiek innych czynności przez stosunkowo długi czas, na przykład 100 ms.
Najlepszym narzędziem, jakie znam, jest śledzenie alokacji zawarte w DDMS .
Nie tylko GC może mieć wpływ na wrażenia użytkownika, ale zbędne alokacje i GC pochłaniają część zasobów obliczeniowych.
Oto przykład i mała sztuczka. W mojej aplikacji mam zegar, który pokazuje aktualny czas (audio), z uwzględnieniem dziesiątych części sekundy. Jest to często aktualizowane. TextView wykonuje wewnętrzne alokacje za każdym razem, gdy wywołujesz metodę setText () z CharSequence. Ale nie alokuje niczego z wariantem setText (char [] text, int start, int len). Nie jest to udokumentowane i nikt nie odpowiedział, kiedy o to zapytałem.
Takich jest wiele. I to jest jeden z powodów, dla których moja aplikacja zawiera 50% kodu natywnego (ale są też inne powody).
Oprócz tego mogę polecić eksperymentowanie z ProGuard . Wykonuje kilka przejść optymalizacyjnych i rejestruje takie informacje, jak nieużywane metody w projekcie, co może pomóc w usunięciu pozostałości w kodzie.
źródło
Jeśli Twoja aplikacja będzie miała dużo czasu przed ekranem, używaj czarnego, gdzie tylko możesz . Zmniejszy to zużycie baterii w najgorszej części urządzenia: ekranie, szczególnie w telefonach i tabletach AMOLED.
źródło
W przypadku aplikacji z wieloma działaniami sprawdź, czy nie uruchamiasz ponownie działań, które trzeba tylko przenieść na pierwszy plan, używając odpowiednich flag intencji. Sprawdź, czy sterta jest pod kontrolą i czy niepotrzebne widoki, powiązania i konteksty nie są tworzone.
Uważam, że najlepszym narzędziem do pokazania tego wszystkiego podczas działania aplikacji jest:
źródło
Korzystając z SQLlite, należy zwrócić szczególną uwagę na indeksy. Nie zakładaj niczego. Otrzymałem ogromne przyspieszenia w Zwitscher, kiedy umieszczałem indeksy na kolumnach powszechnie używanych do wyszukiwania.
źródło
Kilka wskazówek, które pomogą Ci zoptymalizować aplikację pod kątem interfejsu użytkownika :
użyj
convertView
dla adapterów list - byłoby bardzo drogie, gdybyś utworzył nowy widok wewnątrz,Adapter.getView()
ponieważ ta procedura jest wywoływana dla każdej pozycji na liście. UżycieconvertView
umożliwia ponowne użycie już utworzonego widoku. Dobry przykład (wraz z wykorzystaniemViewHolder
) można znaleźć w ApiDemos .Może się zdarzyć, że układy nie są w pełni zoptymalizowane i można je ulepszyć (na przykład za pomocą scalania lub usuwania elementów nadrzędnych). Układ narzędzia Android znajdzie dla Ciebie taką sytuację. Może być używany z HierarchyViewer do inspekcji poszczególnych widoków. Więcej informacji tutaj .
usuń tło do rysowania - framework Androida miał (czy nadal ma?) problem z wykrywaniem widoków do narysowania. Istnieje szansa, że Twoje (domyślne) tło do rysowania zostanie narysowane tylko po to, aby następnie zostać ukryte przez nieprzezroczysty interfejs użytkownika. Aby pozbyć się tego marnotrawnego rysunku, po prostu usuń tło do rysowania.
Można to zrobić za pomocą niestandardowego stylu
Kilka wskazówek, które pomogą Ci zoptymalizować aplikację pod kątem wykorzystania baterii :
sprawdź typ sieci i poczekaj, aż użytkownik znajdzie się w obszarze z wifi lub 3G (a nie roamingiem) i dopiero wtedy pozwól mu korzystać z połączenia
Jeśli to możliwe, używaj gzip do danych tekstowych, aby przyspieszyć pobieranie i analizowanie
przetwarzaj złożone obiekty Java, takie jak
XmlPullParserFactory
/BitmapFactory
/StringBuilder
/Matcher
itp.Aby uzyskać więcej sztuczek dotyczących baterii, zobacz Kodowanie na całe życie - to znaczy żywotność baterii .
źródło
Coś do przemyślenia: NIE nadużywaj String, na przykład w ogromnej pętli. Spowoduje to utworzenie wielu obiektów typu String, które będą musiały zostać poddane GC. Przykład „Złe kodowanie” da 2 obiekty łańcuchowe w każdej pętli. W następnym przykładzie zostanie utworzony tylko jeden końcowy ciąg i jeden program budujący ciąg. To robi ogromną różnicę przy optymalizacji dużych pętli pod kątem szybkości. Podczas tworzenia aplikacji Wordlist Pro na Androida często używałem narzędzia stringbuilder i stało się naprawdę szybkie, gdy przechodziłem przez 270000 słów w mgnieniu oka.
Napisałem na ten temat bardziej rozbudowany wpis na blogu. przeczytaj tutaj
źródło
Wydaje mi się, że używanie zmiennych „końcowych” wszędzie tam, gdzie jest to możliwe, mogłoby również poprawić szybkość wykonywania.
źródło
Zoptymalizuj swoje obrazy PNG za pomocą narzędzi takich jak OptiPNG i PNGCrush, aby zaoszczędzić kilka (kilogramów) bajtów z rozmiaru APK. Również tutaj mają zastosowanie wskazówki dotyczące optymalizacji obrazu dla witryn internetowych: użyj odpowiednich formatów obrazu, baw się kompresją JPG, rozważ użycie przezroczystości binarnych zamiast 8-bitowych itp.
Jeśli wysyłasz duże pliki PNG z kanałem alfa, możesz zamienić część rozmiaru APK na szybkość uruchamiania i użyć oddzielnych plików JPG dla kanałów RGB i A .
Jeśli tworzysz połączenia HTTP, sprawdź, czy Twój klient HTTP wykorzystuje kompresję treści. Jeśli buforuje otrzymane odpowiedzi HTTP, sprawdź, czy poprawnie rozumie i używa nagłówków HTTP związanych z buforowaniem.
źródło
Jeśli masz operacje sieciowe, spróbuj ponownie użyć tej samej instancji httpclient. Unikaj używania wyrażeń regularnych.
źródło
Spróbuj użyć DDMS do śledzenia wszystkich wątków uruchomionych w systemie. Na przykład zauważyłem, że używam webview do wyświetlania treści html, zauważyłem, że tworzy kilka wątków do zarządzania sesjami zarządzania plikami cookie itp., Co zwiększa zużycie pamięci. Więc jeśli nie masz poważnej potrzeby wyświetlania złożonego kodu HTML, spróbuj użyć zwykłej klasy narzędzi „Html” w systemie Android, aby wyświetlić zawartość HTML. Może to być przydatne dla osób, które wyświetlają Eula, ponieważ eula zazwyczaj zawiera tekst HTML.
Jeśli musisz wykonywać operacje sieciowe, spróbuj użyć AndroidHttpClient, jeśli jesteś początkującym, ma dobre możliwości buforowania sesji SSL i wszystko to naprawdę pomaga w poprawie wydajności. Zawsze ustawiaj limity czasu połączenia na około 60 sekund lub jakieś skończone wartości, ponieważ nieskończone limity czasu mogą powodować zakleszczenia, zwłaszcza jeśli zrywasz połączenie podczas uzgadniania protokołu SSL.
źródło
Użyj narzędzia Android Resource Tracker, aby znaleźć nieużywane zasoby w projekcie, które można usunąć.
źródło
Unikaj używania XPath, jeśli możesz przeanalizować dane wejściowe XML za pomocą procedur manipulowania ciągami, aby uzyskać tekst między tagami. Przetestowałem i mogę potwierdzić 10-krotną poprawę w tym przypadku, na zestawie danych zawierającym 50000 elementów, na HTC Desire.
źródło
Wiem, że dołączam do tej rozmowy nieco później, ale byłoby idealnie mieć wiele dobrych wskazówek w jednym miejscu, więc mam nadzieję, że ten wątek będzie żył i dość często aktualizowany. Moje wskazówki:
..zostanie zaktualizowany ..
źródło