Commit 9a658449 authored by Andrew Grieve's avatar Andrew Grieve Committed by Commit Bot

Android: Allow use of methods backported by R8.

List of them can be found at third_party/r8/backported_methods.txt

Bug: 1056751
Change-Id: I75506b8a8328552429838bca43cc53dd3a82396e
Cq-Do-Not-Cancel-Tryjobs: true
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2444180Reviewed-by: default avatarPeter Wen <wnwen@chromium.org>
Commit-Queue: Peter Wen <wnwen@chromium.org>
Cr-Commit-Position: refs/heads/master@{#813333}
parent 56d97ea7
......@@ -110,6 +110,31 @@ def _GenerateProjectFile(android_manifest,
return project
def _RetrieveBackportedMethods(backported_methods_path):
with open(backported_methods_path) as f:
methods = f.read().splitlines()
# Methods look like:
# java/util/Set#of(Ljava/lang/Object;)Ljava/util/Set;
# But error message looks like:
# Call requires API level R (current min is 21): java.util.Set#of [NewApi]
methods = (m.replace('/', '\\.') for m in methods)
methods = (m[:m.index('(')] for m in methods)
return sorted(set(methods))
def _GenerateConfigXmlTree(orig_config_path, backported_methods):
if orig_config_path:
root_node = ElementTree.parse(orig_config_path).getroot()
else:
root_node = ElementTree.fromstring('<lint/>')
issue_node = ElementTree.SubElement(root_node, 'issue')
issue_node.attrib['id'] = 'NewApi'
ignore_node = ElementTree.SubElement(issue_node, 'ignore')
ignore_node.attrib['regexp'] = '|'.join(backported_methods)
return root_node
def _GenerateAndroidManifest(original_manifest_path, extra_manifest_paths,
min_sdk_version, android_sdk_version):
# Set minSdkVersion in the manifest to the correct value.
......@@ -141,6 +166,7 @@ def _GenerateAndroidManifest(original_manifest_path, extra_manifest_paths,
def _WriteXmlFile(root, path):
logging.info('Writing xml file %s', path)
build_utils.MakeDirectory(os.path.dirname(path))
with build_utils.AtomicOutput(path) as f:
# Although we can write it just with ElementTree.tostring, using minidom
......@@ -162,6 +188,7 @@ def _CheckLintWarning(expected_warnings, lint_output):
def _RunLint(lint_binary_path,
backported_methods_path,
config_path,
manifest_path,
extra_manifest_paths,
......@@ -189,8 +216,6 @@ def _RunLint(lint_binary_path,
]
if baseline:
cmd.extend(['--baseline', baseline])
if config_path:
cmd.extend(['--config', config_path])
if testonly_target:
cmd.extend(['--disable', ','.join(_DISABLED_FOR_TESTS)])
......@@ -198,6 +223,13 @@ def _RunLint(lint_binary_path,
manifest_path = os.path.join(build_utils.DIR_SOURCE_ROOT, 'build',
'android', 'AndroidManifest.xml')
logging.info('Generating config.xml')
backported_methods = _RetrieveBackportedMethods(backported_methods_path)
config_xml_node = _GenerateConfigXmlTree(config_path, backported_methods)
generated_config_path = os.path.join(lint_gen_dir, 'config.xml')
_WriteXmlFile(config_xml_node, generated_config_path)
cmd.extend(['--config', generated_config_path])
logging.info('Generating Android manifest file')
android_manifest_tree = _GenerateAndroidManifest(manifest_path,
extra_manifest_paths,
......@@ -206,7 +238,6 @@ def _RunLint(lint_binary_path,
# Include the rebased manifest_path in the lint generated path so that it is
# clear in error messages where the original AndroidManifest.xml came from.
lint_android_manifest_path = os.path.join(lint_gen_dir, manifest_path)
logging.info('Writing xml file %s', lint_android_manifest_path)
_WriteXmlFile(android_manifest_tree.getroot(), lint_android_manifest_path)
resource_root_dir = os.path.join(lint_gen_dir, _RES_ZIP_DIR)
......@@ -244,7 +275,6 @@ def _RunLint(lint_binary_path,
android_sdk_version)
project_xml_path = os.path.join(lint_gen_dir, 'project.xml')
logging.info('Writing xml file %s', project_xml_path)
_WriteXmlFile(project_file_root, project_xml_path)
cmd += ['--project', project_xml_path]
......@@ -308,6 +338,8 @@ def _ParseArgs(argv):
parser.add_argument('--lint-binary-path',
required=True,
help='Path to lint executable.')
parser.add_argument('--backported-methods',
help='Path to backported methods file created by R8.')
parser.add_argument('--cache-dir',
required=True,
help='Path to the directory in which the android cache '
......@@ -391,6 +423,7 @@ def main():
depfile_deps = [p for p in possible_depfile_deps if p]
_RunLint(args.lint_binary_path,
args.backported_methods,
args.config_path,
args.manifest_path,
args.extra_manifest_paths,
......
......@@ -1027,10 +1027,14 @@ if (enable_java_templates) {
# Save generated xml files in a consistent location for debugging.
_lint_gen_dir = "$target_gen_dir/$target_name"
_backported_methods = "//third_party/r8/backported_methods.txt"
script = "//build/android/gyp/lint.py"
depfile = "$target_gen_dir/$target_name.d"
inputs = [ _lint_binary_path ]
inputs = [
_lint_binary_path,
_backported_methods,
]
args = [
"--depfile",
......@@ -1045,6 +1049,8 @@ if (enable_java_templates) {
"--min-sdk-version=$_min_sdk_version",
"--android-sdk-root",
rebase_path(lint_android_sdk_root, root_build_dir),
"--backported-methods",
rebase_path(_backported_methods, root_build_dir),
]
if (defined(invoker.lint_suppressions_file)) {
......
......@@ -51,6 +51,9 @@ git format-patch -3 -o $CHROMIUM_SRC/third_party/r8/patches
cd $CHROMIUM_SRC/third_party/r8
cipd create --pkg-def cipd.yaml # Make note of the instance ID
# Update backported methods list:
java -cp third_party/r8/lib/r8.jar com.android.tools.r8.BackportedMethodList --min-api 16 > third_party/r8/backported_methods.txt
# Manually update:
* README.chromium (version number via "java -cp lib/r8.jar com.android.tools.r8.R8 --version")
* //DEPS (instance ID output by cipd create)
java/lang/Boolean#compare(ZZ)I
java/lang/Boolean#hashCode(Z)I
java/lang/Boolean#logicalAnd(ZZ)Z
java/lang/Boolean#logicalOr(ZZ)Z
java/lang/Boolean#logicalXor(ZZ)Z
java/lang/Byte#compare(BB)I
java/lang/Byte#compareUnsigned(BB)I
java/lang/Byte#hashCode(B)I
java/lang/Byte#toUnsignedInt(B)I
java/lang/Byte#toUnsignedLong(B)J
java/lang/CharSequence#compare(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)I
java/lang/Character#compare(CC)I
java/lang/Character#hashCode(C)I
java/lang/Character#toString(I)Ljava/lang/String;
java/lang/Double#hashCode(D)I
java/lang/Double#isFinite(D)Z
java/lang/Double#max(DD)D
java/lang/Double#min(DD)D
java/lang/Double#sum(DD)D
java/lang/Float#hashCode(F)I
java/lang/Float#isFinite(F)Z
java/lang/Float#max(FF)F
java/lang/Float#min(FF)F
java/lang/Float#sum(FF)F
java/lang/Integer#compare(II)I
java/lang/Integer#compareUnsigned(II)I
java/lang/Integer#divideUnsigned(II)I
java/lang/Integer#hashCode(I)I
java/lang/Integer#max(II)I
java/lang/Integer#min(II)I
java/lang/Integer#parseUnsignedInt(Ljava/lang/String;)I
java/lang/Integer#parseUnsignedInt(Ljava/lang/String;I)I
java/lang/Integer#remainderUnsigned(II)I
java/lang/Integer#sum(II)I
java/lang/Integer#toUnsignedLong(I)J
java/lang/Integer#toUnsignedString(I)Ljava/lang/String;
java/lang/Integer#toUnsignedString(II)Ljava/lang/String;
java/lang/Long#compare(JJ)I
java/lang/Long#compareUnsigned(JJ)I
java/lang/Long#divideUnsigned(JJ)J
java/lang/Long#hashCode(J)I
java/lang/Long#max(JJ)J
java/lang/Long#min(JJ)J
java/lang/Long#parseUnsignedLong(Ljava/lang/String;)J
java/lang/Long#parseUnsignedLong(Ljava/lang/String;I)J
java/lang/Long#remainderUnsigned(JJ)J
java/lang/Long#sum(JJ)J
java/lang/Long#toUnsignedString(J)Ljava/lang/String;
java/lang/Long#toUnsignedString(JI)Ljava/lang/String;
java/lang/Math#addExact(II)I
java/lang/Math#addExact(JJ)J
java/lang/Math#decrementExact(I)I
java/lang/Math#decrementExact(J)J
java/lang/Math#floorDiv(II)I
java/lang/Math#floorDiv(JI)J
java/lang/Math#floorDiv(JJ)J
java/lang/Math#floorMod(II)I
java/lang/Math#floorMod(JI)I
java/lang/Math#floorMod(JJ)J
java/lang/Math#incrementExact(I)I
java/lang/Math#incrementExact(J)J
java/lang/Math#multiplyExact(II)I
java/lang/Math#multiplyExact(JI)J
java/lang/Math#multiplyExact(JJ)J
java/lang/Math#multiplyFull(II)J
java/lang/Math#multiplyHigh(JJ)J
java/lang/Math#negateExact(I)I
java/lang/Math#negateExact(J)J
java/lang/Math#nextDown(D)D
java/lang/Math#nextDown(F)F
java/lang/Math#subtractExact(II)I
java/lang/Math#subtractExact(JJ)J
java/lang/Math#toIntExact(J)I
java/lang/Short#compare(SS)I
java/lang/Short#compareUnsigned(SS)I
java/lang/Short#hashCode(S)I
java/lang/Short#toUnsignedInt(S)I
java/lang/Short#toUnsignedLong(S)J
java/lang/StrictMath#addExact(II)I
java/lang/StrictMath#addExact(JJ)J
java/lang/StrictMath#floorDiv(II)I
java/lang/StrictMath#floorDiv(JI)J
java/lang/StrictMath#floorDiv(JJ)J
java/lang/StrictMath#floorMod(II)I
java/lang/StrictMath#floorMod(JI)I
java/lang/StrictMath#floorMod(JJ)J
java/lang/StrictMath#multiplyExact(II)I
java/lang/StrictMath#multiplyExact(JI)J
java/lang/StrictMath#multiplyExact(JJ)J
java/lang/StrictMath#multiplyFull(II)J
java/lang/StrictMath#multiplyHigh(JJ)J
java/lang/StrictMath#nextDown(D)D
java/lang/StrictMath#nextDown(F)F
java/lang/StrictMath#subtractExact(II)I
java/lang/StrictMath#subtractExact(JJ)J
java/lang/StrictMath#toIntExact(J)I
java/lang/String#isBlank()Z
java/lang/String#join(Ljava/lang/CharSequence;Ljava/lang/Iterable;)Ljava/lang/String;
java/lang/String#join(Ljava/lang/CharSequence;[Ljava/lang/CharSequence;)Ljava/lang/String;
java/lang/String#repeat(I)Ljava/lang/String;
java/lang/String#strip()Ljava/lang/String;
java/lang/String#stripLeading()Ljava/lang/String;
java/lang/String#stripTrailing()Ljava/lang/String;
java/util/Collections#emptyEnumeration()Ljava/util/Enumeration;
java/util/Collections#emptyIterator()Ljava/util/Iterator;
java/util/Collections#emptyListIterator()Ljava/util/ListIterator;
java/util/List#copyOf(Ljava/util/Collection;)Ljava/util/List;
java/util/List#of()Ljava/util/List;
java/util/List#of(Ljava/lang/Object;)Ljava/util/List;
java/util/List#of(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;
java/util/List#of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;
java/util/List#of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;
java/util/List#of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;
java/util/List#of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;
java/util/List#of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;
java/util/List#of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;
java/util/List#of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;
java/util/List#of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/List;
java/util/List#of([Ljava/lang/Object;)Ljava/util/List;
java/util/Map#copyOf(Ljava/util/Map;)Ljava/util/Map;
java/util/Map#entry(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map$Entry;
java/util/Map#of()Ljava/util/Map;
java/util/Map#of(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;
java/util/Map#of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;
java/util/Map#of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;
java/util/Map#of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;
java/util/Map#of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;
java/util/Map#of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;
java/util/Map#of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;
java/util/Map#of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;
java/util/Map#of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;
java/util/Map#of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;
java/util/Map#ofEntries([Ljava/util/Map$Entry;)Ljava/util/Map;
java/util/Objects#checkFromIndexSize(III)I
java/util/Objects#checkFromToIndex(III)I
java/util/Objects#checkIndex(II)I
java/util/Objects#compare(Ljava/lang/Object;Ljava/lang/Object;Ljava/util/Comparator;)I
java/util/Objects#deepEquals(Ljava/lang/Object;Ljava/lang/Object;)Z
java/util/Objects#equals(Ljava/lang/Object;Ljava/lang/Object;)Z
java/util/Objects#hash([Ljava/lang/Object;)I
java/util/Objects#hashCode(Ljava/lang/Object;)I
java/util/Objects#isNull(Ljava/lang/Object;)Z
java/util/Objects#nonNull(Ljava/lang/Object;)Z
java/util/Objects#requireNonNull(Ljava/lang/Object;)Ljava/lang/Object;
java/util/Objects#requireNonNull(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;
java/util/Objects#requireNonNullElse(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
java/util/Objects#requireNonNullElseGet(Ljava/lang/Object;Ljava/util/function/Supplier;)Ljava/lang/Object;
java/util/Objects#toString(Ljava/lang/Object;)Ljava/lang/String;
java/util/Objects#toString(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/String;
java/util/Set#copyOf(Ljava/util/Collection;)Ljava/util/Set;
java/util/Set#of()Ljava/util/Set;
java/util/Set#of(Ljava/lang/Object;)Ljava/util/Set;
java/util/Set#of(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Set;
java/util/Set#of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Set;
java/util/Set#of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Set;
java/util/Set#of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Set;
java/util/Set#of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Set;
java/util/Set#of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Set;
java/util/Set#of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Set;
java/util/Set#of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Set;
java/util/Set#of(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Set;
java/util/Set#of([Ljava/lang/Object;)Ljava/util/Set;
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment