Android App Bundle (AAB): een complete gids voor ontwikkelaars en gebruikers

A sealed parcel labeled AAB on a developer desk, illustrating the Android App Bundle format

In augustus 2021 nam Google een beslissing die de manier waarop Android-apps worden gedistribueerd fundamenteel veranderde: alle nieuwe apps die bij de Google Play Store worden ingediend, moeten het Android-appbundel (AAB)-formaat gebruiken in plaats van de traditionele APK. Deze verschuiving had gevolgen voor ontwikkelaars, gebruikers en het hele ecosysteem van app-distributie door derden. Maar wat is een appbundel precies, hoe werkt deze en waarom zou u zich daar zorgen over maken?

Deze gids behandelt alles, van de technische interne aspecten van het AAB-formaat tot de praktische implicaties voor gebruikers die apps willen delen met vrienden of deze willen installeren op apparaten zonder toegang tot de Play Store.

Wat is een Android-appbundel?

Een Android App Bundle is een publicatieformaat dat alle gecompileerde code en bronnen van een app bevat, maar het genereren van de uiteindelijke installeerbare APK naar Google Play uitstelt. Zie het als een hoofdsjabloon van waaruit de servers van Google in een handomdraai geoptimaliseerde, apparaatspecifieke pakketten maken.

In tegenstelling tot een APK, een pakket dat klaar is om te installeren, kan een AAB-bestand niet rechtstreeks op een apparaat worden geïnstalleerd. Het is een build-artefact dat wordt geüpload naar de Play Store, waar de infrastructuur van Google het verwerkt en op maat gemaakte APK's genereert voor elke apparaatconfiguratie.

De bestandsextensie is .aab en gebruikt intern een protocolbufferformaat gecombineerd met een ZIP-achtige structuur. Het bevat de DEX-bytecode van de app, bronnen, middelen, native bibliotheken en een speciaal bundelmetagegevensbestand dat Google Play vertelt hoe de inhoud moet worden gesplitst.

Waarom Google verplichte app-bundels heeft

De belangrijkste motivatie achter app-bundels is het verkleinen van de downloadgrootte van apps. Een typische Android-app moet meerdere schermdichtheden (mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi), meerdere CPU-architecturen (armeabi-v7a, arm64-v8a, x86, x86_64) en meerdere talen ondersteunen. In het traditionele APK-model worden al deze bronnen gebundeld in één enkel bestand, ook al heeft een bepaald apparaat er maar een fractie van nodig.

Overweeg een game met native bibliotheken voor vier CPU-architecturen en texturen voor vijf schermdichtheden. De universele APK kan 200 MB groot zijn, maar een apparaatspecifieke versie die alleen de relevante architectuur en dichtheid bevat, kan 80 MB zijn. Dat is een vermindering van de downloadgrootte met 60%.

Google meldt dat apps die app-bundels gebruiken gemiddeld 15% kleiner zijn dan hun universele APK-equivalenten. Voor grote apps en games kunnen de besparingen veel dramatischer zijn. Kleinere downloads betekenen snellere installaties, minder bandbreedteverbruik en minder verlaten installaties vanwege problemen met de grootte.

Hoe app-bundels intern werken

De bundelstructuur

Een AAB-bestand is georganiseerd in modules, waarbij elke module zijn eigen code, bronnen en assets bevat. De meest voorkomende structuur omvat:

  • Basismodule: Bevat de belangrijkste app-code en bronnen die elk apparaat nodig heeft. Deze wordt altijd geïnstalleerd.
  • Configuratiesplitsingen: Afzonderlijke secties voor taalbronnen, bronnen voor schermdichtheid en native ABI-bibliotheken (CPU-architectuur).
  • Dynamische functiemodules: Optionele modules die na de eerste installatie op aanvraag kunnen worden gedownload.
  • Assetpakketten: Grote assets zoals gamelevels of media die tijdens de installatie, op aanvraag of op de achtergrond kunnen worden geleverd.

