Android πŸ€–

Hero image for Android πŸ€–

Project Structure

The team typically uses the following project structure:

{project_name}
β”œβ”€β”€ app
β”‚Β Β  β”œβ”€β”€ libs
β”‚Β Β  β”œβ”€β”€ src
β”‚Β Β  β”‚   β”œβ”€β”€ androidTest (instrumented tests)
β”‚Β Β  β”‚   β”‚Β Β  └── java
β”‚Β Β  β”‚   β”‚Β Β   Β Β  └── {package_name}
β”‚Β Β  β”‚   β”‚Β Β          └── HomeScreenTest.kt
β”‚Β Β  β”‚   β”œβ”€β”€ main
β”‚Β Β  β”‚   β”‚Β Β  β”œβ”€β”€ java
β”‚Β Β  β”‚   β”‚Β Β  β”‚Β Β  └── {package_name}
β”‚Β Β  β”‚   β”‚Β Β  β”‚Β Β      β”œβ”€β”€ di
β”‚Β Β  β”‚   β”‚Β Β  β”‚Β Β      β”œβ”€β”€ extensions
β”‚Β Β  β”‚   β”‚Β Β  β”‚Β Β      β”œβ”€β”€ ui
β”‚Β Β  β”‚   β”‚Β Β  β”‚Β Β      β”‚   β”œβ”€β”€ base
β”‚Β Β  β”‚   β”‚Β Β  β”‚Β Β      β”‚   β”‚   β”œβ”€β”€ BaseScreen.kt
β”‚Β Β  β”‚   β”‚Β Β  β”‚Β Β      β”‚   β”‚   └── BaseViewModel.kt
β”‚Β Β  β”‚   β”‚Β Β  β”‚Β Β      β”‚   β”œβ”€β”€ common
β”‚Β Β  β”‚   β”‚Β Β  β”‚Β Β      β”‚   β”‚   └── AppButton.kt
β”‚Β Β  β”‚   β”‚Β Β  β”‚Β Β      β”‚   β”œβ”€β”€ models (UiModel, enum)
β”‚Β Β  β”‚   β”‚Β Β  β”‚Β Β      β”‚   β”œβ”€β”€ screens
β”‚Β Β  β”‚   β”‚Β Β  β”‚Β Β      β”‚   β”‚   β”œβ”€β”€ main
β”‚Β Β  β”‚   β”‚Β Β  β”‚Β Β      β”‚   β”‚   β”‚   β”œβ”€β”€ home
β”‚Β Β  β”‚   β”‚Β Β  β”‚Β Β      β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ HomeScreen.kt
β”‚Β Β  β”‚   β”‚Β Β  β”‚Β Β      β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ HomeScreenParameterProvider.kt
β”‚Β Β  β”‚   β”‚Β Β  β”‚Β Β      β”‚   β”‚   β”‚   β”‚   └── HomeViewModel.kt
β”‚Β Β  β”‚   β”‚Β Β  β”‚Β Β      β”‚   β”‚   β”‚   └── MainNavGraph.kt
β”‚Β Β  β”‚   β”‚Β Β  β”‚Β Β      β”‚   β”‚   └── MainActivity.kt
β”‚Β Β  β”‚   β”‚Β Β  β”‚Β Β      β”‚   β”œβ”€β”€ theme
β”‚Β Β  β”‚   β”‚Β Β  β”‚Β Β      β”‚   β”‚   β”œβ”€β”€ AppColors.kt
β”‚Β Β  β”‚   β”‚Β Β  β”‚Β Β      β”‚   β”‚   β”œβ”€β”€ AppDimens.kt
β”‚Β Β  β”‚   β”‚Β Β  β”‚Β Β      β”‚   β”‚   β”œβ”€β”€ AppShapes.kt
β”‚Β Β  β”‚   β”‚Β Β  β”‚Β Β      β”‚   β”‚   β”œβ”€β”€ AppStyles.kt
β”‚Β Β  β”‚   β”‚Β Β  β”‚Β Β      β”‚   β”‚   β”œβ”€β”€ AppTypography.kt
β”‚Β Β  β”‚   β”‚Β Β  β”‚Β Β      β”‚   β”‚   └── AppTheme.kt
β”‚Β Β  β”‚   β”‚Β Β  β”‚Β Β      β”‚   β”œβ”€β”€ AppDestination.kt
β”‚Β Β  β”‚   β”‚Β Β  β”‚Β Β      β”‚   └── AppNavGraph.kt
β”‚Β Β  β”‚   β”‚Β Β  β”‚Β Β      β”œβ”€β”€ util
β”‚Β Β  β”‚   β”‚Β Β  β”‚Β Β      └── MainApplication.kt
β”‚Β Β  β”‚   β”‚Β Β  β”œβ”€β”€ res
β”‚Β Β  β”‚   β”‚Β Β  β”‚   β”œβ”€β”€ drawable
β”‚Β Β  β”‚   β”‚Β Β  β”‚   β”œβ”€β”€ font
β”‚Β Β  β”‚   β”‚Β Β  β”‚   β”œβ”€β”€ mipmap
β”‚Β Β  β”‚   β”‚Β Β  β”‚   β”œβ”€β”€ values
β”‚Β Β  β”‚   β”‚Β Β  β”‚   └── xml
β”‚Β Β  β”‚   β”‚Β Β  └── AndroidManifest.xml
β”‚Β Β  β”‚   β”œβ”€β”€ staging
β”‚Β Β  β”‚   β”‚   └── res
β”‚Β Β  β”‚   β”‚       └── values
β”‚Β Β  β”‚   └── test (unit tests)
β”‚Β Β  β”‚       β”œβ”€β”€ java
β”‚Β Β  β”‚       β”‚   └── {package_name}
β”‚Β Β  β”‚   Β Β   β”‚ Β      β”œβ”€β”€ test (helpers)
β”‚Β Β  β”‚   Β Β   β”‚Β Β      └── ui
β”‚Β Β  β”‚    Β Β  β”‚Β Β          └── screens
β”‚Β Β  β”‚    Β Β  β”‚Β Β              β”œβ”€β”€ main
β”‚Β Β  β”‚    Β Β  β”‚Β Β              β”‚   └── home
β”‚Β Β  β”‚    Β Β  β”‚Β Β              β”‚       β”œβ”€β”€ HomeScreenTest.kt
β”‚Β Β  β”‚    Β Β  β”‚Β Β              β”‚       └── HomeViewModelTest.kt
β”‚Β Β  β”‚       β”‚               └── BaseScreenTest.kt
β”‚Β Β  β”‚       └── resources
β”‚Β Β  β”œβ”€β”€ build.gradle
β”‚Β Β  └── proguard-rules.pro
β”œβ”€β”€ buildSrc (Kotlin DSL)
β”œβ”€β”€ data
β”‚Β Β  β”œβ”€β”€ src
β”‚Β Β  β”‚   β”œβ”€β”€ main
β”‚Β Β  β”‚   β”‚Β Β  └── java
β”‚Β Β  β”‚   β”‚Β Β   Β Β  └── {package_name}.data
β”‚Β Β  β”‚Β Β  β”‚    Β Β      β”œβ”€β”€ extensions
β”‚Β Β  β”‚   β”‚Β  Β Β  Β      β”œβ”€β”€ local
β”‚Β Β  β”‚   β”‚Β Β          β”‚   └── storages
β”‚Β Β  β”‚   β”‚Β Β   Β Β      β”œβ”€β”€ remote
β”‚Β Β  β”‚   β”‚Β Β   Β Β      β”‚   β”œβ”€β”€ authenticators
β”‚Β Β  β”‚   β”‚Β Β   Β Β      β”‚   β”œβ”€β”€ interceptors
β”‚Β Β  β”‚   β”‚Β     Β   Β Β  β”‚   β”œβ”€β”€ models
β”‚Β Β  β”‚   β”‚Β Β   Β Β      β”‚   β”‚   β”œβ”€β”€ requests
β”‚Β Β  β”‚   β”‚Β Β          β”‚Β Β  β”‚   └── responses
β”‚Β Β  β”‚   β”‚Β Β       Β Β  β”‚   β”œβ”€β”€ providers
β”‚Β Β  β”‚   β”‚    Β Β   Β Β  β”‚   └── services
β”‚Β Β  β”‚   β”‚Β Β   Β Β      └── repositories (impl)
β”‚   β”‚   └── test
β”‚Β Β  β”‚    Β Β  └── java
β”‚Β Β  β”‚    Β Β   Β Β  └── {package_name}.data
β”‚Β Β  β”‚Β Β       Β Β      β”œβ”€β”€ extensions
β”‚Β Β  β”‚    Β Β   Β Β      β”œβ”€β”€ repositories (impl)
β”‚Β Β  β”‚    Β Β   Β Β      └── test (helpers)
β”‚   └── build.gradle.kts
β”œβ”€β”€ domain
β”‚Β Β  β”œβ”€β”€ src
β”‚Β Β  β”‚   β”œβ”€β”€ main
β”‚Β Β  β”‚   β”‚Β Β  └── java
β”‚Β Β  β”‚   β”‚Β Β   Β Β  └── {package_name}.domain
β”‚Β Β  β”‚Β Β  β”‚    Β Β      β”œβ”€β”€ exceptions
β”‚Β Β  β”‚   β”‚Β Β   Β Β      β”œβ”€β”€ models
β”‚Β Β  β”‚   β”‚Β Β   Β Β      β”œβ”€β”€ repositories
β”‚Β Β  β”‚   β”‚Β Β   Β Β      └── usecases
β”‚   β”‚   └── test
β”‚Β Β  β”‚    Β Β  └── java
β”‚Β Β  β”‚    Β Β   Β Β  └── {package_name}.domain
β”‚Β Β  β”‚    Β Β   Β Β      β”œβ”€β”€ test (helpers)
β”‚Β Β  β”‚    Β Β   Β Β      └── usecases
β”‚   └── build.gradle.kts
β”œβ”€β”€ detekt-config.yml
β”œβ”€β”€ build.gradle
β”œβ”€β”€ settings.gradle
└── README.md

Regarding structuring App flavors, read the section Gradle configuration.

Development Environment

Android SDK, IDE

Emulator

  • Use x86 emulator for significant speed up during development.

Mac computers with Apple silicon or certain CI services such as Circle CI or Travis CI lack support for x86 emulators.