Efterhånden som vores apps tilføjer funktioner og bliver mere komplekse, er det ret almindeligt, at den endelige filstørrelse stiger betydeligt. Dette er et alvorligt problem, fordi hvis en app er for stor, tænker mange brugere sig om to gange, før de klikker på installationsknappen, eller endnu værre, afbryder downloadingen halvvejs igennem. Desuden bruger en stor app mere lagerplads på telefonen og kan i sidste ende påvirke systemets responstid.
For at forhindre dit projekt i at blive en digital gigant, er der flere strategier, lige fra kodeoprydning til billedoptimering. I denne artikel vil vi dykke ned i, hvordan man bruger værktøjer som R8 og ProGuard , samt magien ved App Bundles, til at gøre din app så let og hurtig som muligt, så den kører fejlfrit, selv på low-end enheder.
Forstå, hvad der virkelig betyder noget i din app
Før vi går i gang, skal vi vide, hvor størstedelen af dataene er. En applikations størrelse er typisk opdelt i fire hovedblokke. Først er der Java- eller Kotlin-bytekoden og dens biblioteker, som normalt tegner sig for 30% til 40%. Derefter er der ressourcer som layouts og animationer med en lignende størrelse. Vi har også de native biblioteker (C/C++) kompileret til forskellige arkitekturer (15-25%), og endelig aktiver eller råfiler (5-15%).
For at undgå gætteri er det bedst at bruge Android Studios APK Analyzer (ved at gå til Byg > Analyser APK). Dette værktøj giver dig mulighed for at se præcis, hvor meget DEX-klasser, ressourcemappen og native biblioteker vejer, hvilket giver dig mulighed for at sammenligne aktuelle versioner med tidligere versioner for at finde ud af, hvilke ændringer der forårsagede stigningen i filstørrelsen. For at dykke dybere ned i dette emne er det nyttigt at forstå filhierarkiet i Android og hvordan filer er organiseret.
Kodeoprydning: Springet fra ProGuard til R8
Kodereduktion er uden tvivl den mest effektive måde at reducere bytes på. Det er her, ProGuard og dens moderne efterfølger, R8, kommer ind i billedet. ProGuard var standarden i årevis og fjernede ubrugte klasser, felter og metoder , optimerede bytekode og forsimplede navne for at gøre dem kortere (og sværere for alle, der forsøger at hacke din kode at læse).
I dag er R8 standardcompileren og gør alt, hvad ProGuard gjorde, men meget bedre og hurtigere. R8 implementerer mere aggressiv tree shaking , fletter klasser med lignende funktioner og optimerer optællinger ved at konvertere dem til heltal. Derudover tillader det desugaring at bruge moderne Java 8-funktioner i ældre versioner af Android.
Teknisk konfiguration i build.gradle
For at aktivere disse optimeringer i udgivelsesversionen skal du konfigurere byggefilen ved at indstille minifyEnabled som sand og linke regelfilerne. Det er vigtigt at bruge proguard-android-optimize.txt for at udnytte optimeringerne fuldt ud. Et grundlæggende konfigurationseksempel ville omfatte vedligehold applikationsklasser eller dem, der er noteret med @Keep for at forhindre R8 i at slette dem ved et uheld.
Regelstyring for eksterne biblioteker
Nogle gange er R8 for effektiv og sletter kode, der bruges gennem refleksion, hvilket forårsager fejl som f.eks. ClassNotFoundExceptionDerfor kan boghandlere lide Retrofit, OkHttp eller Gson kræver specifikke regler.For eksempel er det med Gson vigtigt at bevare feltnavnene i datamodellerne, så JSON-deserialisering ikke mislykkes. Hvis du støder på fejl efter obfuskation, vil filen kortlægning.txt Det er din bedste allierede til at oversætte stakspor og vide, hvor fejlen opstod.
Intelligent ressourceoptimering
Ressourcer er ofte der, hvor mest plads spildes. En simpel, men effektiv teknik er at aktivere krympeRessourcer i build.gradle-filen. Dette fjerner filer, der ikke har nogen reference i koden, selvom det er vigtigt at vide, at hvis du kalder en ressource dynamisk ved hjælp af getIdentifierDu skal deklarere det i en fil keep.xml så den ikke forsvinder.
Billeder og grafik: Mindre er mere
PNG-formatet er ansvarligt for mange unødvendige megabyte. Den nuværende anbefaling er at migrere alt til WebP-format , som tilbyder langt bedre komprimering, samtidig med at kvaliteten opretholdes. Du kan udføre denne konvertering direkte i Android Studio ved at højreklikke på billedet. Til ikoner og simple former er Vector Drawables ideelle ; en enkelt XML-fil erstatter fem versioner med varierende tætheder, hvilket forenkler vedligeholdelse og reducerer filstørrelsen.
Reduktion af sprog og befolkningstætheder
Mange eksterne biblioteker leveres med oversættelser til 50 sprog, som din app sandsynligvis ikke understøtter. For at rydde op i dette skal du bruge egenskaben resConfigs i standardkonfigurationkun at specificere de sprog, du rent faktisk bruger (f.eks. "es", "en"På samme måde kan du begrænse de inkluderede skærmtætheder, hvis du ved, at din målgruppe bruger moderne enheder, ved at fjerne ressourcer. ldpi eller mdpi som ingen bruger længere.
Avancerede distributionsstrategier
Hvis du definitivt vil reducere APK-størrelsen, bør du stoppe med at bruge universelle APK'er og skifte til Android App Bundles (.aab) . I stedet for at sende én kæmpe fil med alt muligt, genererer Google Play en optimeret APK til hver enhed. På denne måde downloader en bruger med en ARM64-telefon og en xxhdpi-skærm kun det, deres hardware har brug for , hvilket reducerer downloadstørrelsen med op til 40 %.
Dynamiske funktionsmoduler og instant-apps
Ikke al koden behøver at være tilgængelig fra starten. Med dynamiske funktionsmoduler kan du adskille dele af appen (som en avanceret fotoredigerer eller offline-tilstand), så de kun downloades, når brugeren tilgår den pågældende funktion. På den anden side lader Instant Apps folk prøve din app uden at installere den ved at indlæse et ekstremt let basismodul via en URL eller en Google Play-knap.
Revision af afhængigheder og endelige detaljer
Nogle gange er problemet ikke din kode, men det du henter udefra. Biblioteker som Guava eller Jackson kan være meget store; overvej at erstatte dem med lettere alternativer som kotlinx.serialization eller Gson . Det er også tilrådeligt at bruge skrifttyper, der kan downloades fra Google Fonts, i stedet for at samle store TTF-filer i dine aktiver, hvilket kan spare dig adskillige megabyte, hvis du bruger flere variationer af en skrifttype.
For at fuldføre optimeringscyklussen skal du huske, at Android Go er et voksende marked. Hvis du vil have din app til at skinne på enheder med mindre end 1 GB RAM, skal du prøve at holde dens størrelse under 40 MB. Brug af Android Lint til at registrere forældreløse ressourcer og opretholde en konsekvent oprydningsrutine vil gøre det muligt for din app at være effektiv, installere hurtigt og tilbyde en problemfri brugeroplevelse, uanset enhedens strømforbrug.