Gesplitste APK-generatie

Wanneer een gebruiker een app downloadt uit de Play Store, onderzoeken de servers van Google de configuratie van het apparaat en genereren ze een reeks gesplitste APK's die zijn afgestemd op dat specifieke apparaat. Een typische installatie kan het volgende omvatten:

  • base.apk, de kernapplicatiecode en essentiële bronnen
  • split_config.arm64_v8a.apk, native bibliotheken voor de CPU van het apparaat
  • split_config.xxhdpi.apk, bronnen voor de schermdichtheid van het apparaat
  • split_config.en.apk, Taalbronnen voor de landinstelling van de gebruiker

Deze gesplitste APK's worden samen geïnstalleerd als één logische app. De Android-pakketbeheerder behandelt ze als één applicatie, maar het zijn fysiek afzonderlijke bestanden op het apparaat. Dit is het mechanisme dat de groottebesparing mogelijk maakt.

Dynamische levering

Een van de krachtigste functies van app-bundels is dynamische levering. Ontwikkelaars kunnen bepaalde functies markeren als downloadbaar op aanvraag. Een app voor fotobewerking kan bijvoorbeeld geavanceerde filters bevatten als dynamische functiemodule. Gebruikers die deze filters nooit gebruiken, downloaden ze nooit, waardoor opslagruimte wordt bespaard.

Dynamische functiemodules worden tijdens runtime gedownload en geïnstalleerd via de Play Core-bibliotheek. De app kan controleren of een module is geïnstalleerd en indien nodig een download aanvragen, zodat de gebruiker de nieuwe functionaliteit ervaart als een kleine in-app download in plaats van een volledige herinstallatie.

AAB versus APK: belangrijkste verschillen

Als u de verschillen tussen deze formaten begrijpt, kunt u duidelijk maken wanneer elk geschikt is:

  • Installeerbaarheid: APK-bestanden kunnen rechtstreeks op elk Android-apparaat worden geïnstalleerd. AAB-bestanden kunnen niet rechtstreeks worden geïnstalleerd en moeten eerst worden verwerkt.
  • Maat: Een universele APK bevat bronnen voor alle configuraties. Een AAB maakt apparaatspecifieke levering mogelijk, wat resulteert in kleinere downloads.
  • Ondertekening: Met APK's ondertekent de ontwikkelaar het definitieve installeerbare pakket. Bij AAB's ondertekent de ontwikkelaar de bundel en ondertekent Google de gegenereerde APK's opnieuw met behulp van Play App Signing.
  • Verdeling: APK's kunnen via elk kanaal worden gedistribueerd. AAB's zijn in de eerste plaats ontworpen voor de Play Store, hoewel tools zoals Bundletool er lokaal APK's van kunnen genereren.
  • Deelbaarheid: U kunt een APK-bestand eenvoudig met iemand anders delen. Voor het delen van een app die is geïnstalleerd vanaf een AAB, moeten alle gesplitste APK's worden verzameld, wat complexer is.

De ondertekeningscontroverse

Een van de meest besproken aspecten van het AAB-mandaat is Speel app-ondertekening. Wanneer een ontwikkelaar een AAB uploadt, bewaart Google de ondertekeningssleutel die wordt gebruikt om de uiteindelijke APK's te ondertekenen die aan gebruikers worden geleverd. Dit betekent dat Google technisch gezien de mogelijkheid heeft om de APK-inhoud aan te passen voordat deze wordt ondertekend en geleverd.

Google beweert dat dit nodig is omdat ze de gesplitste APK's die ze genereren, moeten ondertekenen. Ontwikkelaars behouden een uploadsleutel om hun uploads te verifiëren, maar de daadwerkelijke app-ondertekeningssleutel wordt beheerd door de infrastructuur van Google.

