Allt eftersom våra appar lägger till funktioner och blir mer komplexa är det ganska vanligt att den slutliga filstorleken ökar avsevärt. Detta är ett allvarligt problem eftersom om en app är för stor tänker många användare sig för två gånger innan de klickar på installationsknappen eller, ännu värre, avbryter nedladdningen halvvägs. Dessutom förbrukar en stor app mer lagringsutrymme på telefonen och kan i slutändan påverka systemets svarstid.
För att förhindra att ditt projekt blir en digital jätte finns det flera strategier, allt från kodrensning till bildoptimering. I den här artikeln ska vi fördjupa oss i hur man använder verktyg som R8 och ProGuard , samt magin med App Bundles, för att göra din app så lätt och snabb som möjligt, vilket säkerställer att den körs felfritt även på enklare enheter.
Att förstå vad som verkligen är viktigt i din app
Innan vi börjar behöver vi veta var huvuddelen av datan finns. En applikations storlek delas vanligtvis in i fyra huvudblock. Först finns Java- eller Kotlin-bytekoden och dess bibliotek, som vanligtvis står för 30–40 % . Sedan finns det resurser som layouter och animationer , med liknande storlek. Vi har också de inbyggda biblioteken (C/C++) kompilerade för olika arkitekturer (15–25 %), och slutligen resurserna eller råfilerna (5–15 %).
För att undvika gissningar är det bäst att använda Android Studios APK Analyzer (genom att gå till Bygg > Analysera APK). Det här verktyget låter dig se exakt hur mycket DEX-klasser, resursmappen och nativa bibliotek väger, vilket gör att du kan jämföra nuvarande versioner med tidigare för att fastställa vilka förändringar som orsakade ökningen av filstorleken. För att fördjupa dig i detta ämne är det bra att förstå filhierarkin i Android och hur filer är organiserade.
Kodrensning: Steget från ProGuard till R8
Kodreducering är utan tvekan det mest effektiva sättet att minska byte. Det är här ProGuard och dess moderna efterföljare, R8, kommer in i bilden. ProGuard var standarden i åratal och tog hand om att ta bort oanvända klasser, fält och metoder , optimera bytekod och obfuskatera namn för att göra dem kortare (och svårare för alla som försöker hacka din kod att läsa).
Idag är R8 standardkompilatorn och gör allt som ProGuard gjorde, fast mycket bättre och snabbare. R8 implementerar mer aggressiv trädskakning , slår samman klasser med liknande funktioner och optimerar uppräkningar genom att konvertera dem till heltal. Dessutom möjliggör det avsugaring för att använda moderna Java 8-funktioner i äldre versioner av Android.
Teknisk konfiguration i build.gradle
För att aktivera dessa optimeringar i den utgivna versionen måste du konfigurera byggfilen genom att ange minifyEnabled som sant och länka regelfilerna. Det är viktigt att använda proguard-android-optimize.txt för att dra full nytta av optimeringarna. Ett exempel på en grundläggande konfiguration skulle inkludera underhålla applikationsklasser eller de som är märkta med @Keep för att förhindra att R8 av misstag raderar dem.
Regelhantering för externa bibliotek
Ibland är R8 för effektivt och tar bort kod som används genom reflektion, vilket orsakar fel som ClassNotFoundExceptionDet är därför bokhandlar gillar Retrofit, OkHttp eller Gson kräver specifika regler.Till exempel, med Gson är det viktigt att bevara fältnamnen i datamodellerna så att JSON-deserialisering inte misslyckas. Om du stöter på fel efter obfuskering, filen mappning.txt Det är din bästa allierade för att översätta stackspår och veta var felet inträffade.
Intelligent resursoptimering
Resurser är ofta där mest utrymme går förlorat. En enkel men kraftfull teknik är att aktivera krympresurser i filen build.gradle. Detta tar bort filer som inte har någon referens i koden, men det är viktigt att veta att om du anropar en resurs dynamiskt med hjälp av getIdentifierDu måste deklarera det i en fil keep.xml så att den inte försvinner.
Bilder och grafik: Mindre är mer
PNG-formatet orsakar många onödiga megabyte. Den nuvarande rekommendationen är att migrera allt till WebP-format , vilket erbjuder betydligt bättre komprimering samtidigt som kvaliteten bibehålls. Du kan utföra denna konvertering direkt i Android Studio genom att högerklicka på bilden. För ikoner och enkla former är Vector Drawables idealiska ; en enda XML-fil ersätter fem versioner med varierande densitet, vilket förenklar underhåll och minskar filstorleken.
Minska språk och språktätheter
Många externa bibliotek levereras med översättningar till 50 språk som din app förmodligen inte stöder. För att rensa upp detta, använd egenskapen återställ konfigurationer i standardkonfigurationanger endast de språk du faktiskt använder (till exempel "es", "en"På samma sätt kan du begränsa de inkluderade skärmtätheterna om du vet att din målgrupp använder moderna enheter, genom att ta bort resurser. ldpi eller mdpi som ingen använder längre.
Avancerade distributionsstrategier
Om du definitivt vill minska APK-storleken bör du sluta använda universella APK:er och byta till Android App Bundles (.aab) . Istället för att skicka en enda gigantisk fil med allt möjligt genererar Google Play en optimerad APK för varje enhet. På så sätt laddar en användare med en ARM64-telefon och en xxhdpi-skärm bara ner det som deras hårdvara behöver , vilket minskar nedladdningsstorleken med upp till 40 %.
Dynamiska funktionsmoduler och snabbappar
All kod behöver inte vara tillgänglig från början. Med dynamiska funktionsmoduler kan du separera delar av appen (som en avancerad fotoredigerare eller offline-läge) så att de bara laddas ner när användaren använder den funktionen. Å andra sidan låter Instant Apps folk prova din app utan att installera den, genom att ladda en extremt lättviktig basmodul via URL eller Google Play-knapp.
Granskning av beroenden och slutliga detaljer
Ibland är problemet inte din kod, utan vad du hämtar utifrån. Bibliotek som Guava eller Jackson kan vara mycket stora; överväg att ersätta dem med enklare alternativ som kotlinx.serialization eller Gson . Det är också lämpligt att använda nedladdningsbara teckensnitt från Google Fonts istället för att bunta ihop stora TTF-filer i dina resurser, vilket kan spara dig flera megabyte om du använder flera varianter av ett teckensnitt.
För att slutföra optimeringscykeln, kom ihåg att Android Go är en växande marknad. Om du vill att din app ska fungera utmärkt på enheter med mindre än 1 GB RAM, försök att hålla storleken under 40 MB. Genom att använda Android Lint för att upptäcka överblivna resurser och upprätthålla en konsekvent rensningsrutin blir din app effektiv, installeras snabbt och erbjuder en smidig användarupplevelse, oavsett enhetens prestanda.