blob: b0d4f40165ed5c6ded47e1c598f3eb02fd7d1002 [file] [log] [blame]
Name: R8
URL: https://r8.googlesource.com/r8
Version: unknown
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.
* Added "dump_inputs.py" script.
* desugar_jdk_libs.json:
* Removed references to ConcurrentHashMap to avoid bloat
* Removed references to TimeZone#getTimeZone to avoid desugaring of
an overload that does not require desugaring
* Removed references to synchronizedMap and synchronizedSortedMap because the
desugared version accesses the "dark greylisted"
SynchronizedCollection.mutex field, which caused modal dialogs to appear on
Android P instrumentation tests. https://crbug.com/1256614
* Removed references to ThreadLocalRandom to avoid streams APIs being pulled
in unnecessarily. https://crbug.com/1280841
* Removed references to java.time and associated classes.
https://crbug.com/1301349
* 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 r8:
* R8 is built daily and uploaded to CIPD.
* To lookup the latest version being used currently:
* Look up the cipd instance id from //DEPS, or run
`gclient getdep -r src/third_party/r8:chromium/third_party/r8`.
* Find the version tag at this url
https://chrome-infra-packages.appspot.com/p/chromium/third_party/r8/+/<instance id>
* Or, run `cipd describe chromium/third_party/r8 -version <instance id>` and look at the version tag.
* The commit hash that R8 was built at appears after the "@" symbol in the version tag and
before the "-". Eg. version:2@33ae86d80351efc4d632452331d06cb97e42f2a7-72dd46fd5c gives the
commit hash of 33ae86d80351efc4d632452331d06cb97e42f2a7.
* New instances are uploaded by the packager bot:
https://ci.chromium.org/p/chromium/builders/ci/3pp-linux-amd64-packager
* The bot autoruns every 6 hours. Ping a trooper or a clank build core dev to
trigger it if you need it sooner:
https://luci-scheduler.appspot.com/jobs/chromium/3pp-linux-amd64-packager
* The autoroller runs automatically when a new cipd instance is uploaded.
* Since r8 rolls affect downstream, the roller is only accessible to Googlers.
* See its status here: https://skia-autoroll.corp.goog/r/r8-chromium
* Rolls are not automatically merged in - they require a manual +2.
* 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/3pp/patches/*.patch
* Fix patch conflicts.
* Save new patches. Change number if expecting more or fewer patches:
rm $CHROMIUM_SRC/third_party/r8/3pp/patches/*
git format-patch origin/main..HEAD -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 and applying patches):
* 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
* TimeZone#getTimeZone
* Collections#synchronizedMap
* Collections#synchronizedSortedMap
* ThreadLocalRandom
* Don't forget to remove trailing commas where applicable.
* 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
* As a shortcut: third_party/r8/dump_inputs.py out/Release/apks/ChromePublic.apk.mapping
* 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