Voor de meeste ontwikkelaars is dit een redelijke afweging. Google biedt belangrijke back-up- en herstelservices en het risico op sleutelverlies (waardoor app-updates permanent zouden worden voorkomen) wordt geëlimineerd. Privacygerichte ontwikkelaars en voorstanders van open source hebben echter hun zorgen geuit over deze centralisatie van vertrouwen.

Wat dit betekent voor gebruikers die apps delen

De verschuiving naar appbundels heeft aanzienlijke gevolgen voor gebruikers die apps buiten de Play Store willen delen:

Geïnstalleerde apps uitpakken

Wanneer u een app extraheert die is geïnstalleerd vanaf een AAB, krijgt u geen enkel APK-bestand. In plaats daarvan krijgt u een verzameling gesplitste APK's. Deze splitsingen zijn apparaatspecifiek, wat betekent dat een app die is geëxtraheerd van een telefoon met een ARM64-processor en xxhdpi-scherm niet werkt op een apparaat met een andere configuratie.

XAPK- en APKS-indelingen

Om de uitdaging van het delen van gesplitste APK's aan te pakken, zijn containerformaten zoals XAPK en APKS gemaakt. Deze formaten bundelen alle gesplitste APK's in één downloadbaar bestand. Wanneer u een XAPK-bestand tegenkomt, bevat dit waarschijnlijk een app die oorspronkelijk als app-bundel is gedistribueerd.

Onze XAPK naar APK-converter kan u helpen de basis-APK uit deze containerformaten te extraheren. Houd er echter rekening mee dat de basis-APK alleen mogelijk niet alle bronnen bevat die nodig zijn om de app correct te laten functioneren op elk apparaat, omdat dichtheid en ABI-specifieke bronnen zich mogelijk in de gesplitste APK's bevinden.

Bundeltool gebruiken

Google biedt een open-sourcetool genaamd bundletool die lokaal APK's uit een AAB-bestand kan genereren. Ontwikkelaars kunnen dit gebruiken om universele APK's te maken voor testen of alternatieve distributie. De opdracht ziet er als volgt uit:

bundletool build-apks --bundle=app.aab --output=app.apks --mode=universal

Dit genereert een universele APK die alle bronnen voor alle configuraties bevat. Het zal groter zijn dan een apparaatspecifieke build, maar werkt op elk apparaat. Dit is de aanpak die wordt gebruikt door onze AAB naar APK-converter.

Impact op alternatieve app-winkels

Het AAB-mandaat heeft vooral betrekking op de Google Play Store. Alternatieve appstores en directe distributiekanalen kunnen nog steeds APK-bestanden accepteren. Ontwikkelaars die buiten Play willen distribueren, kunnen naast hun AAB-uploads doorgaan met het bouwen van universele APK's.

Sommige ontwikkelaars bouwen echter alleen AAB's en vertrouwen voor distributie volledig op Play. Dit betekent dat apps van deze ontwikkelaars moeilijker te verkrijgen zijn buiten het Play Store-ecosysteem. App-opslagplaatsen van derden hebben zich aangepast door de gesplitste APK-collecties te hosten (als XAPK- of APKS-bestanden) of door de Bundletool te gebruiken om universele APK's te genereren.

Dynamische featuremodules in de praktijk

Dynamische functiemodules vertegenwoordigen een van de meest interessante mogelijkheden van het App Bundle-formaat. Hier zijn enkele praktijkvoorbeelden:

  • Camerafuncties: Een app kan AR-filters bevatten als een dynamische module, die alleen kan worden gedownload wanneer de gebruiker voor het eerst toegang krijgt tot de camerafunctie.
  • Taalpakketten: Vertaalgegevens voor minder gebruikelijke talen kunnen op aanvraag worden geleverd in plaats van bij elke installatie te worden gebundeld.
  • Spelniveaus: Games kunnen aanvullende content leveren naarmate spelers vooruitgang boeken, waardoor de initiële download klein blijft.
  • Professioneel gereedschap: Geavanceerde functies in productiviteitsapps kunnen alleen worden geleverd aan gebruikers die ze nodig hebben.

