Many rules in the Bazel ecosystem have migrated to using the platforms and toolchains systems. We're excited to announce that, as of Bazel 7.0, the built-in Android rules are joining this group.
TL;DR: What do I change?
The short version is that instead of using --fat_apk_cpu, you'll use --android_platforms to indicate what specific device you want your Android APKs to build for.
Just like the --platforms flag, the values passed to --android_platforms are
the labels of platform targets, using standard constraint values to describe your device.
For example, for an Android device with a 64-bit ARM processor, you'd define your platform like this:
platform(
name = "android_arm64",
constraint_values = [
"@platforms//os:android",
"@platforms//cpu:arm64",
],
)
Every Android platform should use the @platforms//os:android OS constraint. To migrate the CPU constraint, check this chart:
| CPU Value | Platform |
|---|---|
armeabi-v7a |
@platforms//cpu:armv7* |
arm64-v8a |
@platforms//cpu:arm64 |
x86 |
@platforms//cpu:x86_32 |
x86_64 |
@platforms//cpu:x86_64 |
And, of course, for a multi-architecture APK, you pass multiple labels, for
example: --android_platforms=//:arm64,//:x86_64 (assuming you defined those in
your top-level BUILD.bazel file).
* Update: Originally @platforms//cpu:armv7 was listed as @platforms//cpu:arm.
Prefer @platforms//cpu:armv7 because it more accurately represents the target
architecture.
Are any other flags changing?
Yes, as part of this several legacy flags have been deprecated and are no-ops.
Deprecated flags (and their new equivalents):
--android_cpu: Like--fat_apk_cpu, this is replaced by--android_platforms--android_sdk: Android SDKs are now registered toolchains, so if you have multipleandroid_sdk_repositoryrepository rules defined, you can useregister_toolchainsand--extra_toolchainsto change the order they are used in.--android_crosstool_top: Similarly to the Android SDK, theandroid_ndk_repositoryrule exposes the NDK as a C++ toolchain, using the standard toolchain resolution. You can useregister_toolchainsand--extra_toolchainsto change the selection order for these.
Can I test this out?
Yes, download the latest Bazel 7.0 release
candidate (or use
Bazelisk with
USE_BAZEL_VERSION=last_rc) and update your build flags. Please file an
issue if you encounter
any problems.
Do I have to migrate?
The legacy functionality is still present in the Bazel 7.0 LTS branch. You can
disable the changes by passing the flag --noincompatible_enable_android_toolchain_resolution.
If you find any issues with the new functionality, please file an issue so that we can address it.
However, note that the legacy functionality will be deleted in short order and will not be present in Bazel 8.0 when that is released.
Why are things changing?
As part of the overall platforms and
toolchains project, all of Bazel is
moving away from using --cpu flags to express target platforms, and towards
the richer variety allowed by the platform rule. The current usage of --cpu
is not actually as a single CPU architecture: we currently capture different
things like "Linux on 64-bit intel" (--cpu=k8), "macOS on 64-bit-intel"
(--cpu=darwin_x86_64), "Windows on ARM" (--cpu=arm64_windows): and that's
just a few common OSes.
When describing Android and iOS devices, or custom development boards and their
firmware, the single dimension of --cpu is insufficient, which is where the
platforms concepts shine.
At a more basic level, because other rules (like C++, Java, Go, and Rust) are moving to support platforms, Android needs to support it to, so that mixed-language builds work properly.
What's next for Android Rules?
The biggest change coming to the Android rules is to move them out of the Bazel
binary, and into the independent rules_android
repository. Starlarkification of
the Android Rules is expected
to be complete in Q2 2024, and users will be encouraged to migrate to the
Starlark Android Rules between then and Bazel 8.0
The current version of the Starlark Android rules also supports the same
--android_platforms flag, although since these rules aren't currently fully
ready for release, they are not recommended for use without thorough testing.