Apps voor Android-toestellen
Al onze apps worden voor ieder platform native ontwikkeld. Dit betekent dat de app voor ieder platform (iOS en Android) op maat wordt gemaakt. Zo kunnen onze apps optimaal gebruik maken van de functionaliteiten van elk apparaat en blijft de kwaliteit van de User Experience gegarandeerd.
Android Studio
De ontwikkeling van de Android apps doen wij in Android Studio. Dit geeft de perfecte en aanbevolen ondersteuning om Android apps te maken. Deze zogenoemde IDE (integrated development environment) helpt je met behulp van sneltoetsen (shortkeys), autocomplete en verschillende plugins. Voorbeelden van plugins zijn de GraphQL plugin en de Firebase Testlab plugin.
Android Studio komt samen met de zogenaamde AVD-manager (Android Virtual Device). Met deze tool kan je verschillende Android toestel emulators met verschillende OS versies installeren. Zo kan je zonder een specifiek apparaat te hebben toch een app testen op dit toestel.
Git (versiebeheer)
Git is een versiebeheersysteem dat op de broncode beheert. Iedere wijziging in de code wordt overzichtelijk toegevoegd aan een repository via een commit. Alle commits worden lokaal opgeslagen. Zodra de code er klaar voor is, maar in ieder geval aan het einde van de dag, worden de gedane commits naar de git remote gepusht. Hiervoor maken wij gebruik van Bitbucket. Deze structuur zorgt ervoor dat de broncode met bijbehorende wijzigingen door het gehele team in te zien zijn. Samenwerken gaat hierdoor ook extra eenvoudig, dankzij pull requests. Dan kan eenvoudig de broncode nagelopen en beoordeeld worden. Dankzij git zijn er altijd backups en oude versies van de code beschikbaar. Bij het toevoegen van nieuwe ‘features’ of ‘bug fixes’ kan er op een aparte branch gewerkt kan worden.
Kotlin
Vroeger werden alle Android apps in Java geschreven, maar tegenwoordig is Kotlin de aanbevolen taal om een Android app te maken.
Er zitten velen voordelen aan ten opzichte van Java. Zo wordt de kans op zogenaamde NPE's (NullPointerExceptions) verkleind door de toevoeging van optionals. Ook maakt Kotlin gebruik van features die geleend zijn van functionele talen. Met functies als bijvoorbeeld map
, filter
, reduce
, fold
of groupBy
kan je in veel minder regels code hetzelfde bereiken als in Java. In veel gevallen zijn deze functies zelf sneller dan complexe for
of while
loops. En zoals in de meeste modernere talen is er ook type inference, waardoor de compiler zelf het type van een variabele kan bedenken. Bovendien is er een betere ondersteuning voor het gebruik van immutables.
Naast deze voorbeelden werken we tegenwoordig ook zo veel mogelijk met Kotlin Coroutines die helpen bij het implementeren van asynchrone functies. In plaats van het doorgeven van callbacks wat veel boilerplate code oplevert, heb je met behulp van coroutines de mogelijkheid om blocking (suspend
) functies te definiëren. Dit leidt tot minder en overzichtelijke code!
Testing
Tegenwoordig kan je niet meer een app maken zonder dat deze goed getest is met behulp van unit en UI tests.
Om unit tests te schrijven gebruiken wij JUnit en Mockito. Dit zijn de meest gebruikte frameworks om Android apps te testen. Met JUnit definieer je tests, zet je de gewilde assertions en test je of je klasse goed functioneert. Mockito is een handig framework waarbij je zogenaamde mocks van klassen kan maken. Door het definiëren van mocks in je tests ben je niet afhankelijk van de werking van klassen waarvan de klasse afhankelijk is. Zo kun je je concentreren op de dingen die je wilt testen en blijven de unit tests klein en snel.
Naast unit tests schrijven we ook geautomatiseerde UI tests. Om zeker te weten dat apps op een groot aantal apparaten de gewenste resultaten geven maken we gebruik van Espresso en UIAutomator. Met deze frameworks kan je een test script beschrijven. Bij het uitvoeren van de UI tests wordt het script uitgevoerd, zodat je kunt zien wat het gedrag is van de app.
Om het te automatiseren maken wij ook gebruik van Firebase Testlab. Hiermee kan je je app opsturen naar servers die hem dan tegen een groot scala aan (echte!) devices zal testen. Als de tests zijn uitgevoerd krijg je video's, screenshots en logs te zien met de resultaten. Zo komen we achter bugs die we kunnen oplossen voordat we de app live zetten.
Android Jetpack
Om snel apps te kunnen ontwikkelen is het goed om zo nu en dan gebruik te maken van een library. Android Jetpack is een door Google gemaakte set aan libraries dat je helpt om sneller een app te ontwikkelen. Voorbeelden van libraries waar wij veel gebruik van maken zijn Data Binding in combinatie met LiveData, Navigation en ViewModels.
Met Data Binding kan je in je XML bestand aangeven welke elementen veranderen als de achterliggende data wordt aangepast. Dit gaat in combinatie met LiveData, wat een implementatie is van het Observable design pattern.
Om optimaal gebruik te maken van MVVM maken we gebruik van ViewModels. View models bezitten data die nodig zijn om een view te renderen. De Jetpack implementatie van view models behoudt deze data, ook als iemand een app pauzeert (door bijvoorbeeld op de home knop te drukken). Dit kan handig zijn als je niet elke keer data wilt op halen als je de app weer opent. Bovendien staan view models los van Context
en zijn dus goed te testen!
Ten slotte maken we ook gebruik van de nieuwe manier van navigeren in Android, de Navigation library. Met behulp van deze library kan je een graaf (graph) definiëren die de structuur van je app beschrijft.
Libraries
Naast de libraries van Jetpack maken we zo nu en dan ook gebruik van 3rd party libraries. Voorbeelden van libraries de we regelmatig gebruiken zijn Retrofit voor network requests, Glide voor het weergeven en cachen van images en Dagger voor dependency injection.
Tijdens het ontwikkelen van een app komt het met grote regelmaat voor dat je een lijstje van een bepaald type object wilt weergeven. Dit doen we dan in een zogenaamde RecyclerView. Om dit eenvoudig te kunnen toevoegen hebben we een generic recyclerview adapter ontwikkeld. Lees hierover meer in deze blog post.
Material Design
Bij het ontwerpen van de apps wordt rekening gehouden met de UI principes die Android-gebruikers kennen, namelijk Material design. Wij volgen hierin de guidelines van Android en proberen op alle schermen de juiste componenten te gebruiken. Lees meer over onze aanpak van design op onze design pagina.
Google Play
Nadat de ontwikkeling gereed is voor een app, start de acceptatie-test voor de klant en/of eindgebruikers. Zo kunnen de klanten kijken of de app geworden is wat ze voor ogen hebben.
Google Play biedt hier uitstekende ondersteuning voor. We maken hier vooral gebruik van de Internal test channel (voor de werknemers van 9to5) en de Alpha channel (voor de klant). Het aanmelden als tester gaat eenvoudig via een link die vanuit Google Play wordt aangeboden. Nadat je aangemeld bent als tester kan je de app gewoon uit de Play Store downloaden. Ook eventuele updates volgen via hetzelfde kanaal.
Firebase
Firebase is een platform wat gebruikt wordt bij het ontwikkelen van mobiele applicaties. Het bestaat uit vele producten waar wij veel gebruik van maken.
Om altijd bewust te zijn van eventuele crashes in de door ons gemaakte applicaties maken wij gebruik van Crashlytics. In het geval van een crash, wordt er een (anoniem) rapport verstuurd naar Firebase waar de eigenschappen van de crash staan beschreven. Zo kunnen we beter zien wat er mis is gegaan en kunnen we het probleem beter en sneller oplossen!
Ook maken we gebruik van het Analytics product. Hier kunnen we zien hoe gebruikers de app en bepaalde features gebruiken.
Ten slotte maken we zo nu en dan ook gebruik van de andere Firebase producten, zoals de Firestore, Remote config en A/B tests.
Bitrise
We proberen bij elk project zo veel mogelijk tijd te besparen door gebruik te maken van de juiste tools. Bitrise is een voorbeeld hiervan. Dit is een CI (Continuous Integration) tool om veel werk te automatiseren. Op het moment dat je een aanpassing hebt gedaan in de app die je wilt deployen naar de Google Play Store, wordt dit opgepikt door Bitrise. Bitrise zal in dit geval de unit en UI tests voor je uitvoeren, de app bouwen en signen, een AAB (Android App Bundle) genereren en als laatste sturen naar de Google Play Store.