This document contains information on optimizing build performance for Android apps specifically. For general build performance optimization with Bazel, see Optimizing Performance.
The flags are in the bazelrc
configuration syntax, so they can be pasted directly into a bazelrc
file and invoked with --config=<configuration_name>
on the command line.
Profiling performance
This set of flags generates a JSON trace profile, profile.json.gz
, that can be viewed using the Chrome Tracing Profiler (chrome://tracing
). See the JSON Profile documentation for how to read and interact with the profile.
build:profile --experimental_generate_json_trace_profile build:profile --profile profile.json.gz build:profile --experimental_json_trace_compression
These flags can be used by specifying --config=profile
on the command line.
Persistent workers for Android build actions.
A subset of Android build actions has support for persistent workers.
These actions' mnemonics are:
Enabling workers can result in better build performance by saving on JVM startup costs from invoking each of these tools, but at the cost of increased memory usage on the system by persisting them.
To enable workers for these actions, apply these flags with --config=android_workers
on the command line:
build:android_workers --strategy=DexBuilder=worker build:android_workers --strategy=Javac=worker build:android_workers --strategy=Desugar=worker # A wrapper flag for these resource processing actions: # - AndroidResourceParser # - AndroidResourceValidator # - AndroidResourceCompiler # - RClassGenerator # - AndroidResourceLink # - AndroidAapt2 # - AndroidAssetMerger # - AndroidResourceMerger # - AndroidCompiledResourceMerger build:android_workers --persistent_android_resource_processor
The default number of persistent workers created per action is 4
. We have measured improved build performance by capping the number of instances for each action to 1
or 2
, although this may vary depending on the system Bazel is running on, and the project being built.
To cap the number of instances for an action, apply these flags:
build:android_workers --worker_max_instances=DexBuilder=2 build:android_workers --worker_max_instances=Javac=2 build:android_workers --worker_max_instances=Desugar=2 build:android_workers --worker_max_instances=AaptPackage=2 # .. and so on for each action you're interested in.
Using AAPT2
aapt2
has improved performance over aapt
and also creates smaller APKs. To use aapt2
, use the --android_aapt=aapt2
flag or set aapt2
on the aapt_version
on android_binary
and android_local_test
.
SSD optimizations
The --experimental_multi_threaded_digest
flag is useful for optimizing digest computation on SSDs.