Showcasing Android Tech Stack
Freeletics has published four Android apps (Bodyweight, Running, Gym, Nutrition) as part of its product strategy. These apps collectively help everyone in the world unleash their full physical and mental potential and become the greatest version of themselves. We’re extremely proud of them, but at the same time, we owe a tremendous debt of gratitude to the communities that built the tools that made it possible.
From all of us at Freeletics, #ClapClap and Thank you!
A Little Background
Freeletics is a sport where you train with your own bodyweight only. It started off as a PDF-focused product back in 2013 and has grown into a flourishing Web and Mobile product. Choosing a tech stack is a commitment that’s not easily reversed, so future circumstances like scalability and performance should be considered. It’s also important to avoid compromising on user experience because there’s nothing more vital to an app than looking great and working smoothly. Despite being a tech company, we treat user experience as not just a part of design, but as an integral part of our product strategy.
Various technical factors have influenced our selection criteria for frameworks and libraries at different phases of the product’s development. We have had our fair share of experiments and setbacks, but we’ve always learnt from our mistakes and evolved our stack along with the product.
The information about our Android stack shared below is what we have right now, but we strongly believe in the words of Heraclitus, “change is the only constant in life.” The best is yet to be!
Java, SDK, Gradle and Support Library
For our Bodyweight app, we shifted to Java 8 last year but only use the bits of Java 8 supported by our minSdk, which doesn’t include everything. The rest of the apps will be moved in near future.
We try our best to stay current with the very latest versions of the Android SDK (currently 25.0.2), Gradle (currently 2.3.1), and Support libraries (currently 25.1.1). We strongly recommend that you always compile with the latest Android SDK. You’ll get all the benefits of new compilation checks on existing code, avoid newly deprecated APIs, and be ready to use new APIs. Furthermore, if you use the Support Library, compiling with the latest SDK is a requirement for using the latest Support Library release. Similarly, for Gradle, staying up to date is important. The Gradle update page says, “For the best performance, you should use the latest possible version of both Gradle and the Android plugin.” Hence it makes sense to update as soon there’s a new version.
Third Party Libs
This section outlines major third-party libraries for Android we already use in our projects. Each has different purpose and goal but all of them make our lives as developers much more pleasant.
Here are some key considerations to keep in mind while deciding which third-party library to use:
- How famous is this library? Is there a big enough community to keep it going? How many stars does it have on its github repo?
- How long has this library been around? What’s the current version number?
- Does the project has a commercial-friendly license?
- Does the repo have trustworthy and dedicated maintainers? is it a battle-tested library that won’t disappear overnight?
- Does the community seem to be struggling with this library’s implementation? Does someone in your network have experience with this library?
If you are interested in exploring other important libraries, please check out these resources (1, 2 and 3.) We hope they are helpful.
|Guava||Guava is a set of core libraries for Java from Google|
|Arrow||Arrow is Lightweight library toolbox for Java and Android Development|
|Ixjava||Iterable Extensions for Java, the dual of RxJava. Originally implemented in the Reactive4Java framework, now converted to work with RxJava|
|Dagger2||A fast dependency injector for Android and Java|
|Device Year Class||A library that analyzes an Android device’s specifications and calculates which year the device would be considered “high end”|
We currently have
Guava along with
Ixjava but this will change soon as we are already in process of replacing
Guava is being slowly replaced by other libraries, specially since Java 8’s Stream API was introduced.
IxJava has functional programming style which is very similar to
RxJava and something we already use. Additionally,
Guava is a monolith library and gives more reasons to use
Arrow which is like a compact version of
|Timber||A logger with a small, extensible API which provides utility on top of Android’s normal Log class|
|DebugOverlay||A tiny window overlay to log app internal on top of your android app|
|LeakCanary||A memory leak detection library for Android and Java|
|Process Phoenix||Process Phoenix facilitates restarting your application process|
|Screengrab||Automated localized screenshots of your Android app on every device|
|Stetho||Stetho is a debug bridge for Android applications, enabling the powerful Chrome Developer Tools and much more|
|ACRA||Library enabling Android Application to automatically post their crash reports to a report server|
Code Generation / Reducing Boilerplate code
|AutoValue||AutoValue is a great tool for eliminating the drudgery of writing mundane value classes in Java|
|Butter Knife||Field and method binding for Android views|
|DeepLinkDispatch||A simple, annotation-based library for making deep link handling better on Android|
|RxJava||Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM|
|RxAndroid||Android specific bindings for RxJava 2. This module adds the minimum classes to RxJava that make writing reactive components in Android applications easy and hassle-free|
|RxBinding||RxJava binding APIs for Android UI widgets from the platform and support libraries|
|RxRelay||Relays are RxJava types which are both an Observable and a Consumer|
|RxLifecycle||Lifecycle handling APIs for Android apps using RxJava|
Images Loading & Caching
|Picasso||A powerful image downloading and caching library for Android|
|Gson||A Java serialization/deserialization library to convert Java Objects into JSON and back|
Custom Views and Animations
|RecyclerView Animators||An Android Animation library which easily add itemanimator to RecyclerView items|
|SmoothProgressBar||A small Android library allowing you to have a smooth and customizable horizontal indeterminate ProgressBar|
|CWAC MergeAdapter||Provides the MergeAdapter, a ListAdapter that blends multiple Views or ListAdapters into a single ListAdapter. Use this for section headings, blending multiple sources of data together, etc.|
|PhotoView||Implementation of ImageView for Android that supports zooming, by various touch gestures|
|Rebound||A Java library that models spring dynamics and adds real world physics to your app|
|ShortcutBadger||The ShortcutBadger makes your Android App show the count of unread messages as a badge on your App shortcut!|
|StickyListHeaders||An Android library that makes it easy to integrate section headers in your ListView|
|Android Tooltip||Create Toast like tooltips, physical targets can be specified, or even points on screen|
|ViewPagerIndicator||Paging indicator widgets compatible with the ViewPager from the Android Support Library and ActionBarSherlock|
|Recycler Bubble||Provides fast scroll and section idexer for recycler view|
|Esperando||Easy SharedPreference Engine for Android|
|OrmLite||Lightweight Java ORM Supports Android and SQLite|
|SQLDelight||Generates Java models from CREATE TABLE statements|
OrmLite is used in one application and
SQLDelight in another newer one.
|OkHttp||An HTTP & HTTP/2 client for Android and Java applications|
|Okio||Okio is a library that complements java.io and java.nio to make it much easier to access, store, and process your data|
|Retrofit||A type-safe HTTP client for Android and Java. It uses annotation to describe HTTP server calls which is an elegant solution for managing REST API calls in an android application.|
|AssertJ Core||AssertJ core is a Java library that provides a fluent interface for writing assertions. Its main goal is to improve test code readability and make maintenance of tests easier|
|DaggerMock||A JUnit rule to easily override Dagger 2 objects|
|DeviceAnimationTestRule||A JUnit rule to disable and enable device animations|
|Espresso||Espresso is a UI test framework (part of the Android Testing Support Library) that allows you to create automated UI tests for your Android app|
|Mockito||Mockito is a mocking framework that lets you write beautiful tests with a clean & simple API|
|Robolectric||Robolectric is a unit test framework that de-fangs the Android SDK jar so you can test-drive the development of your Android app.|
|Spoon||Distributing instrumentation tests to all your Androids|
We are using
DaggerMock but we are moving away from this because it adds complexity and most recent Dagger versions allow us to do what we are trying to achieve with
Again, thank you! 👏