Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enable r8 support in bazel #14741

Closed

Conversation

mauriciogg
Copy link
Contributor

This cl introduces R8 support in Bazel for proguarding and dexing.
R8 is enabled by passing --experimental_enable_r8=true to the
blaze build invocation and --proguard_top="//bzl/r8:proguard_compat"

When enabled the build graph was changed from

  • jar -> proguard -> dex -> apk
    To
  • jar -> r8 -> apk

I.e R8 takes care of proguarding and dexing.

There are a few known limitations:

  • Only native multidex (Android version L+) is supported.
    All android_binary targets declare native_multidex so it does not
    make sense to implement legacy multidex with R8
  • Mobile-Install is not supported: mobile-install relies on how dexes
    are shard. R8 dexes the deploy jar in a single monolithic action
    which is cant be done incrementally (I don't think mobile-install is
    supported anymore)
  • Other features which are not implemented in bazel at the moment:
    e.g. dynamic delivery
  • proguard_compat needs to be available (not in this commit)

see bazelbuild/rules_android#31

This cl introduces R8 support in Bazel for proguarding and dexing.
R8 is enabled by passing --experimental_enable_r8=true to the
blaze build invocation and --proguard_top="//bzl/r8:proguard_compat"

When enabled the build graph was changed from
 - jar -> proguard -> dex -> apk
To
 - jar -> r8 -> apk

 I.e R8 takes care of proguarding and dexing.

There are a few known limitations:

 - Only native multidex (Android version L+) is supported.
   All android_binary targets declare native_multidex so it does not
   make sense to implement legacy multidex with R8
 - Mobile-Install is not supported: mobile-install relies on how dexes
   are shard. R8 dexes the deploy jar in a single monolithic action
   which is cant be done incrementally (I don't think mobile-install is
   supported anymore)
 - Other features which are not implemented in bazel at the moment:
   e.g. dynamic delivery
 - proguard_compat needs to be available (not in this commit)

---
Automatic squash commit from https://github.sc-corp.net/Snapchat/bazel/pull/145
Cooled by mgalindo
@sgowroji sgowroji added the team-Android Issues for Android team label Mar 23, 2022
@sgowroji sgowroji added the awaiting-review PR is awaiting review from an assigned reviewer label Apr 21, 2022
@nkoroste
Copy link
Contributor

@ahumesky @ted-xie

@gabrielborglund
Copy link

@mauriciogg Why is it better to pass R8 via the proguard_top flag rather than changing how AndroidBinary works? That is why not implement something like applyR8 instead of applyProguard?

@mauriciogg
Copy link
Contributor Author

@mauriciogg Why is it better to pass R8 via the proguard_top flag rather than changing how AndroidBinary works? That is why not implement something like applyR8 instead of applyProguard?

Technically this code is being deprecated so I wouldnt want to add modifications to android binary, besides this just works out of the box with the rest of the toolchain. The only extra piece needed is a shim binary that translates between proguard args and r8 args. This is very unlikely to get merge though.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
awaiting-review PR is awaiting review from an assigned reviewer team-Android Issues for Android team
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants