blob: da925d25a416e7d74fc1977f2a947a29ce393fa4 [file] [log] [blame] [view] [edit]
# 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)