| # FAQ |
| |
| [TOC] |
| |
| ## General FAQ |
| |
| ### What is `androidx`? |
| |
| Artifacts within the `androidx` package comprise the libraries of |
| [Android Jetpack](https://developer.android.com/jetpack). |
| |
| Libraries in the `androidx` package provide functionality that extends the |
| capabilities of the Android platform. These libraries, which ship separately |
| from the Android OS, focus on improving the experience of developing apps |
| through broad OS- and device-level compatibility, high-level abstractions to |
| simplify and unify platform features, and other new features that target |
| developer pain points. |
| |
| ### How are `androidx` and AndroidX related to Jetpack? |
| |
| They are effectively the same thing! |
| |
| **Jetpack** is the external branding for the set of components, tools, and |
| guidance that improve the developer experience on Android. |
| |
| Libraries within Jetpack use the **`androidx`** Java package and Maven group ID. |
| Developers expect these libraries to follow a consistent set of API design |
| guidelines, conform to SemVer and alpha/beta revision cycles, and use the public |
| Android issue tracker for bugs and feature requests. |
| |
| **AndroidX** is the open-source project where the majority\* of Jetpack |
| libraries are developed. The project's tooling and infrastructure enforce the |
| policies associated with Jetback branding and `androidx` packaging, allowing |
| library developers to focus on writing and releasing high-quality code. |
| |
| <sup>* Except a small number of libraries that were historically developed using |
| a different workflow, such as ExoPlayer/Media or AndroidX Test, and have built |
| up equivalent policies and processes.</sup> |
| |
| ### Why did we move to `androidx`? |
| |
| Please read our |
| [blog post](https://android-developers.googleblog.com/2018/05/hello-world-androidx.html) |
| about our migration. |
| |
| ### What happened to the Support Library? |
| |
| As part of the Jetpack effort to improve developer experience on Android, the |
| Support Library team undertook a massive refactoring project. Over the course of |
| 2017 and 2018, we streamlined and enforced consistency in our packaging, |
| developed new policies around versioning and releasing, and developed tools to |
| make it easy for developers to migrate. |
| |
| ### Will there be any more updates to Support Library? |
| |
| No, revision `28.0.0` of the Support Library, which launched as stable in |
| September 2018, was the last feature release in the `android.support` package. |
| There will be no further releases under Support Library packaging and they |
| should be considered deprecated. |
| |
| ### What library versions have been officially released? |
| |
| You can see all publicly released versions on the interactive |
| [Google Maven page](https://maven.google.com). |
| |
| ### How do I test my change in a separate Android Studio project? {#faq-test-change-studio} |
| |
| If you're working on a new feature or bug fix in AndroidX, you may want to test |
| your changes against another project to verify that the change makes sense in a |
| real-world context or that a bug's specific repro case has been fixed. |
| |
| If you need to be absolutely sure that your test will exactly emulate the |
| developer's experience, you can repeatedly build the AndroidX archive and |
| rebuild your application. In this case, you will need to create a local build of |
| AndroidX's local Maven repository artifact and install it in your Android SDK |
| path. |
| |
| First, use the `createArchive` Gradle task to generate the local Maven |
| repository artifact: |
| |
| ```shell |
| # Creates <path-to-checkout>/out/repository/ |
| ./gradlew createArchive |
| ``` |
| |
| Using your alternate (non-AndroidX) version of Android Studio open the project's |
| `settings.gradle.kts` and add the following within |
| `dependencyResolutionManagement` to make your project look for binaries in the |
| newly built repository: |
| |
| ```kotlin |
| dependencyResolutionManagement { |
| repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) |
| repositories { |
| google() |
| mavenCentral() |
| // Add this |
| maven { |
| setUrl("<absolute-path-to-checkout>/out/repository/") |
| } |
| } |
| } |
| ``` |
| |
| NOTE Gradle resolves dependencies in the order that the repositories are defined |
| (if 2 repositories can resolve the same dependency, the first listed will do so |
| and the second will not). Therefore, if the library you are testing has the same |
| group, artifact, and version as one already published, you will want to list |
| your custom maven repo first. |
| |
| Finally, in the dependencies section of your standalone project's `build.gradle` |
| file, add or update the `implementation` entries to reflect the AndroidX modules |
| that you would like to test. Example: |
| |
| ``` |
| dependencies { |
| ... |
| implementation "androidx.appcompat:appcompat:1.0.0-alpha02" |
| } |
| ``` |
| |
| If you are testing your changes in the Android Platform code, you can replace |
| the module you are testing |
| `YOUR_ANDROID_PATH/prebuilts/sdk/current/androidx/m2repository` with your own |
| module. We recommend only replacing the module you are modifying instead of the |
| full m2repository to avoid version issues of other modules. You can either take |
| the unzipped directory from |
| `<path-to-checkout>/out/dist/top-of-tree-m2repository-##.zip`, or from |
| `<path-to-checkout>/out/repository/` after building `androidx`. Here is an |
| example of replacing the RecyclerView module: |
| |
| ```shell |
| $TARGET=YOUR_ANDROID_PATH/prebuilts/sdk/current/androidx/m2repository/androidx/recyclerview/recyclerview/1.1.0-alpha07; |
| rm -rf $TARGET; |
| cp -a <path-to-sdk>/extras/m2repository/androidx/recyclerview/recyclerview/1.1.0-alpha07 $TARGET |
| ``` |
| |
| Make sure the library versions are the same before and after replacement. Then |
| you can build the Android platform code with the new `androidx` code. |
| |
| ### How do I add content to a library's Overview reference doc page? |
| |
| Put content in a markdown file that ends with `-documentation.md` in the |
| directory that corresponds to the Overview page that you'd like to document. |
| |
| For example, the `androidx.compose.runtime` |
| [Overview page](https://developer.android.com/reference/kotlin/androidx/compose/runtime/package-summary) |
| includes content from |
| [compose-runtime-documentation.md](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/compose-runtime-documentation.md). |
| |
| ### How do I enable MultiDex for my library? |
| |
| It is enabled automatically as androidx minSdkVersion is API >=21. |
| |
| ### Common build errors |
| |
| #### Diagnosing build failures |
| |
| If you've encountered a build failure and you're not sure what is triggering it, |
| then please run |
| `./development/diagnose-build-failure/diagnose-build-failure.sh`. |
| |
| This script can categorize your build failure into one of the following |
| categories: |
| |
| * The Gradle Daemon is saving state in memory and triggering a failure |
| * Your source files have been changed and/or incompatible git commits have |
| been checked out |
| * Some file in the out/ dir is triggering an error |
| * If this happens, diagnose-build-failure.sh should also identify which |
| file(s) specifically |
| * The build is nondeterministic and/or affected by timestamps |
| * The build via gradlew actually passes and this build failure is specific to |
| Android Studio |
| |
| Some more-specific build failures are listed below in this page. |
| |
| #### Out-of-date platform prebuilts |
| |
| Like a normal Android library developed in Android Studio, libraries within |
| `androidx` are built against prebuilts of the platform SDK. These are checked in |
| to the `prebuilts/fullsdk-darwin/platforms/<android-version>` directory. |
| |
| If you are developing against pre-release platform APIs in the internal |
| `androidx-platform-dev` branch, you may need to update these prebuilts to obtain |
| the latest API changes. |
| |
| #### Missing external dependency |
| |
| If Gradle cannot resolve a dependency listed in your `build.gradle`: |
| |
| * You will probably want to import the missing artifact via |
| [importMaven.sh](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:development/importMaven/README.md) |
| |
| * We store artifacts in the prebuilts repositories under |
| `prebuilts/androidx` to facilitate reproducible builds even if remote |
| artifacts are changed. |
| |
| * You may need to [establish trust for](#dependency-verification) the new |
| artifact |
| |
| ##### Importing dependencies in `libs.versions.toml` |
| |
| Libraries typically reference dependencies using constants defined in |
| [`libs.versions.toml`](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:gradle/libs.versions.toml). |
| Update this file to include a constant for the version of the library that you |
| want to depend on. You will reference this constant in your library's |
| `build.gradle` dependencies. |
| |
| **After** you update the `libs.versions.toml` file with new dependencies, you |
| can download them by running: |
| |
| ```shell |
| cd frameworks/support &&\ |
| development/importMaven/importMaven.sh import-toml |
| ``` |
| |
| This command will resolve everything declared in the `libs.versions.toml` file |
| and download missing artifacts into `prebuilts/androidx/external` or |
| `prebuilts/androidx/internal`. |
| |
| Make sure to upload these changes before or concurrently (ex. in the same Gerrit |
| topic) with the dependent library code. |
| |
| ##### Downloading a dependency without changing `libs.versions.toml` |
| |
| You can also download a dependency without changing `libs.versions.toml` file by |
| directly invoking: |
| |
| ```shell |
| cd frameworks/support &&\ |
| ./development/importMaven/importMaven.sh someGroupId:someArtifactId:someVersion |
| ``` |
| |
| ##### Missing konan dependencies |
| |
| Kotlin Multiplatform projects need prebuilts to compile native code, which are |
| located under `prebuilts/androidx/konan`. **After** you update the kotlin |
| version of AndroidX, you should also download necessary prebuilts via: |
| |
| ```shell |
| cd frameworks/support &&\ |
| development/importMaven/importMaven.sh import-konan-binaries --konan-compiler-version <new-kotlin-version> |
| ``` |
| |
| Please remember to commit changes in the `prebuilts/androidx/konan` repository. |
| |
| #### Dependency verification |
| |
| If you import a new dependency that is either unsigned or is signed with a new, |
| unrecognized key, then you will need to add new dependency verification metadata |
| to indicate to Gradle that this new dependency is trusted. See the instructions |
| [here](https://android.googlesource.com/platform/frameworks/support/+/androidx-main/gradle/README.md) |
| |
| #### Updating an existing dependency |
| |
| If an older version of a dependency prebuilt was already checked in, please |
| manually remove it within the same CL that adds the new prebuilt. You will also |
| need to update `Dependencies.kt` to reflect the version change. |
| |
| #### My gradle build fails with "error: cannot find symbol" after making framework-dependent changes. |
| |
| You probably need to update the prebuilt SDK used by the gradle build. If you |
| are referencing new framework APIs, you will need to wait for the framework |
| changes to land in an SDK build (or build it yourself) and then land in both |
| prebuilts/fullsdk and prebuilts/sdk. See |
| [Updating SDK prebuilts](/docs/playbook.md#prebuilts-fullsdk) |
| for more information. |
| |
| #### How do I handle refactoring a framework API referenced from a library? |
| |
| Because AndroidX must compile against both the current framework and the latest |
| SDK prebuilt, and because compiling the SDK prebuilt depends on AndroidX, you |
| will need to refactor in stages: |
| |
| 1. Remove references to the target APIs from AndroidX |
| 2. Perform the refactoring in the framework |
| 3. Update the framework prebuilt SDK to incorporate changes in (2) |
| 4. Add references to the refactored APIs in AndroidX |
| 5. Update AndroidX prebuilts to incorporate changes in (4) |