# Jetpack Principles

[TOC]

## Ethos of Jetpack

To create components, tools, and guidance that makes it quick and easy to build
great Android apps, including contributions from Google and the open-source
community.

## Core Principles of a Jetpack Library

Jetpack libraries provide the following guarantees to Android Developers:

_formatted as “Jetpack libraries are…” with sub-points “Libraries should…”_

### 1. Optimized for external client adoption

-   Libraries should work for first-party clients and may even have optional
    modules tailored specifically to first-party needs, but primary
    functionality should target external developers.
-   Measure success by 3p client adoption, followed by 1p client adoption.

### 2. Designed to satisfy real-world use cases

-   Meet developers where they are and solve the problems that they have
    building apps -- not designed to just provide parity with existing platform
    APIs and features
-   Expose modules that are tightly-scoped to **developer pain points**
    -   Smaller building blocks for external developers by scoping disjoint use
        cases that are likely not to co-exist in a single app to individual
        modules.
-   Implement layered complexity, with **simple top-level APIs**
    -   Complicated use case support must not be at the expense of increasing
        API complexity for the most common simpler use cases.
-   Have **backing data or a researched hypothesis** (research, demand etc) to
    prove the library is necessary and sufficient.
-   Include only functionality that is relevant to the library's stated use case
    -   End user and developer trust depend on libraries being transparent about
        their operation. See
        [Functionality](/docs/api_guidelines#functionality) in
        the API Guidelines for details.

### 3. Aware of the existing developer ecosystem

-   Avoid reinventing the wheel -- do not create a new library where one already
    exists that is accepted by the community as a best practice

### 4. Consistent with the rest of Jetpack

-   Ensure that concepts learned in one component can be seen and understood in
    other components
-   Leverage Jetpack and community standards, for example:
    -   For async work, uses Kotlin coroutines and/or Kotlin flow
    -   For data persistence, uses Jetpack DataStore for simple and small data
        and uses Room for more complicated Data

### 5. Developed as open-source and compatible with AOSP Android

-   Expose a unified developer-facing API surface across the Android ecosystem
-   Develop in AOSP to provide visibility into new features and bug fixes and
    encourage external participation
-   Avoid proprietary services or closed-source libraries for core
    functionality, and instead provide integration points that allow a developer
    to choose between a variety of services as the backing implementation
-   Comply with AndroidX checks and policies such as API tracking and style
    checks
-   See
    [Integrating proprietary components](/docs/open_source.md)
    for guidance on using closed-source and proprietary libraries and services

### 6. Written using language-idiomatic APIs

-   Write APIs that feel natural for clients using both
    [Kotlin](https://developer.android.com/kotlin/interop) and Java

### 7. Compatible with a broad range of API levels

-   Support older platforms and API levels according to client needs
-   Provide continued maintenance to ensure compatibility with newer platforms
-   Design with the expectation that every Jetpack API is **write-once,
    run-everywhere** for Android with graceful degradation where necessary

### 8. Integrated with best practices

-   Guide developers toward using existing Jetpack best-practice libraries,
    including Architecture Components
-   Libraries that involve user interfaces, e.g. any reference to `View`
    classes, must provide non-`View` functional parity when used with the
    Compose UI toolkit

### 9. Designed for tooling and testability

-   Write adequate unit and integration tests for the library itself
-   Provide developers with an accompanying testing story for integration
    testing their own applications (ex. -testing artifacts that some libraries
    expose)
    -   Robolectric shouldn’t need to shadow the library classes
    -   Ex. Room has in-memory testing support
-   Build tooling concurrent with the library when possible, and with tooling in
    mind otherwise

### 10. Released using a clearly-defined process

-   Follow Semantic Versioning and pre-release revision guidelines where each
    library moves through alpha, beta, and rc revisions to gain feedback and
    ensure stability

### 11. Well-documented

-   Provide developers with getting started and use case documentation on
    d.android.com in addition to clear API reference documentation

### 12. Supported for long-term use

-   Plan for long-term support and maintenance

### 13. Examples of modern development

-   Where possible, targeting the latest languages, OS features, and tools. All
    new libraries should be written in Kotlin, compile using the latest stable
    Android SDK, and assume that clients are using the latest stable versions of
    Android Studio, Gradle, and AGP. See the
    [AndroidX API Guidelines](/docs/api_guidelines/index.md#dependencies-kotlin)
    for more details, including the use of Java sources and `-ktx` artifacts.

### 14. High quality APIs and ownership

-   All Jetpack libraries are expected to abide by Android and Jetpack API
    Guidelines

## Target Audience

Jetpack libraries are used by a wide variety of external developers, from
individuals working on their first Android app to huge corporations developing
large-scale production apps. Generally, however, Jetpack libraries are designed
to focus on small- to medium-sized app development teams.

-   Note: If the library targets a niche set of apps, the developer pain
    point(s) addressed by the Jetpack library must be significant enough to
    justify its need.
    -   Example : Jetpack Enterprise library