Voor gebruikers betekent dit dat de geïnstalleerde omvang van een app in de loop van de tijd kan toenemen naarmate dynamische modules worden gedownload. Het betekent ook dat voor het delen van een dergelijke app alle gedownloade modules moeten worden opgenomen, wat het extractieproces nog ingewikkelder maakt.

Beste praktijken voor ontwikkelaars

Als u Android-apps ontwikkelt, volgen hier aanbevelingen om effectief met app-bundels te werken:

  1. Test altijd lokaal met Bundletool voordat u uploadt naar Play. Genereer apparaatspecifieke APK's en controleer of ze correct werken.
  2. Gebruik de interne testtrack van de Play Console om te verifiëren dat gesplitste APK's correct worden geïnstalleerd en functioneren op echte apparaten.
  3. Overweeg om een ​​universele APK aan te bieden voor alternatieve distributiekanalen als uw gebruikersbestand verder reikt dan de Play Store.
  4. Houd rekening met de grenzen van dynamische functiemodules. Functies die vaak worden gebruikt, moeten in de basismodule zitten, niet in dynamische modules.
  5. Test op apparaten met verschillende configuraties om ervoor te zorgen dat configuratiesplitsingen correct worden gegenereerd en dat er geen bronnen ontbreken.
  6. Bewaar uw uploadsleutel veilig. Terwijl Google de app-ondertekeningssleutel beheert, verifieert uw uploadsleutel uw identiteit als ontwikkelaar.

De toekomst van app-distributie

Het App Bundle-formaat blijft evolueren. Google heeft functies geïntroduceerd zoals Play Asset Delivery voor grote game-items, SDK Runtime voor advertentie-SDK's en verbeterde ondersteuning voor Wear OS- en Android TV-configuraties. De trend is richting meer gedetailleerde, on-demand levering van app-componenten.

Voor gebruikers betekent dit dat het concept van één op zichzelf staand app-bestand steeds minder gebruikelijk wordt voor Play Store-apps. Het begrijpen van formaten als XAPK, APKS en de tools die beschikbaar zijn om ermee te werken, wordt steeds belangrijker voor iedereen die apps beheert buiten de standaard Play Store-stroom.

Wanneer moet u een AAB behouden versus wanneer moet u een universele APK bouwen?

De Android App Bundle vertegenwoordigt een fundamentele verandering in de manier waarop apps worden verpakt en geleverd. Hoewel het echte voordelen oplevert in termen van downloadgrootte en leveringsefficiëntie, introduceert het ook complexiteit voor gebruikers die apps delen of deze vanuit alternatieve bronnen installeren. Als u begrijpt hoe AAB's werken, hoe ze gesplitste APK's genereren en welke tools beschikbaar zijn om tussen formaten te converteren, krijgt u wat u nodig heeft om het juiste formaat te kiezen en met vertrouwen tussen deze formaten te converteren.

Ontwikkelaars schakelen AAB in om de manier waarop een app wordt geleverd te optimaliseren; de meeste dagelijkse gebruikers komen dit alleen tegen als ze iets proberen te installeren op een apparaat zonder toegang tot de Play Store. Hoe dan ook, het ding dat de moeite waard is om te onthouden is eenvoudig: AAB is een publicatieformaat, geen installatieformaat, en er zijn tools die de kloof tussen beide overbruggen.

Ontwikkeld en gedocumenteerd door Mst Shaefale Hoofdontwikkelaar en Android-pakketarchitect • Geverifieerd op Android 12–15

Mst Shaefale onderhoudt de XAPK/APKS-fusie aan de clientzijde, de parser voor binaire manifesten en de APK v1+v2-ondertekentools op xapktoapk.com. Ontdekt u een verouderde opdracht of een wijziging in het besturingssysteem? Stuur een redactionele opmerking.