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, ...@@ -110,6 +110,31 @@ def _GenerateProjectFile(android_manifest,
return project 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, def _GenerateAndroidManifest(original_manifest_path, extra_manifest_paths,
min_sdk_version, android_sdk_version): min_sdk_version, android_sdk_version):
# Set minSdkVersion in the manifest to the correct value. # Set minSdkVersion in the manifest to the correct value.
...@@ -141,6 +166,7 @@ def _GenerateAndroidManifest(original_manifest_path, extra_manifest_paths, ...@@ -141,6 +166,7 @@ def _GenerateAndroidManifest(original_manifest_path, extra_manifest_paths,
def _WriteXmlFile(root, path): def _WriteXmlFile(root, path):
logging.info('Writing xml file %s', path)
build_utils.MakeDirectory(os.path.dirname(path)) build_utils.MakeDirectory(os.path.dirname(path))
with build_utils.AtomicOutput(path) as f: with build_utils.AtomicOutput(path) as f:
# Although we can write it just with ElementTree.tostring, using minidom # Although we can write it just with ElementTree.tostring, using minidom
...@@ -162,6 +188,7 @@ def _CheckLintWarning(expected_warnings, lint_output): ...@@ -162,6 +188,7 @@ def _CheckLintWarning(expected_warnings, lint_output):
def _RunLint(lint_binary_path, def _RunLint(lint_binary_path,
backported_methods_path,
config_path, config_path,
manifest_path, manifest_path,
extra_manifest_paths, extra_manifest_paths,
...@@ -189,8 +216,6 @@ def _RunLint(lint_binary_path, ...@@ -189,8 +216,6 @@ def _RunLint(lint_binary_path,
] ]
if baseline: if baseline:
cmd.extend(['--baseline', baseline]) cmd.extend(['--baseline', baseline])
if config_path:
cmd.extend(['--config', config_path])
if testonly_target: if testonly_target:
cmd.extend(['--disable', ','.join(_DISABLED_FOR_TESTS)]) cmd.extend(['--disable', ','.join(_DISABLED_FOR_TESTS)])
...@@ -198,6 +223,13 @@ def _RunLint(lint_binary_path, ...@@ -198,6 +223,13 @@ def _RunLint(lint_binary_path,
manifest_path = os.path.join(build_utils.DIR_SOURCE_ROOT, 'build', manifest_path = os.path.join(build_utils.DIR_SOURCE_ROOT, 'build',
'android', 'AndroidManifest.xml') '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') logging.info('Generating Android manifest file')
android_manifest_tree = _GenerateAndroidManifest(manifest_path, android_manifest_tree = _GenerateAndroidManifest(manifest_path,
extra_manifest_paths, extra_manifest_paths,
...@@ -206,7 +238,6 @@ def _RunLint(lint_binary_path, ...@@ -206,7 +238,6 @@ def _RunLint(lint_binary_path,
# Include the rebased manifest_path in the lint generated path so that it is # 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. # clear in error messages where the original AndroidManifest.xml came from.
lint_android_manifest_path = os.path.join(lint_gen_dir, manifest_path) 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) _WriteXmlFile(android_manifest_tree.getroot(), lint_android_manifest_path)
resource_root_dir = os.path.join(lint_gen_dir, _RES_ZIP_DIR) resource_root_dir = os.path.join(lint_gen_dir, _RES_ZIP_DIR)
...@@ -244,7 +275,6 @@ def _RunLint(lint_binary_path, ...@@ -244,7 +275,6 @@ def _RunLint(lint_binary_path,
android_sdk_version) android_sdk_version)
project_xml_path = os.path.join(lint_gen_dir, 'project.xml') 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) _WriteXmlFile(project_file_root, project_xml_path)
cmd += ['--project', project_xml_path] cmd += ['--project', project_xml_path]
...@@ -308,6 +338,8 @@ def _ParseArgs(argv): ...@@ -308,6 +338,8 @@ def _ParseArgs(argv):
parser.add_argument('--lint-binary-path', parser.add_argument('--lint-binary-path',
required=True, required=True,
help='Path to lint executable.') help='Path to lint executable.')
parser.add_argument('--backported-methods',
help='Path to backported methods file created by R8.')
parser.add_argument('--cache-dir', parser.add_argument('--cache-dir',
required=True, required=True,
help='Path to the directory in which the android cache ' help='Path to the directory in which the android cache '
...@@ -391,6 +423,7 @@ def main(): ...@@ -391,6 +423,7 @@ def main():
depfile_deps = [p for p in possible_depfile_deps if p] depfile_deps = [p for p in possible_depfile_deps if p]
_RunLint(args.lint_binary_path, _RunLint(args.lint_binary_path,
args.backported_methods,
args.config_path, args.config_path,
args.manifest_path, args.manifest_path,
args.extra_manifest_paths, args.extra_manifest_paths,
......
...@@ -1027,10 +1027,14 @@ if (enable_java_templates) { ...@@ -1027,10 +1027,14 @@ if (enable_java_templates) {
# Save generated xml files in a consistent location for debugging. # Save generated xml files in a consistent location for debugging.
_lint_gen_dir = "$target_gen_dir/$target_name" _lint_gen_dir = "$target_gen_dir/$target_name"
_backported_methods = "//third_party/r8/backported_methods.txt"
script = "//build/android/gyp/lint.py" script = "//build/android/gyp/lint.py"
depfile = "$target_gen_dir/$target_name.d" depfile = "$target_gen_dir/$target_name.d"
inputs = [ _lint_binary_path ] inputs = [
_lint_binary_path,
_backported_methods,
]
args = [ args = [
"--depfile", "--depfile",
...@@ -1045,6 +1049,8 @@ if (enable_java_templates) { ...@@ -1045,6 +1049,8 @@ if (enable_java_templates) {
"--min-sdk-version=$_min_sdk_version", "--min-sdk-version=$_min_sdk_version",
"--android-sdk-root", "--android-sdk-root",
rebase_path(lint_android_sdk_root, root_build_dir), rebase_path(lint_android_sdk_root, root_build_dir),
"--backported-methods",
rebase_path(_backported_methods, root_build_dir),
] ]
if (defined(invoker.lint_suppressions_file)) { if (defined(invoker.lint_suppressions_file)) {
......
...@@ -51,6 +51,9 @@ git format-patch -3 -o $CHROMIUM_SRC/third_party/r8/patches ...@@ -51,6 +51,9 @@ git format-patch -3 -o $CHROMIUM_SRC/third_party/r8/patches
cd $CHROMIUM_SRC/third_party/r8 cd $CHROMIUM_SRC/third_party/r8
cipd create --pkg-def cipd.yaml # Make note of the instance ID 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: # Manually update:
* README.chromium (version number via "java -cp lib/r8.jar com.android.tools.r8.R8 --version") * README.chromium (version number via "java -cp lib/r8.jar com.android.tools.r8.R8 --version")
* //DEPS (instance ID output by cipd create) * //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