Android
|
This content was generated with the assistance of AI and should be verified against the official documentation of Android before being relied on in production. See the section bibliography for the reference material consulted while preparing these pages. |
Welcome to the Android reference. It documents how to build native Android apps with Google’s own tools and language of choice: Android Studio, Gradle and Kotlin, on top of the Android SDK and Jetpack. The result runs directly on the platform, with no cross-platform layer in between.
This section targets Android 17 (API 37), built with Android Studio Quail 4 and the Android Gradle
Plugin (AGP) 9.4, written in Kotlin 2.4.20. TrailMate, the running example used across most pages, sets
compileSdk = 37, targetSdk = 36 (Google Play requires targeting API 36 for new apps and updates since
2026-08-31) and minSdk = 26. Every page names the exact library versions it uses — Compose BOM 2026.09.00,
Navigation 2.10.2 and Navigation 3 1.2.0, Room 2.8.5/3.0.3, Hilt 2.60.1 and the rest — so examples compile
against a consistent, current baseline rather than mixed-era snippets.
Both classic View-based UI (Activities, Fragments and XML layouts) and Jetpack Compose are covered in full, because most real Android codebases still contain both, and knowing where one ends and the other begins is part of the job. This section does not re-teach the Kotlin language itself — for that, see the Kotlin Reference, which this section links to instead of repeating, including its dedicated Kotlin for Android page. For the cross-platform alternative that targets Android and iOS from one TypeScript codebase, see React Native; for the native counterpart on Apple’s platforms, see Apple Platforms.
How Android app development got here
| Year | What changed |
|---|---|
2008 |
The Android SDK shipped alongside the first Android phone, apps written in Java against the platform’s own UI toolkit (Views, Activities). |
2011 |
Fragments arrived (Honeycomb, API 11) to let a UI be composed and reused across screen sizes, particularly on tablets. |
2014 |
Android Studio replaced Eclipse/ADT as the official IDE, Gradle became the build system, and the Android Runtime (ART) replaced Dalvik. Material Design was introduced the same year, defining the platform’s visual language. |
2017—2018 |
The Architecture Components (ViewModel, LiveData, Room) and Jetpack — Google’s umbrella for versioned, backward-compatible libraries — gave the platform an opinionated answer to app architecture. AndroidX replaced the original support libraries with semantically versioned packages. |
2019 |
Google announced Kotlin as its preferred language for Android development, ahead of Java. |
2021 |
Jetpack Compose 1.0 shipped: a declarative, Kotlin-first UI toolkit that replaces the View system’s imperative API with composable functions and state-driven recomposition. The Google Play Console also began requiring the Android App Bundle format for new apps. |
2022 |
Material 3 (Material You) became Compose’s default design system, with dynamic color and expressive theming. |
2025 |
OSSRH (Sonatype’s original Central staging service) shut down on 2025-06-30, moving library publishing to the Central Publisher Portal, and Navigation 3 reached 1.0.0 as a from-scratch, Compose-first navigation library. |
2026 |
AGP 9 made Kotlin support built-in (no separate Kotlin Gradle plugin needed) and switched to a new DSL by default; Android 17 (API 37) shipped, and Google’s phased developer verification program began rolling out. |
Much of what older books and tutorials describe predates this timeline: Eclipse/ADT, JCenter, AsyncTask and
Loaders, Kotlin synthetics, startActivityForResult, and LiveData-first, Views-only architectures. These
pages document the current approach and name the older one only where a reader is likely to meet it in an
existing codebase — see Books and official sources compared below
for the full list.
New here? Read in this order
If TrailMate will be a Compose app: Getting Started with Android → Project Structure, Gradle and Build Variants → Jetpack Compose Fundamentals → Compose Layouts, Modifiers and Lazy Lists → State, Recomposition and Side Effects in Compose → Recommended App Architecture → ViewModel, Lifecycle-Aware Components, Coroutines and Flow → Navigation in Compose.
If TrailMate is an existing View-based app instead: Activities and the Activity Lifecycle → Fragments and the Fragment Lifecycle → Views, XML Layouts, View Binding and Material Components → Saving UI State: Views vs. Compose → Views, Fragments and Activities vs. Compose: Architecture Comparison → Migrating from Views to Compose.
From there, pick the groups in What’s covered below in whatever order the app needs them: data and networking once it has something to store or fetch, system integration once it runs on a real device, and the quality and distribution pages before the first release.
The TrailMate app
Every code example across pages 1—36 is a slice of one running app, TrailMate: a hiking-trail companion,
package com.example.trailmate, that lists trails, shows their detail and lets a hiker mark favorites and
capture photos. Its domain is small on purpose: Trail(id, name, region, lengthKm, difficulty, photoUrl,
isFavorite), enum class Difficulty { EASY, MODERATE, HARD } and TrailPhoto.
TrailMate is built twice across these pages, in the two UI styles this section covers: a modern version
with a single ComponentActivity, TrailMateApp() and Compose screens
(TrailListScreen/TrailDetailScreen/SettingsScreen/PhotoCaptureScreen), and a legacy version with an
AppCompatActivity hosting a NavHostFragment and TrailListFragment/TrailDetailFragment built with
RecyclerView, ViewBinding and Safe Args. Both versions share the same data layer: a Retrofit-backed TrailApi
(with a Ktor TrailApiClient shown as an alternative) against https://api.example.com/v1/trails, a Room
TrailMateDatabase and a DataStore-backed UserPreferencesRepository, unified behind a TrailRepository
interface implemented by OfflineFirstTrailRepository. A TrailSyncWorker keeps data fresh in the background,
and a RecordHikeService foreground service tracks an active hike. Dependency injection is shown with both
Hilt (TrailMateApplication, NetworkModule, DatabaseModule, RepositoryModule) and a Koin alternative
(trailMateModule); images load through Coil in Compose and Glide in the legacy code. The app is split into
Gradle modules :app, :core:model, :core:data, :core:database, :core:network, :feature:trails and
:feature:settings, and is exercised by tests such as TrailListViewModelTest,
OfflineFirstTrailRepositoryTest, TrailDaoTest and TrailListScreenTest.
Pages 37—40 (building, signing, publishing and CI/CD) step away from TrailMate and use a real, published
library instead — com.irurueta:irurueta-android-glutils — so that the build, signing and Maven Central
publishing steps are shown against an actual build.gradle.kts and GitHub Actions workflow rather than a
fictional one.
What’s covered
Foundations & tooling
-
Getting Started with Android — installing Android Studio, creating the TrailMate project, running it on an emulator and a device, and the shape of a first project.
-
Project Structure, Gradle and Build Variants — the Gradle Kotlin DSL, version catalogs, build types and product flavors, AGP 9’s built-in Kotlin support, and multi-module Gradle projects.
-
App Components, the Manifest and Intents — Activities, Services, Broadcast Receivers and Content Providers, the manifest, and explicit and implicit intents.
-
Resources, Configuration, Localization and Themes — resource qualifiers, string resources and pluralization, per-app language preferences, and styles and themes.
Classic View-based UI
-
Activities and the Activity Lifecycle — the Activity lifecycle callbacks, configuration changes, and the back stack.
-
Fragments and the Fragment Lifecycle — the Fragment lifecycle,
FragmentManager, and communicating between fragments. -
Views, XML Layouts, View Binding and Material Components —
ConstraintLayoutand friends, View Binding, and Material Components for Android. -
RecyclerView and Lists —
RecyclerView.Adapter,ListAdapterwithDiffUtil, andViewHolderpatterns. -
Custom Views, Touch, Drawing and View Animation —
Canvas, custom measuring and drawing, gesture detection, and property animation. -
Navigation with Fragments (Navigation Component, Drawer, Bottom Nav, Tabs) — the Navigation Component’s
NavHostFragmentand Safe Args, navigation drawers, bottom navigation and tabs.
Jetpack Compose
-
Jetpack Compose Fundamentals — composable functions, recomposition, and the Compose mental model.
-
Compose Layouts, Modifiers and Lazy Lists —
Row/Column/Box, theModifierchain, andLazyColumn/LazyRow. -
State, Recomposition and Side Effects in Compose —
remember,mutableStateOf, state hoisting, andLaunchedEffect/DisposableEffect. -
Material 3 and Theming in Compose —
MaterialTheme, dynamic color, and building a design system on top of Material 3. -
Navigation in Compose (Navigation Compose and Navigation 3) —
NavHostand type-safe routes, and Navigation 3’s scene-based API. -
Compose Animation and Gestures —
animate*AsState,AnimatedVisibility, and gesture detection withpointerInput. -
Adaptive Layouts, Edge-to-Edge and Large Screens — window size classes, edge-to-edge and predictive back, and foldable/tablet layouts.
-
Accessibility (Views and Compose) — semantics, content descriptions, and testing accessibility in both UI toolkits.
Architecture: old vs. new
-
Recommended App Architecture (UI, Domain and Data Layers) — the official UI/domain/data layering, unidirectional data flow, and where TrailMate’s modules fit.
-
ViewModel, Lifecycle-Aware Components, Coroutines and Flow —
ViewModel,viewModelScope,StateFlow, and LiveData/RxJava as legacy alternatives. -
Saving UI State: Views vs. Compose —
onSaveInstanceState()versusrememberSaveable, and process death. -
Views, Fragments and Activities vs. Compose: Architecture Comparison — a side-by-side comparison of the two UI models' architectural consequences.
-
Migrating from Views to Compose — interoperability APIs, incremental migration strategy, and migrating navigation.
Data, networking & libraries
-
Local Storage: DataStore, Files, Scoped Storage and MediaStore — Preferences and Proto DataStore, scoped storage, and the photo picker.
-
Room Database and Paging — entities, DAOs and migrations, Room 3, and Paging 3.
-
Networking with Retrofit, OkHttp and Ktor — Retrofit and OkHttp, the Ktor client alternative, and kotlinx.serialization/Moshi.
-
Image Loading, Caching and Transformations with Coil and Glide — Coil 3 in Compose, Glide 5 in Views, and caching strategy.
-
Dependency Injection with Hilt, Dagger and Koin — Hilt modules and scopes, the Koin alternative, and manual DI with an
AppContainer.
System integration & device features
-
Background Work: WorkManager, Services and Alarms —
CoroutineWorker, foreground services, andAlarmManager. -
Notifications, Firebase Cloud Messaging and App Widgets (Glance) — notification channels, FCM, and Glance app widgets.
-
Permissions, Privacy and Security — runtime permissions, the Keystore, and network security configuration.
-
Camera, Location, Sensors, Media and Connectivity — CameraX, location and Credential Manager, sensors, and Bluetooth/NFC.
-
Graphics: Canvas, OpenGL ES and GLTextureView — 2D
Canvasdrawing, OpenGL ES basics, and the realGLTextureViewfromirurueta-android-glutils.
Quality
-
Unit Testing with JUnit, Mockito, MockK and Robolectric — JVM tests for ViewModels and repositories, mocking, and Robolectric.
-
Instrumented and UI Testing (Espresso, Compose Testing, UI Automator) — device/emulator tests, Espresso, and the Compose testing APIs.
-
Debugging, Code Quality and Performance — Logcat and the debugger, ktlint/detekt, LeakCanary/Chucker, and profiling.
Build, ship & automate
-
Building, Signing and Preparing a Release — release build types, app signing, and the App Bundle format.
-
Publishing on Google Play — the Play Console, staged rollouts, and the target API level requirement.
-
Building and Publishing Android Libraries to Maven Central — the vanniktech plugin, the Central Publisher Portal, and
irurueta-android-glutilsas a worked example. -
CI/CD with GitHub Actions — CI on an emulator, release workflows, and publishing docs and artifacts.
Reference
-
Kotlin Reference — the Kotlin language this whole section is written in, including Kotlin for Android, coroutines and flows, plus its own downloadable cheat sheet.
-
Hugging Face Models on Android (AI section) — bringing Hub models to a phone with LiteRT, LiteRT-LM, ONNX Runtime, ExecuTorch and llama.cpp, plus Gemini Nano through AICore.
-
Cheat Sheet (PDF) — a one-page A4 summary of this section for quick memorization.
Books and official sources compared
Six books were read locally against the concepts documented here, purely to decide what to cover and to check for gaps — none of them is quoted or copied into this repository.
| # | Book | Publisher / year / ISBN | Publisher page |
|---|---|---|---|
B1 |
Harun Wangereka, Mastering Kotlin for Android 14 |
Packt, 2024, ISBN 978-1-83763-171-1 |
|
B2 |
Kevin Brothaler, OpenGL ES 2 for Android: A Quick-Start Guide |
Pragmatic Bookshelf, 2013, ISBN 978-1-937785-34-5 |
|
B3 |
Alex Forrester, Eran Boudjnah, Alexandru Dumbravan, Jomar Tigcal, How to Build Android Apps with Kotlin |
Packt, 2021, ISBN 978-1-83898-411-3 |
|
B4 |
Marcin Moskała, Igor Wojda, Android Development with Kotlin |
Packt, 2017, ISBN 978-1-78712-368-7 |
|
B5 |
Dave Smith, Jeff Friesen, Android Recipes: A Problem-Solution Approach, 3rd ed. |
Apress, 2014, ISBN 978-1-4302-6322-7 |
|
B6 |
Grant Allen, Android for Absolute Beginners |
Apress, 2021, ISBN 978-1-4842-6645-8 |
Legend for the matrix below: full = the concept has a chapter or main section in that book; partial = partial coverage, or an older API for the same concept; none = not covered. The Official Android Developers documentation is the primary source behind every page regardless of book coverage.
| Concept group (pages) | Official | B1 | B2 | B3 | B4 | B5 | B6 |
|---|---|---|---|---|---|---|---|
Studio, project, Gradle, version catalogs (1—2) |
full |
full |
partial |
full |
partial |
partial (Eclipse/ADT) |
full |
Manifest, components, intents, tasks (3) |
full |
partial |
none |
full |
none |
full |
full |
Resources, configuration, localization (4) |
full |
partial |
none |
partial |
none |
full |
partial |
Activity lifecycle (5) |
full |
partial |
partial |
full |
partial |
full |
full |
Fragments (6) |
full |
none |
none |
full |
none |
partial |
full |
XML views, layouts, widgets, themes (7) |
full |
none |
none |
full |
partial |
full |
full |
RecyclerView / lists (8) |
full |
none |
none |
full |
full |
partial (ListView) |
partial |
Custom views, drawing, animation, MotionLayout (9) |
full |
none |
none |
full |
none |
full |
none |
Fragment navigation, drawer, bottom nav, tabs (10) |
full |
none |
none |
full |
none |
partial |
none |
Compose fundamentals, layouts, state (11—13) |
full |
full |
none |
none |
none |
none |
none |
Material 3 / theming (14) |
full |
full |
none |
partial (MDC) |
none |
none |
none |
Compose navigation / Navigation 3 (15) |
full |
partial (Nav 2) |
none |
none |
none |
none |
none |
Compose animation and gestures (16) |
full |
none |
none |
none |
none |
none |
none |
Adaptive layouts, edge-to-edge (17) |
full |
partial |
none |
partial (dual pane) |
none |
partial |
none |
Accessibility (18) |
full |
partial |
none |
none |
none |
none |
none |
Architecture, MVVM, layers (19) |
full |
full |
none |
full |
partial |
none |
none |
ViewModel, lifecycle, coroutines, Flow, LiveData, RxJava (20) |
full |
full |
none |
full |
partial (RxJava) |
partial ( |
partial |
State persistence, Views vs Compose (21) |
full |
partial ( |
none |
full ( |
none |
partial |
partial |
Views vs Compose comparison and migration (22—23) |
full |
none |
none |
none |
none |
none |
none |
Preferences, DataStore, files, scoped storage (24) |
full |
partial |
none |
full |
partial |
full |
full |
Room / SQLite / Paging (25) |
full |
full |
none |
full |
none |
partial (SQLite) |
partial (SQLite) |
Networking: Retrofit, OkHttp, Ktor (26) |
full |
full |
none |
full (+Moshi) |
partial |
partial ( |
none |
Image loading: Coil, Glide (27) |
partial |
partial (Coil) |
none |
full (Glide) |
partial (Glide/Picasso) |
partial (manual) |
none |
DI: Hilt, Dagger, Koin (28) |
full |
full (Koin) |
none |
full (Dagger/Koin) |
none |
none |
none |
Background: WorkManager, services, alarms (29) |
full |
full |
none |
full |
none |
full |
full |
Notifications, FCM, app widgets (30) |
full |
partial (FCM) |
none |
full |
none |
full (AppWidgets) |
full |
Permissions, privacy, security (31) |
full |
full |
none |
full |
none |
partial |
partial |
Camera, location, maps, sensors, media, Bluetooth/NFC/USB, WebView (32) |
full |
none |
none |
partial (Maps) |
none |
full |
full (media) |
Graphics: Canvas, OpenGL ES, NDK, RenderScript (33) |
full |
none |
full |
none |
none |
partial |
none |
Unit tests: JUnit, Mockito, Robolectric (34) |
full |
full |
none |
full |
partial |
none |
none |
Instrumented / UI tests (35) |
full |
full (Compose) |
none |
full (Espresso) |
none |
none |
none |
Debugging, quality, performance (36) |
full |
full |
partial |
partial |
none |
partial |
partial |
Build, sign, publish on Play (37—38) |
full |
full |
none |
full |
none |
none |
none |
Android libraries, Maven Central (39) |
full |
none |
none |
none |
none |
partial (library projects) |
none |
CI/CD with GitHub Actions (40) |
none |
full |
none |
none |
none |
none |
none |
Concepts found mostly in the books, folded into an existing page rather than given a page of their own: LeakCanary, Chucker, ktlint and detekt (B1, page 36); Firebase Crashlytics and Cloud Messaging (B1, pages 36 and 30); RxJava versus coroutines (B3/B4, page 20, as legacy); Data Binding (B3, page 7, as legacy); MotionLayout and CoordinatorLayout (B3/B6, page 9); Moshi (B3, page 26); Bluetooth, NFC, USB and WebView (B5, page 32); content providers (B5/B6, page 3); AppWidgets (B5, page 30); and NDK/RenderScript (B5, page 33, with RenderScript named as deprecated).
Official concepts documented from the official sources alone, with no book coverage: Navigation 3, adaptive layouts and window size classes, edge-to-edge and predictive back, the targetSdk 36/37 large-screen rules, Credential Manager, Baseline Profiles and Macrobenchmark, AGP 9’s built-in Kotlin and its new DSL, KSP2, Room 3, the photo picker, the Compose testing APIs, UI Automator 2.4, the Central Publisher Portal and the vanniktech plugin, Play developer verification, the 16 KB page-size rule, Coil 3 and Glide 5.
Outdated book material is named only as legacy, each with the modern replacement used on the matching page:
Eclipse/ADT (Android Studio), JCenter (Maven Central), OSSRH (the Central Publisher Portal), kapt (KSP), Kotlin
synthetics (View Binding), AsyncTask/Loaders (coroutines), IntentService (WorkManager),
onRetainNonConfigurationInstance (ViewModel), ListView (RecyclerView/LazyColumn), RenderScript
(Vulkan/AGSL), startActivityForResult (the Activity Result API), onBackPressed() (OnBackPressedCallback),
Picasso (Coil), and LiveData-first design (StateFlow).
Related sections
This section builds on material documented elsewhere on this site rather than repeating it. The Kotlin Reference covers the language every example is written in — including coroutines, flows and Kotlin for Android itself. Kotlin Multiplatform shares Kotlin code (and, with Compose Multiplatform, UI) between this TrailMate app and iOS, desktop and the web. React Native is the cross-platform alternative that targets Android and iOS from one TypeScript codebase, and Apple Platforms is the native counterpart on Google’s rival ecosystem, covering iOS, iPadOS, macOS, watchOS and visionOS with Swift and SwiftUI. Native and Mobile Apps is the OAuth protocol reference behind this section’s Credential Manager and sign-in material, Git & GitHub underlies the version control and pull-request workflow assumed on the CI/CD page, and Docker covers the containers that back the emulator and backend services a real TrailMate deployment would run against.
-
Android IDEs & Tools — Android Studio, IntelliJ IDEA, the Android Emulator and the SDK command-line tools, with links to each official page.
Bibliography
Android Developers documentation
The primary source for every page and every code example. Each concept page cites the specific articles and
reference pages it uses; the entries below are every developer.android.com URL cited across the section,
grouped by the same nav sections as What’s covered above.
-
Foundations & tooling — Android Version History, Android 17, AI on Android, Configure Build Variants, Build Your App from the Command Line, Configure Your Build Module, Add Build Dependencies, Extend the Android Gradle Plugin, Gradle Build Overview, Configure the JDK Used for Gradle, Kotlin Support in the Android Gradle Plugin, Manage the Manifest File, Migrate to AGP’s Built-in Kotlin Support, Migrate your Build to Version Catalogs, Migrate your Build to the Kotlin DSL, Migrate from kapt to KSP, Optimize Your Build Speed, AGP 9.0.0 Release Notes, AGP 9.4.0 Release Notes, Shrink, Obfuscate, and Optimize Your App, Android Basics with Compose, Broadcasts Overview, Services Overview, Android Interface Definition Language (AIDL), Bound Services, Using the Compose BOM, Resources in Compose, Dark Theme, Codelabs, Get Started: Overview, Meet Google Play’s Target API Level Requirement, Introduction to Activities, Processes and the Application Life Cycle, Tasks and the Back Stack, App Components, Common Intents, Intents and Intent Filters, Android Platform Architecture,
<activity>element, App Manifest Overview,<provider>element,<queries>element,<receiver>element,<service>element,<uses-feature>element, The<uses-sdk>Element, Permissions on Android, Content Provider Basics, Content Providers, Support Per-App Language Preferences, Localization, More Resource Types, Support Different Languages and Cultures, Providing Resources, Providing Resources: Alternative Resources, Handle Configuration Changes, String Resources, String Resources: Quantity Strings (Plurals),Application,PendingIntent,Intent,Resources,AppCompatResourcesreference,FileProvider,androidx.compose.ui.respackage reference, Official samples, Download Android Studio, Write and View Logs with Logcat, Gemini in Android Studio, Meet Android Studio, Overview of Android App Projects, Run Apps on a Hardware Device, Run Apps on the Android Emulator, Android Debug Bridge (adb), Shrink, Obfuscate and Optimize Your App, App Links, Create Deep Links to App Content, Verify App Links, Supporting Multiple Screens: Screen Densities, Package Visibility Filtering on Android. -
Classic View-based UI — Android 15 Behavior Changes, Overview of Animation, Property Animation Overview, Slide Between Fragments Using
ViewPager2, Start an Activity Using an Animation, Add an App Bar, Dialogs, Menus, Hardware Acceleration, Splash Screens, Build a Responsive UI with ConstraintLayout, Create a Custom View, Custom Drawing, Layouts, Edge to Edge, Linear Layout, Create Dynamic Lists withRecyclerView,SlidingPaneLayout, Dark Theme, Apply Dynamic Color, Styles and Themes, Detect Common Gestures, The Activity Lifecycle, Introduction to Activities, Processes and the Application Life Cycle, Fragments, Communicate Between Fragments, FragmentManager, Fragment Lifecycle, Navigation, The Navigation Back Stack, Predictive Back Gesture, Navigate with Type Safety, Navigate to a Destination, Nested Navigation Graphs, Test Navigation, Update UI Components with NavController, Pass Data Between Destinations with Safe Args, Vector Drawables Overview, Make Apps More Accessible,LayoutTransition,Canvas,Paint,Path,GestureDetector,ScaleGestureDetector,View,View.invalidate(),View.onSizeChanged(),View.requestLayout(),View.MeasureSpec,ViewGroup,Interpolator,FrameLayout,ComponentActivity,OnBackPressedDispatcher,MotionLayout,CoordinatorLayout,CoordinatorLayout.Behavior,WindowInsetsCompatreference,DrawerLayout,Fragment.setArguments(),FragmentContainerView,FragmentFactory,NavDeepLinkBuilder,NavOptions,androidx.navigation.fragmentPackage Summary,TestNavHostController,AppBarConfiguration,ConcatAdapter,DiffUtil,GridLayoutManager,ItemTouchHelper,ListAdapter,RecyclerView,RecyclerView.Adapter,RecyclerView.Adapter.setHasStableIds(),RecyclerView.ItemAnimator,RecyclerView.ItemDecoration,RecyclerView.LayoutManager,RecyclerView.ViewHolder,StaggeredGridLayoutManager,ViewPager2,AppBarLayout,BottomNavigationView,NavigationView,NavigationRailView,TabLayout,TextInputLayoutreference, Handling Lifecycles with Lifecycle-Aware Components, Saving UI States, ViewModel Overview, Data Binding Library, View Binding, Create Deep Links to App Content, Get a Result from an Activity, Auto-animate layout updates, Manage motion and widget animation with MotionLayout, Create custom view components, Drag and scale, Create a fragment, Display dialogs with DialogFragment, Fragment transactions, Fragments and the Kotlin DSL, Design your navigation graph, Create swipe views with tabs using ViewPager2, Navigate to a destination, Interact programmatically with the Navigation component,ViewGroupCompatreference. -
Jetpack Compose — Build adaptive apps, Jetpack Compose, Make your Android app accessible (pathway), Accessibility in Compose, Semantics in Compose, Use animation composables and modifiers, Customize animations in Compose, Animation in Compose, Choose an animation API, Shared element transitions, Animate based on a value, Compose architecture layers, Compose BOM, Material Components in Compose, Scaffold, Locally Scoped Data with CompositionLocal, Create a Custom Modifier Using Modifier.Node, Building a custom design system in Compose, Material Design 3 in Compose, Migrate an XML theme to Compose, Graphics in Compose, Images in Compose, Material icons in Compose, Layouts in Compose, Constraintlayout in Compose, Custom Layouts in Compose, Use Flow Layouts in Compose, Create a Pager, Lifecycle of composables in Compose, Lists and Grids, Lists and grids, item animations, Thinking in Compose, Migrate views to Compose, Compose Modifiers, Compose Performance Best Practices, Stability in Compose, Strong skipping mode, Phases of jetpack compose, Resources in Compose, Side-effects in Compose, State in Jetpack Compose, State Hoisting in Jetpack Compose, Save UI State in Compose, Compose insets, Support predictive back gestures, Text in Compose, Fonts in Compose, Selecting and handling text, Jetpack Compose tooling, Preview your UI, Handle input in Compose, Detect drag, swipe and fling gestures, Jetpack Compose Tutorial, Create Dynamic Lists with
RecyclerView, Dark theme, Dynamic colors, Window insets, Core app quality, Navigation, Back stack and multitasking, Handle the predictive back gesture, Navigate with NavController, Navigation 3, Overview of scenes, Test navigation, Accessibility overview, Make apps more accessible, Principles for improving app accessibility, Test your app’s accessibility,androidx.compose.material3release notes, Navigation, Navigation3,ComponentActivity,androidx.compose.foundation.gestures,androidx.compose.material3reference,androidx.compose.runtimereference, Inspect the layout of your running app, Events in the UI Layer, State Holders and State Production, Integrate Lifecycle with Compose, Lifecycle in Jetpack Compose, Behavior changes: apps targeting Android 16, Orientation and resizability restrictions are ignored, System bars (design guidance), Merging and clearing, Accessibility testing in Compose, Modify traversal order, App bars, Bottom sheets, Button, Card, Chip, Dialog, Navigation bar, Pull to refresh, Search bar, Switch, Orientation, aspect ratio and resizability, Build a supporting pane layout, Build adaptive navigation, Canonical layouts for adaptive apps, Make your app fold-aware, Get started with adaptive apps in Compose, Build a list-detail layout, Support different display sizes, Support different screen sizes with window size classes, Fix stability issues, System bars in Compose, Multitouch: Panning, zooming, rotating, Tap and press, Use window size classes with Views, Adaptive apps quality, Create a deep link for a destination, Nested graphs, Deep links in Navigation 3, Get started with Navigation 3, Apply logic to destinations with NavEntryDecorators, Return a result from a screen, Multi-window support, FoldingFeature,animateColorAsState, Add navigation elements with NavigationSuiteScaffold,Modifier.graphicsLayer. -
Architecture: old vs. new — Jetpack Compose, Bill of Materials (BOM), Migrate XML themes to Compose, Compose layout basics, Lifecycle of composables, Lists and grids, Thinking in Compose, Migrate to Compose, Compose and View interoperability APIs, Use Compose in Views, Use Views in Compose, Migrate an XML Views app to Jetpack Compose, Migrate navigation, Migration strategy, Compose performance, Save UI State in Compose, Testing your Compose layout, Preview your UI, Create a custom view, Layouts, Styles and themes, Save and restore activity state, Processes and the Application Life Cycle, Supply arguments to a fragment, Fragment lifecycle, Navigation, Navigation 3, Navigation 3 basics, Migrate to Navigation 3, Navigation 3 — Save and restore state, Handle configuration changes, Kotlin coroutines on Android, Coroutines best practices on Android, Kotlin Flow, StateFlow and SharedFlow, Parcelable implementation generator,
Context,TransactionTooLargeException,AbsSavedState,View.onSaveInstanceState(),TextViewfreezesText,ProcessLifecycleOwner,rememberLazyListState(),rememberSaveableStateHolder(),StateRestorationTester, Android Debug Bridge (adb), Guide to app architecture, Data layer, Offline-first apps, Domain layer, Guide to app architecture, Recommendations for Android architecture, UI layer, UI events, Producing UI state, State holders and UI State, Coroutines and Lifecycle-Aware Components, DataStore, Handling Lifecycles with Lifecycle-Aware Components, LiveData Overview, Saving UI States, Saving UI States — restore UI state, Test your app’s process death handling, ViewModel Overview, Saved State module for ViewModel, View binding, Guide to Android app modularization, Baseline Profiles overview, Save data in a local database using Room, Espresso, Compose and other libraries (Streams), Migrate RecyclerView to Lazy list,Saver,listSaver,mapSaverreference,Fragment.viewModels(),ViewModel.addCloseable(),LifecycleOwner.lifecycleScope,SavedStateHandle.saveable(),viewModel(),viewModelFactory(), Design a layout with Layout Editor, Create ViewModels with dependencies,androidx.lifecycle.viewmodel.compose(SavedStateHandle.saveable),androidx.compose.foundation(AndroidExternalSurface,AndroidEmbeddedExternalSurface). -
Data, networking & libraries — Migrate to KSP from kapt, Connectivity, Perform network operations using Cronet, Perform network operations, Connect to the network, Manage network usage, Images in Compose, androidx.hilt release notes, Room 3.0 release notes, Cryptography, Android Keystore system, Network security configuration, ImageDecoder, ConnectivityManager.NetworkCallback,
FileProvider, ExifInterface, @Upsert, MigrationTestHelper, DataStore, Test Paging, Paging: Load data from network and database, Paging 3 overview, Save UI states with ViewModel and SavedStateHandle, Load large bitmaps efficiently, Manage your app’s memory, Data and File Storage Overview, Save data in a local database using Room, Accessing data using Room DAOs, Migrate your Room database, Test your Room database, Add an item, Photo picker, Save data using SQLite, Dependency injection in Android, Hilt dependency injection with Hilt, Hilt and Jetpack, Hilt testing guide, Manual dependency injection, Monitor connectivity status and connection metering, Storage updates in Android 11, ThedataExtractionRulesXML, Back up user data with Auto Backup,SharedPreferences.Editor,SharedPreferences, Bitmap.compress,MediaStore.Images.Media,ActivityResultContracts.OpenDocument,ActivityResultContracts.PickVisualMedia,MultiProcessDataStoreFactory, Serializer,androidx.datastore.preferences.core, Manage and present loading states, Load and display paged data, Access app-specific files on external storage, Save and read files in internal storage (app-specific), Define data using Room entities, Prepopulate your Room database, Referencing complex data using Room, Choose relationship types between objects, Access documents and other files from shared storage, Access media files from shared storage, Choose a data storage solution,SharedPreferencesMigration. -
System integration & device features — Foreground service types are now required, Guide to background work, Background tasks overview, Broadcast overview, Understand battery optimizations for background tasks, Persistent work with WorkManager, Getting started with WorkManager, Best practices for background tasks, Chain work, Define your WorkRequest, Manage work, Observe work status and take action after work succeeds, Test WorkManager, User-initiated data transfer, Schedule repeating alarms, Schedule alarms, Foreground services, Foreground service behavior changes, Declare a foreground service’s type, Foreground service types, Bluetooth, Location, Build app widgets with Glance, Notifications overview, Create and manage notification channels, Create a notification, Create an expanded notification, Notification runtime permission, Compose, App widgets overview, Graphics overview, AGSL, Drawables, OpenGL ES, Android XR, Vulkan on Android, Play Integrity API, Permissions on Android, Credential Manager, Biometric authentication, SMS Retriever API, User data IDs on Android, CameraX, CameraX architecture, Choose a camera library, Media3, ExoPlayer, NDK, Graphics (NDK), Privacy on Android, Cryptography, Android Keystore system, Security tips, AppOpsManager,
IntentService,JobScheduler,GLSurfaceView, the Credential Manager sign-in flow,TextureView,NotificationCompat.Builderreference, Build apps for cars, Photo picker, Hilt and Jetpack, WorkManager with Hilt, Request location permissions, Optimize for Doze and App Standby, Request runtime permissions, Build TV apps, Create and monitor geofences, Request location updates, Get the last known location, Sensors overview, Create an app widget with Glance, Manage and update GlanceAppWidget, Build an OpenGL ES environment, Build web apps in WebView, Start an Activity from a Notification, Implement a preview, Capture an image, Background playback with a MediaSessionService, Control media playback, MediaRecorder overview, Minimize permission requests, android:exported, Common security risks for Android apps, RenderEffect, Get started with Wear OS, Foreground service timeouts,JobService,SurfaceView, Behavior changes: all apps (Android 14), Audit access to data. -
Quality — Testing your Compose layout, Compose testing APIs, Migrating Espresso tests to Compose, Compose testing cheat sheet, Android vitals, Testing Kotlin coroutines on Android, StrictMode,
ActivityScenario,StateRestorationTester, Debug your app, Write and view logs with Logcat, Compose Preview Screenshot Testing, Profile your app performance, Use Gradle Managed Devices, Run tests in Android Studio, Improve your code with lint checks, Android Debug Bridge (adb), App Startup, ANRs, App startup time, Rendering performance, Overview of app tracing, Test your activity’s lifecycle interactions, Test your Room database, Hilt testing guide, Test apps on Android, Espresso, Accessibility checking with Espresso, Basics, Idling Resources, Espresso-Intents, Testing RecyclerView actions, Fundamentals of testing, Testing strategies, Test doubles, What to test, Build instrumented tests, Use Android Test Orchestrator, Set up Espresso and other AndroidX Test libraries, Local tests, Robolectric, UI Automator, Synchronize your tests, Test your fragments, Inspect database data with Database Inspector, Inspect WorkManager jobs with Background Task Inspector, Inspect CPU activity with CPU Profiler, Inspect network traffic with Network Inspector, Analyze and optimize your app’s startup time, Create Baseline Profiles, Benchmarking, Macrobenchmark, Microbenchmark, Reduce memory leaks with LeakCanary, Add custom trace events, androidx.tracing. -
Build, ship & automate — Configure Build Variants, Overview of Publishing Your Library, Configure Publishing Variants, Upload Your Library to a Maven Repository, Shrink, Obfuscate and Optimize Your App (keep rules), Developer verification, Play policies, Play Billing, Play Integrity API, Meet Google Play’s target API level requirement, Android vitals, About Android App Bundles, Feature Delivery, In-app review, In-app updates, Support 16 KB Page Sizes, Decode an Obfuscated Stack Trace, Create an Android Library, Sign Your App, Prepare for Release, Version Your App, Use Gradle Managed Devices, apksigner, bundletool, Shrink, Obfuscate and Optimize Your App, Shrink, Obfuscate and Optimize Your App, Android Developer Console, Alternative distribution options, Integrate the Google Play Billing Library into your app, Overview of the Play Integrity API, Configure on demand delivery, Integrate in-app reviews (Kotlin or Java), Test in-app reviews, Support in-app updates (Kotlin or Java), Test in-app updates, Overview of the Google Play Core libraries, Upload your app to the Play Console, Optimization for library authors, View code coverage reports.
Google Play Console Help and Google blogs
-
Google Play Console Help — About app signing, Google Play Console Help — Pre-launch reports, Google Play Console Help — Set up an open, closed, or internal test, Google Play Console Help — Create and set up your app, Google Play Console Help — Roll out a release, Google Play Console Help — Data safety, Google Play Console Help — Meet Google Play’s target API level requirement, Google Play Console Help — Testing requirements for new personal developer accounts, Google for Developers — Edits (Google Play Developer API), Google for Developers — Getting Started (Google Play Developer API), Google for Developers — Google Play Developer API, Google Play Console Help — Choose a developer account type, Google Play Console Help — Get started with Play Console, Google Play Console Help — Prepare your app for review, Google Play Console Help — Publish your app, Google Play Console Help — Add preview assets to showcase your app, Google Play Console Help — Manage target audience and app content settings, Google Play Console Help — Content Ratings.
Kotlin, Jetpack and AndroidX release notes
-
Kotlin — Releases, Kotlin — What’s New, Android Developers — AGP 9.0.0 Release Notes, Android Developers — AGP 9.4.0 Release Notes, Android Developers —
androidx.compose.material3release notes, Android Developers —androidx.hiltrelease notes, Android Developers — Navigation release notes, Android Developers — Navigation3 release notes, Android Developers — Room 3.0 release notes, Kotlin coding conventions, Kotlin Documentation — Coroutines basics, Kotlin Documentation — Dokka Gradle plugin, Kotlin Documentation — Asynchronous Flow, Kotlin — Kotlin Symbol Processing (KSP), Kotlin — Serialization, Kotlin Documentation — Explicit API mode for library authors, kotlinx.coroutines — runTest.
Third-party libraries
-
Networking — Retrofit, OkHttp, Ktor — Create and configure a client, kotlinx.serialization — GitHub, Moshi — README.
-
Images — Coil, Glide — Getting started, Fresco.
-
Dependency injection — Dagger — Hilt, Koin — Android + Compose quickstart, Metro — GitHub repository.
-
Testing — Mockito, javadoc.io — mockito-kotlin, MockK, Robolectric, GitHub — Turbine.
-
Debugging and quality — LeakCanary documentation, Chucker on GitHub, ktlint documentation, detekt documentation.
-
Firebase — Firebase Documentation — Crashlytics, Firebase Documentation — Performance Monitoring, Firebase — Set up a Firebase Cloud Messaging client app on Android, Firebase Documentation — Test your Android app with Android Studio Cloud Testing (Firebase Test Lab).
-
Other libraries and tools — Glide — Caching, Cache invalidation, Glide — Caching, Glide Documentation — Configuration, Glide Documentation — Download & Setup, Glide — Generated API, Glide Documentation — Transformations, Glide Documentation — Compose, Glide Documentation — RecyclerView, Glide — ListPreloader, Glide — DiskCacheStrategy, Glide Documentation — BitmapTransformation, Coil Documentation — CachePolicy, Coil Documentation — Transformation, Coil Documentation — Compose, Coil — Getting started, Coil Documentation — Getting started, Coil — GIFs, Coil — Image loaders, Caching, Coil Documentation — Image loaders (Preloading), Coil Documentation — Image loaders, Coil — Network, Coil — SVGs, Coil Documentation — Testing, Coil — Upgrading to Coil 3, Coil — Videos, Dagger Documentation — User’s Guide, Dagger Documentation — Assisted injection, Dagger Documentation — Entry Points, detekt Documentation — Run detekt using the Detekt Gradle Plugin, detekt Documentation — detekt Configuration File, Firebase Documentation — Receive messages in Android apps, Firebase — About FCM messages, ktlint-gradle — ktlint Gradle plugin, Kotlin — Binary Compatibility Validator, Gson — README, android-junit5 — Android JUnit 5 Gradle plugin, okhttp — Caching, okhttp — Events, okhttp — HTTPS (Certificate Pinning), okhttp — Interceptors, okhttp — Recipes (Timeouts), okhttp — MockWebServer, okhttp — Logging Interceptor, retrofit — Kotlin Serialization Converter, Tink on GitHub, Koin Documentation — Android Scope, Koin Documentation — Koin Annotations, Koin Documentation — Verifying your Koin configuration, Ktor — Authentication and authorization, Ktor — Default request, Ktor — Logging, Ktor — Content negotiation and serialization, Ktor Documentation — Testing in Ktor Client, Ktor — Timeout, Ktor — Client WebSockets, Material Design — Material Components for Android (MDC), Robolectric — Configuring Robolectric, Android Open Source Project — APK Signature Scheme, Robolectric — ShadowLooper, Google for Developers — Maps Compose library.
Publishing and CI
-
Central Sonatype — Central Publisher Portal, Central Sonatype — OSSRH End-of-Life, Central Sonatype — Working with PGP Signatures, vanniktech — Publishing to Maven Central, vanniktech — Signing > In-Memory Signing, Dokka.
-
GitHub Docs — GitHub Actions, GitHub Docs — GitHub-hosted runners, GitHub Changelog — Hardware-accelerated Android virtualization now available, GitHub —
actions/checkout, GitHub —actions/setup-java, GitHub —gradle/actions, GitHub —reactivecircus/android-emulator-runner, GitHub —EnricoMi/publish-unit-test-result-action, GitHub —crazy-max/ghaction-github-pages, GitHub —r0adkll/upload-google-play. -
Also cited — Sonatype Central Documentation — Publish Portal Snapshots, GitHub Docs — Dependabot options reference, Gradle Documentation — Build Environment Configuration, Gradle Documentation — Centralizing Repository Declarations, Gradle — Configuration Cache, Gradle — The Gradle Wrapper, Gradle Documentation — Sharing Build Logic Between Subprojects, Gradle — Version Catalogs.
The author’s repositories
-
irurueta-android-glutils — the real, published
GLTextureViewlibrary used by the graphics, publishing and CI/CD pages. -
irurueta-android-gl-cube, irurueta-android-gl-curl, irurueta-android-gesture-bitmap-view, irurueta-android-recycler-view-manager and irurueta-android-test-utils — other Android repositories referenced as further examples.
Books
| # | Book | Publisher / year / ISBN | Publisher page |
|---|---|---|---|
B1 |
Harun Wangereka, Mastering Kotlin for Android 14 |
Packt, 2024, ISBN 978-1-83763-171-1 |
|
B2 |
Kevin Brothaler, OpenGL ES 2 for Android: A Quick-Start Guide |
Pragmatic Bookshelf, 2013, ISBN 978-1-937785-34-5 |
|
B3 |
Alex Forrester, Eran Boudjnah, Alexandru Dumbravan, Jomar Tigcal, How to Build Android Apps with Kotlin |
Packt, 2021, ISBN 978-1-83898-411-3 |
|
B4 |
Marcin Moskała, Igor Wojda, Android Development with Kotlin |
Packt, 2017, ISBN 978-1-78712-368-7 |
|
B5 |
Dave Smith, Jeff Friesen, Android Recipes: A Problem-Solution Approach, 3rd ed. |
Apress, 2014, ISBN 978-1-4302-6322-7 |
|
B6 |
Grant Allen, Android for Absolute Beginners |
Apress, 2021, ISBN 978-1-4842-6645-8 |