angle/third_party/r8
Jamie Madill 2f808349bd Add standalone Android build.
Includes necessary DEPS and GN build changes.
Some folders are copied directly from Chromium because they don't
exist as source mirrors or aren't available for other reasons.

Bug: angleproject:2344
Change-Id: Ibb7f8a3e2288048b7aed2b0e277ca63b5a932c57
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2826480
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Yuly Novikov <ynovikov@chromium.org>
2021-04-20 15:24:42 +00:00
..
playground
BUILD.gn
DIR_METADATA
LICENSE
OWNERS
README.chromium
backported_methods.txt
cipd.yaml
custom_d8.jar
desugar_jdk_libs.json

README.chromium

Name: R8
URL: https://r8.googlesource.com/r8
Version: 3.0.33
License: BSD 3-Clause
License File: NOT_SHIPPED
Security Critical: no

Description:
lib/r8.jar
 - Contains R8 (proguard replacement) as well as D8 (dexer).
3pp
 - Contains code for 3pp-linux-amd64-packager to package and upload new versions of r8.
desugar_jdk_libs.json
 - Configuration for Java library desugaring.
 - Taken from
   //third_party/android_deps/libs/com_android_tools_desugar_jdk_libs_configuration/
   inside the jar file, in META-INF/desugar/d8/desugar.json. License is also BSD
   3-Clause (the r8 version).

R8 is a proguard-like optimizer that also has the ability to dex.

Local Modifications:
* Refer to commit descriptions within "3pp/patches" directory.
* Added "playground" directory for quick "how does this optimize" tests.
* Removed references to ConcurrentHashMap and TimeZone#getTimeZone in desugar_jdk_libs.json.
* Added "java/src/org/chromium/build/CustomD8.java", custom_d8.jar, and BUILD.gn.
  * Used in "build/android/gyp/dex.py" to enable desugar dependencies.

Update Instructions:
* For the custom d8 jar:
  * This is required only when CustomD8.java changes.
  * Uncomment the flag --skip-custom-d8 in internal_rules.gni to avoid depending
    on the previously built custom_d8.jar.
autoninja -C out/Debug third_party/r8:custom_d8_java
cp out/Debug/obj/third_party/r8/custom_d8_java.javac.jar third_party/r8/custom_d8.jar

* For a new version of r8:
  * Find the latest successful run of the build bot:
    * https://ci.chromium.org/p/chromium/builders/ci/3pp-linux-amd64-packager
    * The bot autoruns every 6 hours. Ping a trooper to trigger it if you need it sooner.
      * https://luci-scheduler.appspot.com/jobs/chromium/3pp-linux-amd64-packager
  * Go to its log page and look under:
    * Expand "building chromium/third_party/r8" to see the CIPD instance ID.
  * Copy this instance ID to the r8 entry in //DEPS.
  * Update this file with the new version string and submit.

* If patching fails:
git clone https://r8.googlesource.com/r8
cd r8
  * Find latest tag:
git fetch origin --tags
git tag -l  # Often unnecessary as output from the fetch includes recent tags.
git checkout $TAG  # e.g. 3.0.25-dev, whichever tag failed patching.
  * Apply patches:
git checkout -b my_branch
git am $CHROMIUM_SRC/third_party/r8/patches/*.patch
  * Fix patch conflicts.
  * Save new patches. Change number if expecting more or fewer patches:
git format-patch -3 -o $CHROMIUM_SRC/third_party/r8/3pp/patches
  * Submit these fixed patches and the bot will automatically retry.

* Local development (see above for setting up the r8 repo):
  * Build
tools/gradle.py r8
  * Shrink (improves r8/d8 launch time):
java -jar build/libs/r8.jar --debug --classfile --output r8.jar \
    --lib $CHROMIUM_SRC/third_party/jdk/current --pg-conf src/main/keep.txt \
    --no-minification --no-desugaring build/libs/r8.jar
mv $CHROMIUM_SRC/third_party/r8/lib/r8.jar{,.bak}
cp r8.jar $CHROMIUM_SRC/third_party/r8/lib/r8.jar

* Update backported methods list:
cd $CHROMIUM_SRC
java -cp third_party/r8/lib/r8.jar com.android.tools.r8.BackportedMethodList --min-api 16 > third_party/r8/backported_methods.txt

* Update instructions for desugar_jdk_libs.json:
unzip -p third_party/android_deps/libs/com_android_tools_desugar_jdk_libs_configuration/*.jar META-INF/desugar/d8/desugar.json > third_party/r8/desugar_jdk_libs.json
  * Remove all mentions of ConcurrentHashMap and TimeZone#getTimeZone and remove trailing commas.
  * Update //build/config/android/internal_rules.gni to point at the new .jar files:
    * desugar_jdk_libs-1.1.1.jar
    * desugar_jdk_libs_configuration-1.1.1.jar

How to file bugs against R8:
* Copy & paste the failing ninja command (starts with proguard.py), and add --dump-inputs.
  * This also works for dex.py, it produces d8inputs.zip
* File bug at go/r8bug
* Things to include (use discretion if some are not relevant):
  * src revision bug reproduces at
  * Repro steps (gn gen & autoninja commands)
    * Prefer enable_chrome_android_internal=false
  * The r8inputs.zip from --dump-inputs
  * Any relevant dexdump analysis

How to submit CLs to R8:
* Request to be added to their allowlist in order to upload CLs.
* After CLs are submitted, check the bots for build breakage.
  * https://ci.chromium.org/p/r8/g/main_all/console