Zmniejsz rozmiar aplikacji

Użytkownicy często unikają pobierania aplikacji, które wydają się za duże, zwłaszcza na rynkach wschodzących, urządzenia łączą się z sieciami 2G i 3G o specjalnej jakości lub korzystają z abonamentów z limitami danych. Na tej stronie opisujemy jak zmniejszyć rozmiar pobieranej aplikacji, aby więcej użytkowników mogło ją pobrać.

Przesyłanie aplikacji za pomocą pakietów Android App Bundle

Prześlij aplikację jako pakiet Android App Bundle, aby natychmiast zapisać rozmiar aplikacji podczas publikowania w Google Play. Android App Bundle to format przesyłania, który obejmuje całego skompilowanego kodu i zasobów aplikacji, ale opóźnia wygenerowanie i podpisanie plików APK w Google Play.

Model udostępniania aplikacji w Google Play wykorzystuje następnie Twój pakiet aplikacji do generowania i udostępniania zoptymalizowanych plików APK dla konfiguracji urządzenia każdego użytkownika, dzięki czemu pobiera on tylko kod i zasoby potrzebne uruchom aplikację. Nie musisz tworzyć i podpisywać wielu plików APK ani zarządzać nimi, by obsługiwać różne urządzenia. a użytkownicy pobierają pliki mniejsze i lepiej zoptymalizowane.

Google Play wymusza pobieranie skompresowane z ograniczeniem rozmiaru 200 MB w przypadku aplikacji opublikowanych z pakietami aplikacji. Większe rozmiary są dostępne za pomocą Play Feature Delivery i Play Asset Delivery, ale zwiększenie rozmiaru aplikacji może negatywnie wpływa na sukces instalacji i zwiększa liczbę odinstalowań, dlatego zalecamy zastosowanie wytycznych opisanych na tej stronie, aby maksymalnie zmniejszyć rozmiar pobieranej aplikacji.

Informacje o strukturze plików APK

Zanim zmniejszysz rozmiar aplikacji, warto poznać strukturę jej pliku APK. Plik APK to archiwum ZIP zawierające wszystkie pliki tworzące aplikację. Te m.in. pliki klasy Java, pliki zasobów oraz plik zawierający skompilowane zasoby.

Plik APK zawiera te katalogi:

  • META-INF/: zawiera podpis CERT.SF i CERT.RSA oraz plik manifestu MANIFEST.MF.
  • assets/: zawiera zasoby aplikacji, które aplikacja może pobrać za pomocą AssetManager obiektu.
  • res/: zawiera zasoby, które nie są skompilowane w resources.arsc
  • lib/: zawiera skompilowany kod specyficzny dla warstwy programowej procesora. Ten katalog zawiera podkatalog dla każdego typu platformy, np. armeabi, armeabi-v7a, arm64-v8a, x86, x86_64 i mips.

Plik APK zawiera też wymienione niżej pliki. Wymagane jest podanie tylko pola AndroidManifest.xml:

  • resources.arsc: zawiera skompilowane zasoby. Ten plik zawiera treść XML ze wszystkich konfiguracji folderu res/values/. Narzędzie do tworzenia pakietów wyodrębnia XML, kompiluje ją do postaci binarnej i archiwizuje. Te treści zawierają język ciągi tekstowe i style, a także ścieżki do treści, które nie są uwzględnione bezpośrednio w tagu resources.arsc, takie jak pliki układu i obrazy.
  • classes.dex: zawiera klasy skompilowane w formacie pliku DEX akceptowanym przez np. Dalvik czy ART.
  • AndroidManifest.xml: zawiera podstawowy plik manifestu Androida. Ten plik zawiera listę nazwa, wersja, prawa dostępu i użyte pliki biblioteki aplikacji. Plik korzysta z interfejsu binarnego formatu XML.

Zmniejsz liczbę i rozmiar zasobów

Rozmiar pliku APK ma wpływ na to, jak szybko się wczytuje, ile pamięci wykorzystuje i jak zużywa dużo energii. Możesz zmniejszyć plik APK, zmniejszając liczbę i rozmiar zawartych w nim zasobach. Można usuwać zasoby, których aplikacja już nie używa, oraz można używać skalowalnych Drawable obiektów w miejsce na pliki graficzne. W tej sekcji omówiono te metody i inne sposoby zmniejszenia zasobów aplikacji, by zmniejszyć ogólny rozmiar pliku APK.

Usuń nieużywane zasoby

Narzędzie lint – statyczny analizator kodu dostępne w Android Studio – wykrywa w folderze res/ zasoby, które Twój kod nie odwołuje się do. Gdy narzędzie lint wykryje potencjalnie nieużywany zasób Project, wyświetli komunikat podobny do tego:

res/layout/preferences.xml: Warning: The resource R.layout.preferences appears
    to be unused [UnusedResources]

Biblioteki dodane do kodu mogą zawierać nieużywane zasoby. Gradle może automatycznie usuń zasoby w Twoim imieniu, jeśli włączysz funkcję shrinkResources w: build.gradle.kts aplikacji.

Kotlin

android {
    // Other settings.

    buildTypes {
        getByName("release") {
            minifyEnabled = true
            shrinkResources = true
            proguardFiles(getDefaultProguardFile('proguard-android.txt'), "proguard-rules.pro")
        }
    }
}

Odlotowe

android {
    // Other settings.

    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

Aby używać funkcji shrinkResources, włącz zmniejszanie kodu. Podczas kompilacji najpierw udostępnia się R8 spowoduje usunięcie nieużywanego kodu. Następnie wtyczka Androida do obsługi Gradle usuwa nieużywane zasoby.

Więcej informacji o zmniejszaniu kodu i zasobów oraz o innych sposobach Rozmiar pliku APK – przeczytaj artykuł o zmniejszaniu, zaciemnianiu i optymalizowaniu aplikacji.

We wtyczce Androida do obsługi Gradle w wersji 7.0 i nowszych możesz zadeklarować konfiguracje, obsługuje. Gradle przekazuje te informacje do systemu kompilacji za pomocą resourceConfigurations smak i opcję defaultConfig. Następnie system kompilacji uniemożliwia zasobom w pliku APK nie pojawiają się inne nieobsługiwane konfiguracje, co zmniejsza jego rozmiar. Więcej na temat tej funkcji, zobacz Usuń nieużywaną alternatywę .

Minimalizuj wykorzystanie zasobów z bibliotek

Gdy tworzysz aplikację na Androida, zwykle korzystasz z bibliotek zewnętrznych, by poprawić uniwersalność i użyteczność. Możesz na przykład wybrać AndroidX. aby poprawić wygodę użytkowników na starszych urządzeniach. Możesz też użyć Usługi Google Play do pobrania automatyczne tłumaczenia tekstu w aplikacji.

Jeśli biblioteka jest przeznaczona dla serwera lub komputera, może zawierać wiele obiektów i metod, których nie potrzebuje Twoja aplikacja. Aby uwzględnić tylko te części biblioteki, których potrzebuje Twoja aplikacja, możesz edytować pliki z biblioteki, jeśli licencja pozwala na jej modyfikowanie. Możesz też użyć alternatywnej metody, na urządzenia mobilne, aby dodać do aplikacji określone funkcje.

Natywne dekodowanie animowanego obrazu

W Androidzie 12 (poziom interfejsu API 31) pakiet NDK Interfejs API ImageDecoder jest rozszerzony o dekodowanie wszystkich klatek i danych o czasie pochodzących z obrazów w animowanych formatach GIF i WebP.

Aby kontynuować, używaj ImageDecoder zamiast bibliotek innych firm zmniejsz rozmiar plików APK i ciesz się korzyściami w przyszłości aktualizacji związanych z bezpieczeństwem i wydajnością.

Więcej informacji o interfejsie API ImageDecoder znajdziesz tutaj: API reference oraz przykład w GitHubie.

Obsługuj tylko określone gęstości

Android obsługuje różne gęstości ekranu, na przykład:

  • ldpi
  • mdpi
  • tvdpi
  • hdpi
  • xhdpi
  • xxhdpi
  • xxxhdpi

Mimo że Android obsługuje poprzednie gęstości, nie musisz eksportować zrastrowanych do różnych gęstości.

Jeśli wiesz, że tylko niewielki odsetek Twoich użytkowników ma urządzenia o określonej gęstości, zastanów się, czy musisz uwzględnić te gęstości w aplikacji. Jeśli nie dodasz zasobów do określonej gęstości ekranu, Android automatycznie skaluje istniejące zasoby, które zostały pierwotnie zaprojektowane dla innych gęstości ekranu.

Jeśli Twoja aplikacja potrzebuje tylko przeskalowanych obrazów, możesz zaoszczędzić jeszcze więcej miejsca, tworząc jedną wersję obraz w kolekcji drawable-nodpi/. Zalecamy uwzględnienie co najmniej xxhdpi wariantu obrazu w aplikacji.

Więcej informacji o gęstości ekranu znajdziesz tutaj: Rozmiary i gęstość ekranu

Używanie obiektów rysowalnych

Niektóre obrazy nie wymagają zasobu obrazu statycznego. Platforma może dynamicznie rysować obraz w czasie działania aplikacji. Drawable obiektów lub <shape> in XML – mogą zajmować niewielką ilość miejsca w pakiecie APK. Dodatkowo XML Drawable obiekty generują obrazy monochromatyczne zgodne z wytycznymi Material Design.

Ponowne wykorzystywanie zasobów

Możesz dołączyć osobny zasób dla odmian zdjęcia, np. barwione, zacienione obróconych wersji tego samego obrazu. Zalecamy jednak ponowne korzystanie z tego samego zestawu zasobów i w razie potrzeby dostosowywać je w czasie działania.

Android udostępnia kilka narzędzi, które pozwalają zmienić kolor zasobu. Mogą to być Atrybuty android:tint i tintMode.

Możesz też pominąć zasoby, które są tylko rotacyjnym odpowiednikiem innego zasobu. Poniżej Fragment kodu to przykład „kciuka w górę” w „kciuk w dół”, a potem przestawiając na środku zdjęcia i obracając je o 180 stopni:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/ic_thumb_up"
    android:pivotX="50%"
    android:pivotY="50%"
    android:fromDegrees="180" />

Renderowanie z kodu

Rozmiar pliku APK możesz też zmniejszyć, proceduralnie renderując obrazy. Renderowanie proceduralne zwolni miejsce, bo w pakiecie APK nie przechowujesz już pliku graficznego.

Cruncha, pliki PNG

Narzędzie aapt może zoptymalizować zasoby obrazu umieszczone w lokalizacji res/drawable/ z bezstratną kompresją podczas budowania. Narzędzie aapt może na przykład: przekonwertować plik PNG w prawdziwym kolorze, który nie wymaga więcej niż 256 kolorów, na 8-bitowy plik PNG z kolorem. paletę kolorów. Dzięki temu obraz będzie miał taką samą jakość, ale mniejszy rozmiar pamięci.

aapt ma te ograniczenia:

  • Narzędzie aapt nie zmniejsza plików PNG zawarte w komponencie asset/ folderu Dysku.
  • Pliki obrazów mogą mieć maksymalnie 256 kolorów, aby można je było zoptymalizować za pomocą narzędzia aapt .
  • Narzędzie aapt może zwiększać rozmiar już skompresowanych plików PNG. Aby zapobiegać możesz użyć flagi isCrunchPngs, aby wyłączyć ten proces w przypadku plików PNG:
  • Kotlin

        buildTypes.all { isCrunchPngs = false }
        

    Odlotowe

        buildTypes.all { isCrunchPngs = false }
        

Kompresuj pliki PNG i JPEG

Możesz zmniejszyć rozmiar pliku PNG bez utraty jakości obrazu za pomocą takich narzędzi jak pngcrush, pngquant lub zopflipng. Wszystkie te narzędzia może zmniejszyć rozmiar pliku PNG, zachowując jakość obrazu.

Szczególnie skuteczne jest narzędzie pngcrush. To narzędzie iteruje filtry PNG oraz zlib (Deflate), wykorzystując każdą kombinację filtrów i parametrów do skompresowania obrazu. Następnie wybiera konfigurację, która generuje najmniejsze skompresowane dane wyjściowe.

Do skompresowania plików JPEG możesz użyć narzędzi takich jak packJPG czy guetzli.

Użyj formatu pliku WebP

Zamiast pliku PNG lub JPEG możesz też użyć pliku WebP. WebP zapewnia kompresję stratną i przejrzystość, jak JPG i PNG. niż JPEG czy PNG.

Korzystając z Android Studio, możesz przekonwertować istniejące obrazy w formacie BMP, JPG, PNG lub statyczne pliki GIF na format WebP. Więcej informacji znajdziesz w artykule Tworzenie obrazów WebP.

Używaj grafiki wektorowej

Za pomocą grafiki wektorowej możesz tworzyć ikony niezależne od rozdzielczości i inne skalowalne multimedia. Dzięki nim możesz znacznie zmniejszyć rozmiar pliku APK. Obrazy wektorowe są reprezentowane w Android jako VectorDrawable obiektów. Jeśli używasz obiektu VectorDrawable, plik 100-bajtowy może wygenerować ostry obraz, do rozmiaru ekranu.

Renderowanie każdego z nich zajmuje jednak znacznie więcej czasu. VectorDrawable obiekt, a większe obrazy pojawią się na ekranie jeszcze dłużej. Dlatego przy wyświetlaniu małych obrazów używaj grafiki wektorowej.

Więcej informacji o pracy z obiektami VectorDrawable znajdziesz w artykule Elementy rysowalne.

Używaj grafiki wektorowej jako animowanych obrazów

Nie używaj AnimationDrawable do tworzenia animacji klatka po klatce, bo wymaga to dołączenia osobnej mapy bitowej. dla każdej klatki animacji, co znacznie zwiększa rozmiar pakietu APK.

Zamiast tego użyj AnimatedVectorDrawableCompat, aby utworzyć animowany obraz wektorowy elementy rysowane.

Ogranicz kod natywny i kod Java

Korzystając z poniższych metod, możesz zmniejszyć rozmiar bazy kodu Java i natywnej w .

Usuń zbędny wygenerowany kod

Upewnij się, że znasz zasięg każdego kodu, który jest generowany automatycznie. Przykład: wiele narzędzi buforujących protokół generuje nadmierną liczbę metod i klas, które mogą spowodować 3 razy większy rozmiar aplikacji.

Unikaj wyliczeń

Pojedyncze wyliczenie może dodać około 1,0–1,4 KB do pliku classes.dex aplikacji. Te że dodatkowe dodatki można szybko akumulować w przypadku złożonych systemów lub bibliotek udostępnionych. Jeśli to możliwe, za pomocą adnotacji @IntDef i zmniejszania kodu aby usunąć wyliczenia i przekonwertować je na liczby całkowite. Konwersja tego typu zachowuje wszystkie korzyści związane z bezpieczeństwem typu wyliczeniowego.

Zmniejszanie rozmiaru natywnych plików binarnych

Jeśli Twoja aplikacja używa kodu natywnego i pakietu Android NDK, możesz też zmniejszyć rozmiar wersji dzięki optymalizacji kodu. Dwie przydatne metody to usuwanie symboli debugowania oraz nie wyodrębnianie bibliotek natywnych.

Usuń symbole debugowania

Używanie symboli debugowania ma sens, jeśli aplikacja jest w fazie opracowywania i nadal wymaga debugowania. Używaj użyj narzędzia arm-eabi-strip dostępnego w pakiecie Android NDK, aby usunąć niepotrzebne debugowanie z bibliotek natywnych. Później możesz skompilować kompilację wersji.

Unikaj wyodrębniania bibliotek natywnych

Podczas tworzenia wersji do publikacji aplikacji umieść nieskompresowane pliki .so w formacie Plik APK według ustawienia useLegacyPackaging. do false w pliku build.gradle.kts aplikacji. Wyłączenie tej flagi zapobiega PackageManager od Kopiowanie .so plików z pakietu APK do systemu plików podczas instalacji. Ta metoda sprawia, i mniejsza liczba aktualizacji aplikacji.

Utrzymywanie wielu uproszczonych plików APK

Twój plik APK może zawierać treści, które użytkownicy pobierają, ale nigdy nie używają, np. dodatkowe języki według gęstości ekranu. Aby ograniczyć ilość pobrań do minimum, prześlij aplikację na Google Play za pomocą pakietów Android App Bundle. Przesyłanie pakietów aplikacji pozwala Google Google Play generuje i udostępnia zoptymalizowane pliki APK dostosowane do konfiguracji urządzenia każdego użytkownika, aby pobierał tylko: kod i zasoby potrzebne do uruchomienia aplikacji. Nie musisz tworzyć, podpisywać i zarządzać wieloma na różne urządzenia, a użytkownicy otrzymują mniejsze i lepiej zoptymalizowane pliki do pobrania.

Jeśli nie publikujesz w Google Play, możesz podzielić aplikację na kilka plików APK. różnią się między innymi rozmiarem ekranu czy obsługą tekstur GPU.

Gdy użytkownik pobierze Twoją aplikację, urządzenie otrzyma odpowiedni plik APK na podstawie funkcje i ustawienia. Dzięki temu urządzenia nie otrzymują zasobów na potrzeby funkcji, których nie obsługują użytkowników. Jeśli na przykład użytkownik ma urządzenie z systemem hdpi, nie potrzebuje xxxhdpi które możesz uwzględnić w przypadku urządzeń z ekranami o większej gęstości.

Więcej informacji znajdziesz w artykule Tworzenie wielu elementów pliki APK i obsługę wielu plików APK.