Wskazówki dla programistów Androida, aby zmniejszyć rozmiar pliku APK
Opublikowany: 2015-10-281) ProGuard
Narzędzie do zmniejszania kodu, takie jak ProGuard, znacznie zmniejszy rozmiar pliku APK. Narzędzie jest dostępne na Sourceforge. Zauważ, że bardzo ważne jest ponowne przetestowanie całej aplikacji po zastosowaniu ProGuard, ponieważ czasami może to zmienić zachowanie aplikacji. Ponieważ ProGuard zastępuje symbole aplikacji, aby kod był trudny do odczytania, ważne jest zachowanie mapowania symboli, aby móc przetłumaczyć ślad stosu z powrotem na oryginalne symbole, jeśli trzeba zbadać awarię aplikacji.
2) Usunięcie informacji debugowania
Zalecam usunięcie z aplikacji wszystkich funkcji związanych z debugowaniem. Aplikacja generalnie nie widzi ani nie używa tych danych, a system operacyjny Android nie wymaga ich do uruchomienia aplikacji. W związku z tym informacje debugowania tylko marnują miejsce i powinny zostać usunięte.
Aby to osiągnąć, wszystkie funkcje związane z debugowaniem muszą być zawarte w blokach warunkowych, jak poniżej:
statyczne debugowanie końcowe = fałsz; jeśli (debugowanie) { v(TAG, "Debuguj…") }
Ważne jest, aby flaga debugowania była ustawiona w czasie kompilacji (tj. zadeklarowana jako statyczna wersja końcowa), aby kompilator mógł całkowicie usunąć wszystkie funkcje debugowania. Tworzenie własnej metody debugowania, takiej jak pokazana poniżej, nie jest dobrym pomysłem, ponieważ wywołanie myDebugPrint() nie jest ujęte w blok warunkowy, co oznacza, że kompilator musi zachować informacje o myDebugPrint() w wywołującej klasie.
public void myDebugPrint() jeśli (Debugowanie) v(TAG, "Debuguj..."); } } … mójDrukDebug()
3) Usuwanie symboli debugowania z bibliotek natywnych Używanie symboli debugowania ma sens, jeśli aplikacja jest nadal w fazie rozwoju i nadal wymaga debugowania. Ale jeśli symbole debugowania nadal są wyświetlane podczas kompilowania kompilacji wydania i jeśli chcesz je usunąć, zalecamy usunięcie symboli debugowania z bibliotek natywnych (plików .so). Odbywa się to za pomocą polecenia arm-eabi-strip z Android NDK.
4) Zalecane formaty multimediów Jeśli aplikacja w dużym stopniu opiera się na obrazach, audio lub wideo, innym sposobem na zmniejszenie rozmiaru pliku APK jest użycie określonych formatów multimediów. Zalecamy używanie następujących formatów multimediów dla obrazów, audio i wideo:
- Wideo: użyj H264 AVC. Zakoduj wideo do rozdzielczości nie większej niż rozdzielczość ekranu urządzenia docelowego (jeśli jest znana).
- Audio : AAC Audio jest zalecane dla wszystkich zasobów audio. AAC osiąga lepszą kompresję przy danej jakości w porównaniu z mp3 lub Ogg Vorbis. Nigdy nie należy używać surowych formatów, takich jak WAV. Powszechnym powodem używania formatu WAV jest to, że dekodowanie skompresowanych strumieni audio zwykle oznacza duże opóźnienia podczas odtwarzania. Jednak system Android udostępnia interfejs API Sound Pool, który umożliwia aplikacjom korzystanie ze skompresowanych strumieni audio bez kary w postaci dużego opóźnienia.
- Obrazy : PNG lub JPEG. Użyj PNG; ponieważ jest to format bezstratny, doskonale nadaje się do tekstur i grafiki, ponieważ kompresja nie powoduje żadnych wizualnych artefaktów. Jeśli istnieją ograniczenia miejsca, użyj plików JPEG lub kombinacji plików PNG i JPEG. Wysokiej jakości obraz JPEG może działać dobrze w przypadku dużych fotorealistycznych obrazów, dla których zoptymalizowano schemat kompresji JPEG.
- Optymalizuj rozmiary PNG bez utraty jakości
Jeśli używasz formatu PNG, obrazy PNG można zmniejszyć w rozmiarze pliku bez utraty jakości. Aby to zrobić, użyj narzędzia takiego jak OptiPNG lub PNGCrush. Oba doskonale nadają się do zmniejszania rozmiaru pliku PNG przy jednoczesnym zapewnieniu jakości obrazu. PNGcrush to program o otwartym kodzie źródłowym, który iteruje po filtrach PNG i parametrach zlib (Deflate), kompresuje obraz wielokrotnie przy użyciu każdej konfiguracji parametrów i wybiera konfigurację, która daje najmniejsze skompresowane dane wyjściowe (IDAT). Z drugiej strony OptiPNG wykonuje próby całkowicie w pamięci i zapisuje na dysku tylko końcowy plik wyjściowy. Co więcej, oferuje użytkownikowi wiele ustawień wstępnych optymalizacji.
5) Usuń nieużywane zasoby Inną potencjalną grupą marnotrawców miejsca, którą należy rozważyć przy usunięciu z pliku APK, są nieużywane zasoby w katalogu res, takie jak nieużywane układy, rysunki i kolory. Aby wykryć nieużywane zasoby w pliku APK, które można usunąć, użyj narzędzia Android-unused-resources. Android Unused Resources to aplikacja Java, która skanuje Twój projekt w poszukiwaniu nieużywanych zasobów.
6) Unikaj duplikacji Upewnienie się, że aplikacja nie ma zduplikowanych funkcji lub zduplikowanych zasobów, jest oczywistym sposobem na uniknięcie niepotrzebnych plików w pakiecie APK. Ważne jest, aby zrozumieć, jakich interfejsów API systemu Android używasz, oraz poznać pełną funkcjonalność każdego z nich. Możliwe, że jeden Android API wykonuje już pracę innego API. Zduplikowane zasoby (ciągi, bitmapy itp.) to również strata miejsca i można ich łatwo uniknąć. W mniejszym stopniu zduplikowany kod będzie również niepotrzebnie zwiększał rozmiar dostarczanego pliku binarnego.
7) Zmniejsz liczbę metod Programiści Avid na Androida od dawna borykają się z powodującym ból głowy problemem ze swoimi aplikacjami. Liczba metod, jakie może mieć aplikacja, jest ograniczona. Cóż, kiedyś było to ograniczone. W końcu dobrzy ludzie z Google dostarczyli rozwiązanie w październiku zeszłego roku, ale było to dalekie od ideału. Choć bardzo łatwe do wdrożenia, rozwiązanie multidex skomplikowało i znacznie wydłużyło czas kompilacji. Nie stojąc w miejscu, począwszy od Lollipop (Android 5.0), cała maszyna wirtualna Androida została zrewolucjonizowana, aby zaoferować znacznie trwalsze rozwiązanie, takie, które poprawia nawet regularny czas kompilacji. Jednak na razie rozwiązanie Lollipop też nie jest idealne. Wymaga od programistów rozwijania się tylko w Lollipop, co może być problematyczne, ponieważ większość aplikacji chce być zgodna z szerszym zakresem odbiorców i może obawiać się korzystania z funkcji, które nie są dostępne we wcześniejszych wersjach Androida. W tej chwili rozwiązanie Lollipop jest dobrym rozwiązaniem dla Androida przyszłości, ale może nie mieć większego wpływu w przewidywalnej teraźniejszości. Co więc można zrobić w międzyczasie? Wszyscy zgadzamy się, że nie należy rezygnować z funkcji i możliwości, aby uniknąć przekroczenia limitu 65 000. Ale nie ma wątpliwości, że najlepszą praktyką byłoby nadal zmniejszenie liczby metod aplikacji. Jak więc nadal próbować zmniejszyć liczbę metod, nie tracąc tej małej iskry, która sprawia, że Twoja aplikacja jest wyjątkowa?
Krótki przegląd: „Skąd pochodzą te wszystkie metody?”
Limit liczby metod wynosi około 65 000 metod (dokładnie 65 536). To brzmi jak ogromna liczba. Jeśli jesteś początkującym programistą Androida, możesz pomyśleć „jak u licha tak wiele aplikacji może tak szybko osiągnąć tę liczbę?” Prawdopodobnie miałbyś trochę racji. Nie jest łatwo samodzielnie napisać tyle metod. Ale twórcy aplikacji nie piszą całej swojej aplikacji samodzielnie. Twórcy aplikacji korzystają z coraz większej liczby bibliotek innych firm (SDK – Software Development Kits), które pomagają im osiągnąć określone cele i funkcje, które w przeciwnym razie musieliby opracować całkowicie samodzielnie. Od reklam, przez ulepszenia GUI po sieci społecznościowe, raporty o awariach i wiele innych, pakiety SDK oferują szeroki zakres funkcji i interfejsów API, które oszczędzają cenny czas programowania i pomagają szybciej udostępniać Twoją aplikację. Ale każdy pakiet SDK zwiększa liczbę metod, a niektóre pakiety SDK robią nawet więcej niż tylko to, na co się targowałeś. Oczywiście niekoniecznie jest to zła rzecz. Jednak coup de grace przyszło od samych Google. Ich zestaw usług Google Play to duży pakiet SDK zawierający ponad 28 000 metod. Ponieważ limit wynosi 65 000, liczba ta nie jest dokładnie niska. Wielu twórców aplikacji chciałoby korzystać z tego pakietu SDK, ponieważ otwiera on drzwi do magicznego królestwa Google, bardzo pożądanej funkcji, która dodaje wiele wartości do aplikacji. W tym poście nie tylko wyjaśnię, jak selektywnie korzystać z pakietów usług Google Play, ale także przedstawię informacje o tym, ile metod każdy z tych pakietów dodaje do Twojej aplikacji. Więc trzymaj się swoich miejsc, to będzie wyboista jazda.
Plac zabaw z usługami Google Play
Ile metod faktycznie dodają Usługi Google Play? Cóż, jak wszystko w życiu, jest to znacznie bardziej skomplikowane niż tylko wynik końcowy. Ale zróbmy to krok po kroku. Pakiet SDK Usług Google Play zawiera w rzeczywistości 19 różnych pakietów SDK. Dzięki Gradle możesz selektywnie wybierać, których chcesz użyć. Wszystko, co musisz zrobić, to dodać następującą zależność do pliku build.gradle modułu aplikacji:
zależności { skompiluj „com.google.android.gms:play-services:7.5.0” }
Ponieważ 7.5.0 jest najnowszą wersją GPS wydaną w tym czasie. Jest oznaczony jako wersja 25 w Menedżerze Android SDK. Aby wybrać określone pakiety, zastąp poniższy wiersz dowolną liczbą wierszy zależności, określając konkretne pakiety. Powiedz na przykład, że chcesz po prostu Google Plus, Google Games, Google Ads i Google Maps:
zależności { skompiluj „com.google.android.gms:play-services-plus:7.5.0” skompiluj „com.google.android.gms:play-services-games:7.5.0” skompiluj „com.google.android.gms:play-services-ads:7.5.0” skompiluj „com.google.android.gms:play-services-maps:7.5.0” }
Niezbyt trudne, ale oto pierwszy haczyk. Jeden ze wspaniałych 19 pakietów SDK nosi nazwę play-services-base. Jeśli dołączysz dowolny pakiet usługi Google Play, zostanie on również automatycznie dodany. Ile metod zawiera pakiet podstawowy? Prawie 8000 (dokładna liczba poniżej).
A oto drugi haczyk. W powyższym przykładzie nie uwzględniłem tylko 3 pakietów. Nie włączyłem nawet 4, jeśli liczyć również pakiet podstawowy. W rzeczywistości dołączyłem 5 opakowań. Czemu? Ponieważ pakiet Google Games korzysta z pakietu Google Drive, a więc również został zaimportowany (w rzeczywistości Google Ads zawiera również pakiet zwany menedżerem tagów, ale liczę tutaj tylko pakiety „wybieralne”).
Więc teraz zaczynamy rozumieć, dlaczego trochę trudniej jest policzyć, ile metod każdy pakiet Usług Google Play dodaje do naszej aplikacji. Włączenie jednego pakietu nie musi oznaczać wykluczenia pozostałych.
A więc oto najdrobniejsze szczegóły – które pakiety możesz dodać, ile metod dodają i jakie inne pakiety przynoszą, aby rozbić imprezę. Dane dotyczą najnowszej wersji Usług Google Play (7.5.0 / rewizja 25):
Łączna liczba metod: 28175. Trzeba przyznać, że niektóre z tych liczb są naprawdę okropne. Jeśli wszystko, czego chciałeś, to pakiet panoram, nie możesz po prostu zdobyć dziewięciu metod, musisz zdobyć prawie 8000. Nic dziwnego, że tak wiele aplikacji zbliża się lub przekracza ten limit 65 tys.
Niektóre z tych liczb mogą wydawać się nieco niespójne, jeśli spróbujesz je zsumować. To dlatego, że logika usług Google Play jest nieco trudniejsza niż na pierwszy rzut oka. Na przykład Google Analytics zawiera jedną metodę z Google Ads w celu uzyskania identyfikatora reklamowego konta.
Pamiętaj, że podczas obliczania, ile każdy pakiet dodaje do Twojej aplikacji, pamiętaj, aby wykluczyć podwójne (na przykład nie licz pakietu podstawowego więcej niż raz).
Nie możesz selektywnie dodawać wszystkiego
A oto ostatnie żądło. W Usługach Google Play znajdują się dwa małe pakiety, których nie można selektywnie dodawać. Pakiet wyszukiwania (zapewniający dostęp do API Google Now) zawiera tylko 22 metody. Jeśli chcesz z niego skorzystać, nie masz innego wyjścia, jak dodać całe 28 000+ metod, całe Usługi Google Play. Mamy nadzieję, że zostanie to naprawione w późniejszych wersjach.
(Kolejnym „niedostępnym” pakietem jest pakiet appstate , który zawiera 111 metod, jednak jest teraz przestarzały na rzecz SavedGames , zawarty w pakiecie google-play-games).